3 Commits

Author SHA1 Message Date
Rafał Dzięgiel
eb2e760de2 clapper-gtk: video: Fix checks when inhibiting session 2025-04-26 23:12:40 +02:00
Rafał Dzięgiel
d3a169fccd clapper-gtk: video: Fix sink property type checks
Sometimes property might return a subclass type when object is subclassed.
This especially happens with custom GdkPaintable implementations.
For this reason instead of comparing object type, check if it inherits what we want.
2025-01-22 20:27:02 +01:00
Rafał Dzięgiel
0cee4e90a5 clapper: server: Fix missing include of <sys/socket.h>
We need it for "AF_INET" symbols. Otherwise build fails on some systems.
2025-01-21 22:53:47 +01:00
261 changed files with 3102 additions and 10962 deletions

View File

@@ -6,32 +6,32 @@ name: "Flatpak Nightly"
jobs:
flatpak:
name: "Flatpak"
runs-on: ubuntu-latest
timeout-minutes: 600
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-nightly
options: --privileged
strategy:
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm]
include:
- os: ubuntu-24.04
arch: x86_64
- os: ubuntu-24.04-arm
arch: aarch64
arch: [x86_64, aarch64]
fail-fast: false
runs-on: ${{ matrix.os }}
container:
image: registry.fedoraproject.org/fedora
options: --privileged
steps:
- name: Prepare
run: |
dnf install -y git git-lfs dbus-daemon flatpak flatpak-builder libappstream-glib ccache zstd xorg-x11-server-Xvfb
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.rust-stable/${{ matrix.arch }}/24.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.llvm18/${{ matrix.arch }}/24.08
flatpak --system install -y --noninteractive flathub org.flatpak.Builder
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Docker
run: |
dnf -y install docker
- name: Setup QEMU
id: qemu
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Prepare Runtime
run: |
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.rust-stable/${{ matrix.arch }}/24.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.llvm18/${{ matrix.arch }}/24.08
- name: Build
uses: flatpak/flatpak-github-actions/flatpak-builder@master
with:

View File

@@ -10,29 +10,28 @@ name: "Flatpak"
jobs:
flatpak:
name: "Flatpak"
runs-on: ubuntu-latest
timeout-minutes: 600
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-47
options: --privileged
strategy:
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm]
include:
- os: ubuntu-24.04
arch: x86_64
- os: ubuntu-24.04-arm
arch: aarch64
arch: [x86_64, aarch64]
fail-fast: false
runs-on: ${{ matrix.os }}
container:
image: registry.fedoraproject.org/fedora
options: --privileged
steps:
- name: Prepare
run: |
dnf install -y git git-lfs dbus-daemon flatpak flatpak-builder libappstream-glib ccache zstd xorg-x11-server-Xvfb
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak --system install -y --noninteractive flathub org.flatpak.Builder
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Docker
run: |
dnf -y install docker
- name: Setup QEMU
id: qemu
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Build
uses: flatpak/flatpak-github-actions/flatpak-builder@master
with:

View File

@@ -2,7 +2,7 @@
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
<https://fsf.org/>
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
@@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -158,7 +158,7 @@ Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
@@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
@@ -267,7 +267,7 @@ Library will still fall under Section 6.)
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
@@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
@@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
@@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
@@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
@@ -484,7 +484,9 @@ convey the exclusion of warranty; and each file should have at least the
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <https://www.gnu.org/licenses/>.
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
Also add information on how to contact you by electronic and paper mail.
@@ -493,9 +495,10 @@ school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
library `Frob' (a library for tweaking knobs) written by James Random
Hacker.
<signature of Moe Ghoul>, 1 April 1990
Moe Ghoul, President of Vice
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View File

@@ -1,49 +0,0 @@
#!/usr/bin/env python3
import gi
gi.require_version('Adw', '1')
gi.require_version('Clapper', '0.0')
gi.require_version('ClapperGtk', '0.0')
gi.require_version('Gtk', '4.0')
from gi.repository import Adw, Clapper, ClapperGtk, Gtk
Clapper.init(None)
def on_activate(app):
# Create our widgets.
win = Gtk.ApplicationWindow(application=app, title='Clapper Audio', default_width=640, default_height=96)
audio = ClapperGtk.Audio()
box = Gtk.Box(valign=Gtk.Align.CENTER, margin_start=8, margin_end=8, spacing=4)
prev_btn = ClapperGtk.PreviousItemButton()
play_btn = ClapperGtk.TogglePlayButton()
next_btn = ClapperGtk.NextItemButton()
seek_bar = ClapperGtk.SeekBar()
# Add media for playback. First media item in queue will be automatically selected.
item = Clapper.MediaItem(uri='https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3')
audio.props.player.props.queue.add_item(item)
item = Clapper.MediaItem(uri='https://www.learningcontainer.com/wp-content/uploads/2020/02/Kalimba.mp3')
audio.props.player.props.queue.add_item(item)
# Assemble window.
box.append(prev_btn)
box.append(play_btn)
box.append(next_btn)
box.append(seek_bar)
audio.set_child(box)
win.set_child(audio)
win.present()
# Not too loud. Mind the ears.
audio.props.player.props.volume = 0.7
# Start playback.
audio.props.player.play()
# Create a new application.
app = Adw.Application(application_id='com.example.ClapperAudio')
app.connect('activate', on_activate)
# Run the application.
app.run(None)

View File

@@ -1,5 +1,5 @@
project('clapper', 'c',
version: '0.9.1',
version: '0.8.0',
meson_version: '>= 0.64.0',
license: 'LGPL-2.1-or-later AND GPL-3.0-or-later', # LGPL-2.1+ for libs and gst-plugin, GPL-3.0+ for app
default_options: [
@@ -11,7 +11,7 @@ project('clapper', 'c',
glib_req = '>= 2.76.0'
gst_req = '>= 1.24.0'
gtk4_req = '>= 4.10.0'
adw_req = '>= 1.5.0'
adw_req = '>= 1.4.0'
clapper_version = meson.project_version().split('-')[0]
version_array = clapper_version.split('.')
@@ -89,12 +89,6 @@ libadwaita_dep = dependency('libadwaita-1',
peas_dep = dependency('libpeas-2',
required: false,
)
cgraph_dep = dependency('libcgraph',
required: false,
)
gvc_dep = dependency('libgvc',
required: false,
)
cc = meson.get_compiler('c')
libm = cc.find_library('m', required: false)
@@ -166,8 +160,3 @@ if build_clapper
summary(name, clapper_available_features.contains(name) ? 'Yes' : 'No', section: 'Features')
endforeach
endif
if build_clapperapp
foreach name : clapperapp_possible_functionalities
summary(name, clapperapp_available_functionalities.contains(name) ? 'Yes' : 'No', section: 'Functionalities')
endforeach
endif

View File

@@ -41,11 +41,6 @@ option('enhancers-loader',
value: 'enabled',
description: 'Ability to load libpeas based plugins that enhance capabilities'
)
option('pipeline-preview',
type: 'feature',
value: 'auto',
description: 'Ability to preview GStreamer pipeline in clapper-app'
)
# Features
option('discoverer',

View File

@@ -14,13 +14,6 @@
"add-ld-path": ".",
"no-autodownload": false,
"autodelete": false
},
"com.github.rafostar.Clapper.Enhancers": {
"versions": "master;test;stable",
"directory": "extensions/clapper/enhancers",
"add-ld-path": "lib",
"no-autodownload": false,
"autodelete": false
}
},
"command": "clapper",
@@ -38,9 +31,7 @@
"--filesystem=xdg-run/gvfsd",
"--own-name=org.mpris.MediaPlayer2.Clapper.*",
"--talk-name=org.gtk.vfs.*",
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0",
"--env=CLAPPER_ENHANCERS_PATH=/app/extensions/clapper/enhancers/plugins",
"--env=PYTHONPATH=/app/extensions/clapper/enhancers/python/site-packages"
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0"
],
"build-options": {
"append-path": "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm18/bin",
@@ -62,11 +53,11 @@
"flathub/lib/libdvdnav.json",
"flathub/lib/libass.json",
"flathub/lib/libmicrodns.json",
"flathub/lib/libpeas.json",
"testing/dav1d.json",
"testing/gstreamer.json",
"testing/gst-plugins-rs.json",
"testing/graphviz.json",
"testing/yt-dlp.json",
"testing/libpeas.json",
{
"name": "clapper",
"buildsystem": "meson",
@@ -76,11 +67,11 @@
"path": "../../."
}
]
}
},
"testing/clapper-enhancers.json"
],
"cleanup-commands": [
"mkdir -p /app/lib/ffmpeg",
"mkdir -p /app/extensions/clapper/enhancers",
"ln -s /lib/$FLATPAK_ARCH-linux-*/gstreamer-1.0/libgstpipewire.so /app/lib/gstreamer-1.0/"
]
}

View File

@@ -10,13 +10,6 @@
"add-ld-path": ".",
"no-autodownload": false,
"autodelete": false
},
"com.github.rafostar.Clapper.Enhancers": {
"versions": "master;test;stable",
"directory": "extensions/clapper/enhancers",
"add-ld-path": "lib",
"no-autodownload": false,
"autodelete": false
}
},
"command": "clapper",
@@ -34,9 +27,7 @@
"--filesystem=xdg-run/gvfsd",
"--own-name=org.mpris.MediaPlayer2.Clapper.*",
"--talk-name=org.gtk.vfs.*",
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0",
"--env=CLAPPER_ENHANCERS_PATH=/app/extensions/clapper/enhancers/plugins",
"--env=PYTHONPATH=/app/extensions/clapper/enhancers/python/site-packages"
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0"
],
"modules": [
"flathub/shared-modules/gudev/gudev.json",
@@ -49,9 +40,9 @@
"flathub/lib/libass.json",
"flathub/lib/uchardet.json",
"flathub/lib/libmicrodns.json",
"flathub/lib/libpeas.json",
"flathub/gstreamer-1.0/gstreamer.json",
"testing/graphviz.json",
"testing/gstreamer_stable.json",
"testing/yt-dlp.json",
"testing/libpeas.json",
{
"name": "clapper",
"buildsystem": "meson",
@@ -61,11 +52,11 @@
"path": "../../."
}
]
}
},
"testing/clapper-enhancers.json"
],
"cleanup-commands": [
"mkdir -p /app/lib/ffmpeg",
"mkdir -p /app/extensions/clapper/enhancers",
"ln -s /lib/$FLATPAK_ARCH-linux-*/gstreamer-1.0/libgstpipewire.so /app/lib/gstreamer-1.0/"
]
}

View File

@@ -0,0 +1,14 @@
{
"name": "clapper-enhancers",
"buildsystem": "meson",
"config-opts": [
"-Dauto_features=enabled"
],
"sources": [
{
"type": "git",
"url": "https://github.com/Rafostar/clapper-enhancers.git",
"branch": "main"
}
]
}

View File

@@ -1,38 +0,0 @@
{
"name": "graphviz",
"buildsystem": "autotools",
"config-opts": [
"--without-x",
"--without-gtk",
"--without-gtkgl",
"--without-gtkglext",
"--without-gdk",
"--without-gdk-pixbuf",
"--without-qt",
"--disable-static",
"--disable-sharp",
"--disable-go",
"--disable-guile",
"--disable-java",
"--disable-javascript",
"--disable-lua",
"--disable-perl",
"--disable-php",
"--disable-python",
"--disable-r",
"--disable-ruby",
"--disable-tcl"
],
"cleanup": [
"/bin",
"/share/man",
"/share/graphviz"
],
"sources": [
{
"type": "archive",
"url": "https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/12.2.1/graphviz-12.2.1.tar.gz",
"sha256": "242bc18942eebda6db4039f108f387ec97856fc91ba47f21e89341c34b554df8"
}
]
}

View File

@@ -0,0 +1,99 @@
{
"name": "gstreamer",
"buildsystem": "meson",
"config-opts": [
"--buildtype=release",
"--wrap-mode=nodownload",
"-Dbase=enabled",
"-Dgood=enabled",
"-Dbad=enabled",
"-Dugly=enabled",
"-Dlibav=enabled",
"-Dvaapi=enabled",
"-Dsharp=disabled",
"-Drs=disabled",
"-Dpython=disabled",
"-Ddevtools=disabled",
"-Dges=disabled",
"-Drtsp_server=disabled",
"-Dgst-examples=disabled",
"-Dqt5=disabled",
"-Dtests=disabled",
"-Dexamples=disabled",
"-Dintrospection=enabled",
"-Ddoc=disabled",
"-Dgtk_doc=disabled",
"-Dgpl=enabled",
"-Dgstreamer:benchmarks=disabled",
"-Dgstreamer:gobject-cast-checks=disabled",
"-Dgstreamer:glib-asserts=disabled",
"-Dgstreamer:glib-checks=disabled",
"-Dgstreamer:extra-checks=disabled",
"-Dgst-plugins-base:gobject-cast-checks=disabled",
"-Dgst-plugins-base:glib-asserts=disabled",
"-Dgst-plugins-base:glib-checks=disabled",
"-Dgst-plugins-base:gl_api=opengl,gles2",
"-Dgst-plugins-base:gl_platform=egl,glx",
"-Dgst-plugins-good:gobject-cast-checks=disabled",
"-Dgst-plugins-good:glib-asserts=disabled",
"-Dgst-plugins-good:glib-checks=disabled",
"-Dgst-plugins-good:gtk3=disabled",
"-Dgst-plugins-bad:gobject-cast-checks=disabled",
"-Dgst-plugins-bad:glib-asserts=disabled",
"-Dgst-plugins-bad:glib-checks=disabled",
"-Dgst-plugins-bad:extra-checks=disabled",
"-Dgst-plugins-bad:vulkan=disabled",
"-Dgst-plugins-bad:webrtc=disabled",
"-Dgst-plugins-bad:wasapi=disabled",
"-Dgst-plugins-bad:wasapi2=disabled",
"-Dgst-plugins-bad:winks=disabled",
"-Dgst-plugins-bad:winscreencap=disabled",
"-Dgst-plugins-bad:assrender=enabled",
"-Dgst-plugins-bad:nvcodec=enabled",
"-Dgst-plugins-bad:v4l2codecs=enabled",
"-Dgst-plugins-bad:va=enabled",
"-Dgst-plugins-ugly:gobject-cast-checks=disabled",
"-Dgst-plugins-ugly:glib-asserts=disabled",
"-Dgst-plugins-ugly:glib-checks=disabled",
"-Dgst-plugins-ugly:mpeg2dec=enabled"
],
"sources": [
{
"type": "git",
"url": "https://gitlab.freedesktop.org/gstreamer/gstreamer.git",
"tag": "1.24.9",
"commit": "b309f90bfde36e6d175b70bfa0c941f2829dd6a5",
"disable-submodules": true
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-libav-stop-caching-codecs.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-base-autodetect-subtitle-text-encoding.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-good-matroska-fix-attachments-detection.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-good-dashdemux2-play-last-subfragment.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-bad-dashdemux-sidx-range-download.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-bad-dashdemux-improve-initial-representation-selection.patch"
}
]
}

View File

@@ -0,0 +1,19 @@
{
"name": "yt-dlp",
"buildsystem": "simple",
"build-commands": [
"pip3 install -v --root-user-action=ignore --no-deps --prefix=/app *.whl"
],
"sources": [
{
"type": "file",
"url": "https://files.pythonhosted.org/packages/bb/68/548f9819b41d53561d4f3d39588111cf39993c066b6e5300b4ae118eb2e6/yt_dlp-2024.10.22-py3-none-any.whl",
"sha256": "ba166602ebe22a220e4dc1ead45bf00eb469ed812b22f4fb8bb54734f9b02084",
"x-checker-data": {
"type": "pypi",
"name": "yt-dlp",
"packagetype": "bdist_wheel"
}
}
]
}

View File

@@ -22,24 +22,29 @@
#include <clapper/clapper.h>
#include <adwaita.h>
#include "clapper-app-about-dialog.h"
#include "clapper-app-about-window.h"
GtkWidget *
clapper_app_about_dialog_new (void)
clapper_app_about_window_new (GtkApplication *gtk_app)
{
AdwAboutDialog *about;
AdwAboutWindow *about;
GtkWindow *window;
GString *string;
gchar *gst_ver, *debug_info;
about = ADW_ABOUT_DIALOG (adw_about_dialog_new_from_appdata (
about = ADW_ABOUT_WINDOW (adw_about_window_new_from_appdata (
CLAPPER_APP_RESOURCE_PREFIX "/data/metainfo/" CLAPPER_APP_ID ".metainfo.xml",
NULL));
window = gtk_application_get_active_window (gtk_app);
gtk_window_set_modal (GTK_WINDOW (about), TRUE);
gtk_window_set_transient_for (GTK_WINDOW (about), window);
/* Also show development versions */
adw_about_dialog_set_version (about, CLAPPER_VERSION_S);
adw_about_window_set_version (about, CLAPPER_VERSION_S);
/* TRANSLATORS: Put your name(s) here for credits or leave untranslated */
adw_about_dialog_set_translator_credits (about, _("translator-credits"));
adw_about_window_set_translator_credits (about, _("translator-credits"));
string = g_string_new (NULL);
@@ -61,7 +66,7 @@ clapper_app_about_dialog_new (void)
g_free (gst_ver);
debug_info = g_string_free_and_steal (string);
adw_about_dialog_set_debug_info (about, debug_info);
adw_about_window_set_debug_info (about, debug_info);
g_free (debug_info);
return GTK_WIDGET (about);

View File

@@ -24,6 +24,6 @@
G_BEGIN_DECLS
G_GNUC_INTERNAL
GtkWidget * clapper_app_about_dialog_new (void);
GtkWidget * clapper_app_about_window_new (GtkApplication *gtk_app);
G_END_DECLS

View File

@@ -28,7 +28,7 @@
#include "clapper-app-uri-dialog.h"
#include "clapper-app-info-window.h"
#include "clapper-app-preferences-window.h"
#include "clapper-app-about-dialog.h"
#include "clapper-app-about-window.h"
#include "clapper-app-utils.h"
#define PERCENTAGE_ROUND(a) (round ((gdouble) a / 0.01) * 0.01)
@@ -41,7 +41,6 @@ struct _ClapperAppApplication
GtkApplication parent;
GSettings *settings;
GCancellable *cancellable;
gboolean need_init_state;
};
@@ -62,12 +61,6 @@ struct ClapperPluginData
struct ClapperPluginFeatureData features[10];
};
typedef struct
{
ClapperAppApplication *app;
guint id;
} ClapperAppWindowData;
typedef struct
{
const gchar *action;
@@ -324,19 +317,6 @@ _assemble_initial_state (GtkWindow *window)
g_object_unref (builder);
}
static void
_show_error_dialog (GError *error, GtkWindow *parent)
{
AdwDialog *dialog;
dialog = adw_alert_dialog_new ("Error", error->message);
adw_alert_dialog_add_response (ADW_ALERT_DIALOG (dialog), "close", _("Close"));
adw_alert_dialog_set_default_response (ADW_ALERT_DIALOG (dialog), "close");
adw_alert_dialog_set_close_response (ADW_ALERT_DIALOG (dialog), "close");
adw_dialog_present (dialog, GTK_WIDGET (parent));
}
static void
add_files (GSimpleAction *action, GVariant *param, gpointer user_data)
{
@@ -415,112 +395,14 @@ show_info (GSimpleAction *action, GVariant *param, gpointer user_data)
gtk_window_present (GTK_WINDOW (info_window));
}
static void
_launch_pipeline_cb (GtkFileLauncher *launcher,
GAsyncResult *res, ClapperAppWindowData *win_data)
{
GError *error = NULL;
if (!gtk_file_launcher_launch_finish (launcher, res, &error)) {
if (error->domain != GTK_DIALOG_ERROR || error->code != GTK_DIALOG_ERROR_DISMISSED) {
GtkWindow *window;
GST_ERROR ("Could not launch pipeline preview, reason: %s",
GST_STR_NULL (error->message));
if ((window = gtk_application_get_window_by_id (
GTK_APPLICATION (win_data->app), win_data->id)))
_show_error_dialog (error, window);
}
g_error_free (error);
}
g_free (win_data);
}
static void
_show_pipeline_cb (GObject *source G_GNUC_UNUSED,
GAsyncResult *res, ClapperAppWindowData *win_data)
{
GTask *task = G_TASK (res);
GtkWindow *window;
GFile *svg_file;
GError *error = NULL;
svg_file = (GFile *) g_task_propagate_pointer (task, &error);
window = gtk_application_get_window_by_id (
GTK_APPLICATION (win_data->app), win_data->id);
if (error) {
if (error->domain != G_IO_ERROR || error->code != G_IO_ERROR_CANCELLED) {
GST_ERROR ("Could not create pipeline graph file, reason: %s",
GST_STR_NULL (error->message));
if (window)
_show_error_dialog (error, window);
}
g_error_free (error);
g_free (win_data);
return;
}
if (window) {
GtkFileLauncher *launcher = gtk_file_launcher_new (svg_file);
#if GTK_CHECK_VERSION(4,12,0)
gtk_file_launcher_set_always_ask (launcher, TRUE);
#endif
gtk_file_launcher_launch (launcher, window, NULL,
(GAsyncReadyCallback) _launch_pipeline_cb, win_data);
g_object_unref (launcher);
} else {
g_free (win_data);
}
g_object_unref (svg_file);
}
static void
show_pipeline (GSimpleAction *action, GVariant *param, gpointer user_data)
{
ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (user_data);
GtkApplication *gtk_app = GTK_APPLICATION (self);
GtkWindow *window;
ClapperAppWindowData *win_data;
window = gtk_application_get_active_window (gtk_app);
while (window && !CLAPPER_APP_IS_WINDOW (window))
window = gtk_window_get_transient_for (window);
if (G_UNLIKELY (window == NULL))
return;
if (self->cancellable) {
g_cancellable_cancel (self->cancellable);
g_object_unref (self->cancellable);
}
self->cancellable = g_cancellable_new ();
win_data = g_new (ClapperAppWindowData, 1);
win_data->app = self;
win_data->id = gtk_application_window_get_id (GTK_APPLICATION_WINDOW (window));
clapper_app_utils_create_pipeline_svg_file_async (
clapper_app_window_get_player (CLAPPER_APP_WINDOW (window)),
self->cancellable, (GAsyncReadyCallback) _show_pipeline_cb, win_data);
}
static void
show_about (GSimpleAction *action, GVariant *param, gpointer user_data)
{
GtkApplication *gtk_app = GTK_APPLICATION (user_data);
GtkWindow *window;
GtkWidget *about_dialog;
GtkWidget *about_window;
window = gtk_application_get_active_window (gtk_app);
about_dialog = clapper_app_about_dialog_new ();
adw_dialog_present (ADW_DIALOG (about_dialog), GTK_WIDGET (window));
about_window = clapper_app_about_window_new (gtk_app);
gtk_window_present (GTK_WINDOW (about_window));
}
GApplication *
@@ -642,6 +524,18 @@ clapper_app_application_command_line (GApplication *app, GApplicationCommandLine
return EXIT_SUCCESS;
}
static gboolean
_is_claps_file (GFile *file)
{
gchar *basename = g_file_get_basename (file);
gboolean is_claps;
is_claps = (basename && g_str_has_suffix (basename, ".claps"));
g_free (basename);
return is_claps;
}
static void
add_item_from_file (GFile *file, ClapperQueue *queue)
{
@@ -654,6 +548,51 @@ add_item_from_file (GFile *file, ClapperQueue *queue)
gst_object_unref (item);
}
static void
add_items_from_claps_file (GFile *file, ClapperQueue *queue)
{
GDataInputStream *dstream = NULL;
GFileInputStream *stream;
GError *error = NULL;
gchar *line;
if (!(stream = g_file_read (file, NULL, &error)))
goto finish;
dstream = g_data_input_stream_new (G_INPUT_STREAM (stream));
while ((line = g_data_input_stream_read_line (
dstream, NULL, NULL, &error))) {
g_strstrip (line);
if (strlen (line) > 0) {
GFile *tmp_file = gst_uri_is_valid (line)
? g_file_new_for_uri (line)
: g_file_new_for_path (line);
if (_is_claps_file (tmp_file))
add_items_from_claps_file (tmp_file, queue);
else
add_item_from_file (tmp_file, queue);
g_object_unref (tmp_file);
}
g_free (line);
}
finish:
if (error) {
GST_ERROR ("Could not read \".claps\" file, reason: %s", error->message);
g_error_free (error);
}
if (stream) {
g_input_stream_close (G_INPUT_STREAM (stream), NULL, NULL);
g_object_unref (stream);
}
g_clear_object (&dstream);
}
static void
add_item_with_subtitles (GFile *media_file,
GFile *subs_file, ClapperQueue *queue)
@@ -722,8 +661,12 @@ clapper_app_application_open (GApplication *app,
if (!handled) {
gint i;
for (i = 0; i < n_files; ++i)
add_item_from_file (files[i], queue);
for (i = 0; i < n_files; ++i) {
if (_is_claps_file (files[i]))
add_items_from_claps_file (files[i], queue);
else
add_item_from_file (files[i], queue);
}
}
add_only = (g_strcmp0 (hint, "add-only") == 0);
@@ -769,7 +712,6 @@ clapper_app_application_constructed (GObject *object)
{ "clear-queue", clear_queue, NULL, NULL, NULL },
{ "new-window", new_window, NULL, NULL, NULL },
{ "info", show_info, NULL, NULL, NULL },
{ "pipeline", show_pipeline, NULL, NULL, NULL },
{ "preferences", show_preferences, NULL, NULL, NULL },
{ "about", show_about, NULL, NULL, NULL },
};
@@ -778,7 +720,6 @@ clapper_app_application_constructed (GObject *object)
{ "app.add-uri", { "<Control>u", NULL, NULL }},
{ "app.new-window", { "<Control>n", NULL, NULL }},
{ "app.info", { "<Control>i", NULL, NULL }},
{ "app.pipeline", { "<Control><Shift>p", NULL, NULL }},
{ "app.preferences", { "<Control>comma", NULL, NULL }},
{ "app.about", { "F1", NULL, NULL }},
{ "win.toggle-fullscreen", { "F11", "f", NULL }},
@@ -813,19 +754,6 @@ clapper_app_application_constructed (GObject *object)
G_OBJECT_CLASS (parent_class)->constructed (object);
}
static void
clapper_app_application_dispose (GObject *object)
{
ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (object);
if (self->cancellable) {
g_cancellable_cancel (self->cancellable);
g_clear_object (&self->cancellable);
}
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
clapper_app_application_finalize (GObject *object)
{
@@ -849,7 +777,6 @@ clapper_app_application_class_init (ClapperAppApplicationClass *klass)
"Clapper App Application");
gobject_class->constructed = clapper_app_application_constructed;
gobject_class->dispose = clapper_app_application_dispose;
gobject_class->finalize = clapper_app_application_finalize;
gtk_application_class->window_removed = clapper_app_application_window_removed;

View File

@@ -19,7 +19,6 @@
#include <glib.h>
#include <glib-object.h>
#include <gio/gio.h>
#include <gtk/gtk.h>
G_BEGIN_DECLS

View File

@@ -72,43 +72,6 @@ _open_subtitles_cb (GtkFileDialog *dialog, GAsyncResult *result, ClapperMediaIte
gst_object_unref (item); // Borrowed reference
}
static void
_on_select_file_dir_finish (GFile *file, AdwActionRow *action_row, GError *error)
{
if (G_LIKELY (error == NULL)) {
gchar *path = g_file_get_path (file);
adw_action_row_set_subtitle (action_row, path);
g_free (path);
} else {
if (error->domain != GTK_DIALOG_ERROR || error->code != GTK_DIALOG_ERROR_DISMISSED) {
g_printerr ("Error: %s\n",
(error->message) ? error->message : "Could not open file dialog");
}
g_error_free (error);
}
g_clear_object (&file);
g_object_unref (action_row); // Borrowed reference
}
static void
_select_file_cb (GtkFileDialog *dialog, GAsyncResult *result, AdwActionRow *action_row)
{
GError *error = NULL;
GFile *file = gtk_file_dialog_open_finish (dialog, result, &error);
_on_select_file_dir_finish (file, action_row, error);
}
static void
_select_dir_cb (GtkFileDialog *dialog, GAsyncResult *result, AdwActionRow *action_row)
{
GError *error = NULL;
GFile *file = gtk_file_dialog_select_folder_finish (dialog, result, &error);
_on_select_file_dir_finish (file, action_row, error);
}
static void
_dialog_add_mime_types (GtkFileDialog *dialog, const gchar *filter_name,
const gchar *const *mime_types)
@@ -181,35 +144,3 @@ clapper_app_file_dialog_open_subtitles (GtkApplication *gtk_app, ClapperMediaIte
g_object_unref (dialog);
}
void
clapper_app_file_dialog_select_prefs_file (GtkApplication *gtk_app, AdwActionRow *action_row)
{
GtkWindow *window = gtk_application_get_active_window (gtk_app);
GtkFileDialog *dialog = gtk_file_dialog_new ();
gtk_file_dialog_set_modal (dialog, TRUE);
gtk_file_dialog_set_title (dialog, "Select File");
gtk_file_dialog_open (dialog, window, NULL,
(GAsyncReadyCallback) _select_file_cb,
g_object_ref (action_row));
g_object_unref (dialog);
}
void
clapper_app_file_dialog_select_prefs_dir (GtkApplication *gtk_app, AdwActionRow *action_row)
{
GtkWindow *window = gtk_application_get_active_window (gtk_app);
GtkFileDialog *dialog = gtk_file_dialog_new ();
gtk_file_dialog_set_modal (dialog, TRUE);
gtk_file_dialog_set_title (dialog, "Select Folder");
gtk_file_dialog_select_folder (dialog, window, NULL,
(GAsyncReadyCallback) _select_dir_cb,
g_object_ref (action_row));
g_object_unref (dialog);
}

View File

@@ -19,7 +19,6 @@
#include <glib.h>
#include <gtk/gtk.h>
#include <adwaita.h>
#include <clapper/clapper.h>
G_BEGIN_DECLS
@@ -30,10 +29,4 @@ void clapper_app_file_dialog_open_files (GtkApplication *gtk_app);
G_GNUC_INTERNAL
void clapper_app_file_dialog_open_subtitles (GtkApplication *gtk_app, ClapperMediaItem *item);
G_GNUC_INTERNAL
void clapper_app_file_dialog_select_prefs_file (GtkApplication *gtk_app, AdwActionRow *action_row);
G_GNUC_INTERNAL
void clapper_app_file_dialog_select_prefs_dir (GtkApplication *gtk_app, AdwActionRow *action_row);
G_END_DECLS

View File

@@ -36,8 +36,6 @@ struct _ClapperAppInfoWindow
GtkWidget *astreams_list;
GtkWidget *sstreams_list;
GtkWidget *pipeline_button;
ClapperPlayer *player;
};
@@ -176,10 +174,6 @@ clapper_app_info_window_init (ClapperAppInfoWindow *self)
gtk_widget_remove_css_class (self->vstreams_list, "view");
gtk_widget_remove_css_class (self->astreams_list, "view");
gtk_widget_remove_css_class (self->sstreams_list, "view");
#ifdef HAVE_GRAPHVIZ
gtk_widget_set_visible (self->pipeline_button, TRUE);
#endif
}
static void
@@ -262,7 +256,6 @@ clapper_app_info_window_class_init (ClapperAppInfoWindowClass *klass)
gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, vstreams_list);
gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, astreams_list);
gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, sstreams_list);
gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, pipeline_button);
gtk_widget_class_bind_template_callback (widget_class, media_duration_closure);
gtk_widget_class_bind_template_callback (widget_class, playback_element_name_closure);

View File

@@ -23,7 +23,6 @@
#include "clapper-app-preferences-window.h"
#include "clapper-app-application.h"
#include "clapper-app-file-dialog.h"
#include "clapper-app-utils.h"
#define GST_CAT_DEFAULT clapper_app_preferences_window_debug
@@ -42,14 +41,6 @@ struct _ClapperAppPreferencesWindow
AdwSpinRow *subtitle_offset_spin_row;
GtkFontDialogButton *font_dialog_button;
GtkStack *enhancers_stack;
GtkWidget *browse_enhancers_page;
GtkWidget *no_enhancers_page;
AdwNavigationPage *enhancers_subpage;
AdwComboRow *enhancers_combo_row;
AdwPreferencesGroup *enhancer_config_group;
AdwNavigationPage *plugins_subpage;
AdwComboRow *plugins_combo_row;
AdwComboRow *features_combo_row;
@@ -57,8 +48,6 @@ struct _ClapperAppPreferencesWindow
GSettings *settings;
GList *enhancer_pspec_rows;
GList *features;
GtkStringList *plugins_list;
@@ -78,19 +67,6 @@ typedef struct
gboolean updated;
} ClapperAppPreferencesIterRanksData;
typedef struct
{
GSettings *settings;
const gchar *key;
} ClapperAppPreferencesResetData;
typedef struct
{
GSettings *settings;
GParamSpec *pspec;
guint flag;
} ClapperAppPreferencesFlagMapData;
enum
{
PROP_0,
@@ -100,347 +76,6 @@ enum
static GParamSpec *param_specs[PROP_LAST] = { NULL, };
static void
_flag_map_data_free (ClapperAppPreferencesFlagMapData *data)
{
GST_TRACE ("Destroying flag map data: %p", data);
g_object_unref (data->settings);
g_free (data);
}
static void
_reset_button_closure (ClapperAppPreferencesResetData *data, GClosure *closure)
{
GST_TRACE ("Destroying reset button data: %p", data);
g_object_unref (data->settings);
g_free (data);
}
static void
_reset_button_clicked_cb (GtkButton *button, ClapperAppPreferencesResetData *data)
{
g_settings_reset (data->settings, data->key);
}
static void
file_selection_row_activated_cb (AdwActionRow *action_row, GParamSpec *pspec)
{
GtkApplication *gtk_app;
GtkWidget *window;
if (!(window = gtk_widget_get_ancestor (GTK_WIDGET (action_row), GTK_TYPE_WINDOW))) {
GST_ERROR ("Could not get a hold of parent window");
return;
}
gtk_app = gtk_window_get_application (GTK_WINDOW (window));
if (pspec->flags & CLAPPER_ENHANCER_PARAM_FILEPATH)
clapper_app_file_dialog_select_prefs_file (gtk_app, action_row);
else
clapper_app_file_dialog_select_prefs_dir (gtk_app, action_row);
}
static gboolean
_get_enum_mapping (GValue *value, GVariant *variant, GParamSpec *pspec)
{
GEnumClass *enum_class = G_ENUM_CLASS (g_type_class_peek (pspec->value_type));
const gchar *selected_str = g_variant_get_string (variant, NULL);
guint i, selected = 0;
for (i = 0; i < enum_class->n_values; ++i) {
if (g_strcmp0 (selected_str, enum_class->values[i].value_nick) == 0) {
selected = i;
break;
}
}
g_value_set_uint (value, selected);
return TRUE;
}
static GVariant *
_set_enum_mapping (GValue *value, GVariantType *exp_type, GParamSpec *pspec)
{
GEnumClass *enum_class = G_ENUM_CLASS (g_type_class_peek (pspec->value_type));
guint selected = g_value_get_uint (value);
if (G_UNLIKELY (selected == GTK_INVALID_LIST_POSITION))
selected = 0;
return g_variant_new_string (enum_class->values[selected].value_nick);
}
static gboolean
_get_flag_mapping (GValue *value, GVariant *variant, ClapperAppPreferencesFlagMapData *data)
{
guint flags = g_settings_get_flags (data->settings, data->pspec->name);
g_value_set_boolean (value, (flags & data->flag));
return TRUE;
}
static GVariant *
_set_flag_mapping (GValue *value, GVariantType *exp_type, ClapperAppPreferencesFlagMapData *data)
{
GFlagsClass *flags_class = G_FLAGS_CLASS (g_type_class_peek (data->pspec->value_type));
GStrvBuilder *builder;
GVariant *variant;
gchar **strv;
gboolean active = g_value_get_boolean (value);
guint i, flags = g_settings_get_flags (data->settings, data->pspec->name);
if (active)
flags |= data->flag;
else
flags &= ~(data->flag);
builder = g_strv_builder_new ();
for (i = 0; i < flags_class->n_values; ++i) {
if (flags & flags_class->values[i].value)
g_strv_builder_add (builder, flags_class->values[i].value_nick);
}
strv = g_strv_builder_end (builder);
g_strv_builder_unref (builder);
variant = g_variant_new_strv ((const gchar *const *) strv, -1);
g_strfreev (strv);
return variant;
}
static gboolean
_add_enhancer_config_row (ClapperAppPreferencesWindow *self, GParamSpec *pspec,
GSettings *enhancer_settings)
{
GtkWidget *row = NULL, *reset_button;
ClapperAppPreferencesResetData *reset_data;
const gchar *bind_prop = NULL;
gboolean is_enum = FALSE, is_flags = FALSE;
switch (pspec->value_type) {
case G_TYPE_BOOLEAN:{
row = adw_switch_row_new ();
break;
}
case G_TYPE_INT:{
GParamSpecInt *p = (GParamSpecInt *) pspec;
row = adw_spin_row_new_with_range (p->minimum, p->maximum, 1);
break;
}
case G_TYPE_UINT:{
GParamSpecUInt *p = (GParamSpecUInt *) pspec;
row = adw_spin_row_new_with_range (p->minimum, p->maximum, 1);
break;
}
case G_TYPE_DOUBLE:{
GParamSpecDouble *p = (GParamSpecDouble *) pspec;
row = adw_spin_row_new_with_range (p->minimum, p->maximum, 0.25);
break;
}
case G_TYPE_STRING:{
if (pspec->flags & (CLAPPER_ENHANCER_PARAM_FILEPATH | CLAPPER_ENHANCER_PARAM_DIRPATH)) {
GtkWidget *image;
image = gtk_image_new_from_icon_name ("document-open-symbolic");
gtk_widget_set_margin_end (image, 10); // matches other rows
row = adw_action_row_new ();
adw_action_row_add_suffix (ADW_ACTION_ROW (row), image);
adw_action_row_set_activatable_widget (ADW_ACTION_ROW (row), image);
g_signal_connect (row, "activated",
G_CALLBACK (file_selection_row_activated_cb), pspec);
} else {
row = adw_entry_row_new ();
}
break;
}
default:{
if ((is_enum = G_IS_PARAM_SPEC_ENUM (pspec))) {
GtkExpression *expression;
AdwEnumListModel *enum_model;
row = adw_combo_row_new ();
expression = gtk_property_expression_new (ADW_TYPE_ENUM_LIST_ITEM, NULL, "nick");
adw_combo_row_set_expression (ADW_COMBO_ROW (row), expression);
enum_model = adw_enum_list_model_new (pspec->value_type);
adw_combo_row_set_model (ADW_COMBO_ROW (row), G_LIST_MODEL (enum_model));
gtk_expression_unref (expression);
g_object_unref (enum_model);
break;
} else if ((is_flags = G_IS_PARAM_SPEC_FLAGS (pspec))) {
GFlagsClass *flags_class = G_FLAGS_CLASS (g_type_class_peek (pspec->value_type));
guint i;
row = adw_expander_row_new ();
for (i = 0; i < flags_class->n_values; ++i) {
GtkWidget *flag_row = adw_switch_row_new ();
ClapperAppPreferencesFlagMapData *fm_data;
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (flag_row),
flags_class->values[i].value_nick);
fm_data = g_new (ClapperAppPreferencesFlagMapData, 1);
fm_data->settings = g_object_ref (enhancer_settings);
fm_data->pspec = pspec;
fm_data->flag = flags_class->values[i].value;
GST_TRACE ("Created flag map data: %p", fm_data);
g_settings_bind_with_mapping (enhancer_settings, pspec->name, flag_row,
"active", G_SETTINGS_BIND_DEFAULT,
(GSettingsBindGetMapping) _get_flag_mapping,
(GSettingsBindSetMapping) _set_flag_mapping,
fm_data, (GDestroyNotify) _flag_map_data_free);
adw_expander_row_add_row (ADW_EXPANDER_ROW (row), flag_row);
}
break;
}
g_warning ("Unsupported enhancer \"%s\" property type: %s",
pspec->name, g_type_name (pspec->value_type));
return FALSE;
}
}
reset_button = gtk_button_new_from_icon_name ("view-refresh-symbolic");
gtk_widget_set_tooltip_text (reset_button, _("Restore default"));
gtk_widget_set_halign (reset_button, GTK_ALIGN_CENTER);
gtk_widget_set_valign (reset_button, GTK_ALIGN_CENTER);
gtk_widget_add_css_class (reset_button, "circular");
gtk_widget_set_tooltip_text (row, g_param_spec_get_blurb (pspec));
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), g_param_spec_get_nick (pspec));
if (ADW_IS_SWITCH_ROW (row)) {
bind_prop = "active";
} else if (ADW_IS_SPIN_ROW (row)) {
bind_prop = "value";
adw_spin_row_set_numeric (ADW_SPIN_ROW (row), TRUE);
} else if (ADW_IS_ENTRY_ROW (row)) {
bind_prop = "text";
} else if (ADW_IS_COMBO_ROW (row)) {
bind_prop = "selected";
} else if (ADW_IS_ACTION_ROW (row)) {
bind_prop = "subtitle";
} else if (!is_flags) { // In case of flags we bind individual widgets
g_assert_not_reached ();
return FALSE;
}
if (ADW_IS_ENTRY_ROW (row))
adw_entry_row_add_prefix (ADW_ENTRY_ROW (row), reset_button);
else if (ADW_IS_ACTION_ROW (row))
adw_action_row_add_prefix (ADW_ACTION_ROW (row), reset_button);
else if (ADW_IS_EXPANDER_ROW (row))
adw_expander_row_add_prefix (ADW_EXPANDER_ROW (row), reset_button);
if (is_enum) {
g_settings_bind_with_mapping (enhancer_settings, pspec->name, row,
bind_prop, G_SETTINGS_BIND_DEFAULT,
(GSettingsBindGetMapping) _get_enum_mapping,
(GSettingsBindSetMapping) _set_enum_mapping,
pspec, NULL);
} else if (!is_flags) {
g_settings_bind (enhancer_settings, pspec->name, row,
bind_prop, G_SETTINGS_BIND_DEFAULT);
}
reset_data = g_new (ClapperAppPreferencesResetData, 1);
reset_data->settings = g_object_ref (enhancer_settings);
reset_data->key = pspec->name;
GST_TRACE ("Created reset button data: %p", reset_data);
g_signal_connect_data (reset_button, "clicked",
G_CALLBACK (_reset_button_clicked_cb), reset_data,
(GClosureNotify) _reset_button_closure, G_CONNECT_DEFAULT);
adw_preferences_group_add (self->enhancer_config_group, row);
self->enhancer_pspec_rows = g_list_append (self->enhancer_pspec_rows, row);
return TRUE;
}
static void
selected_enhancer_changed_cb (AdwComboRow *combo_row,
GParamSpec *pspec G_GNUC_UNUSED, ClapperAppPreferencesWindow *self)
{
guint selected = adw_combo_row_get_selected (combo_row);
/* Remove old rows */
if (self->enhancer_pspec_rows) {
GList *el;
for (el = self->enhancer_pspec_rows; el; el = g_list_next (el))
adw_preferences_group_remove (self->enhancer_config_group, GTK_WIDGET (el->data));
g_clear_list (&self->enhancer_pspec_rows, NULL);
}
/* Add new rows */
if (selected != GTK_INVALID_LIST_POSITION) {
ClapperEnhancerProxyList *proxies = clapper_get_global_enhancer_proxies ();
ClapperEnhancerProxy *proxy = clapper_enhancer_proxy_list_peek_proxy (proxies, selected);
GParamSpec **pspecs;
guint n_pspecs;
gboolean has_props = FALSE;
if ((pspecs = clapper_enhancer_proxy_get_target_properties (proxy, &n_pspecs))) {
GSettings *enhancer_settings = NULL;
guint i;
for (i = 0; i < n_pspecs; ++i) {
if (pspecs[i]->flags & CLAPPER_ENHANCER_PARAM_GLOBAL) {
if (!enhancer_settings)
enhancer_settings = clapper_enhancer_proxy_get_settings (proxy);
if (enhancer_settings)
has_props |= _add_enhancer_config_row (self, pspecs[i], enhancer_settings);
}
}
g_clear_object (&enhancer_settings);
}
if (!has_props) {
GtkWidget *row = adw_action_row_new ();
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), _("No configurable properties"));
adw_preferences_group_add (self->enhancer_config_group, row);
self->enhancer_pspec_rows = g_list_append (self->enhancer_pspec_rows, row);
}
}
}
static void
enhancers_config_activated_cb (AdwActionRow *action_row, ClapperAppPreferencesWindow *self)
{
/* If no model set yet */
if (!adw_combo_row_get_model (self->enhancers_combo_row)) {
ClapperEnhancerProxyList *proxies = clapper_get_global_enhancer_proxies ();
adw_combo_row_set_model (self->enhancers_combo_row, G_LIST_MODEL (proxies));
adw_combo_row_set_selected (self->enhancers_combo_row, GTK_INVALID_LIST_POSITION);
GST_DEBUG ("Populated names combo row in enhancers subpage");
if (clapper_enhancer_proxy_list_get_n_proxies (proxies) > 0)
gtk_stack_set_visible_child (self->enhancers_stack, self->browse_enhancers_page);
else
gtk_stack_set_visible_child (self->enhancers_stack, self->no_enhancers_page);
}
adw_preferences_window_push_subpage (ADW_PREFERENCES_WINDOW (self), self->enhancers_subpage);
}
/* Sort by plugin name and if the same, sort by element name */
static gint
_compare_plugins_cb (gconstpointer ptr_a, gconstpointer ptr_b)
@@ -666,12 +301,6 @@ _make_plugin_features_string_list (ClapperAppPreferencesWindow *self, const gcha
return features_list;
}
static gboolean
list_has_selection_closure (ClapperAppPreferencesWindow *self, guint selected)
{
return (selected != GTK_INVALID_LIST_POSITION);
}
static GtkStringList *
ranking_features_model_closure (ClapperAppPreferencesWindow *self, GtkStringObject *string_obj)
{
@@ -914,7 +543,6 @@ clapper_app_preferences_window_finalize (GObject *object)
g_object_unref (self->settings);
g_clear_list (&self->enhancer_pspec_rows, NULL);
g_clear_object (&self->plugins_list);
if (self->features)
@@ -970,14 +598,6 @@ clapper_app_preferences_window_class_init (ClapperAppPreferencesWindowClass *kla
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, subtitle_offset_spin_row);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, font_dialog_button);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, enhancers_stack);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, browse_enhancers_page);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, no_enhancers_page);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, enhancers_subpage);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, enhancers_combo_row);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, enhancer_config_group);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, plugins_subpage);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, plugins_combo_row);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, features_combo_row);
@@ -985,13 +605,9 @@ clapper_app_preferences_window_class_init (ClapperAppPreferencesWindowClass *kla
gtk_widget_class_bind_template_callback (widget_class, seek_method_name_closure);
gtk_widget_class_bind_template_callback (widget_class, enhancers_config_activated_cb);
gtk_widget_class_bind_template_callback (widget_class, selected_enhancer_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, plugin_ranking_activated_cb);
gtk_widget_class_bind_template_callback (widget_class, plugin_ranking_unrealize_cb);
gtk_widget_class_bind_template_callback (widget_class, list_has_selection_closure);
gtk_widget_class_bind_template_callback (widget_class, ranking_features_model_closure);
gtk_widget_class_bind_template_callback (widget_class, add_override_button_sensitive_closure);
gtk_widget_class_bind_template_callback (widget_class, add_override_button_clicked_cb);

View File

@@ -25,28 +25,30 @@
#include "clapper-app-utils.h"
static void
_entry_text_changed_cb (AdwEntryRow *entry,
GParamSpec *pspec G_GNUC_UNUSED, AdwAlertDialog *dialog)
_entry_text_changed_cb (GtkEntry *entry,
GParamSpec *pspec G_GNUC_UNUSED, AdwMessageDialog *dialog)
{
const gchar *text = gtk_editable_get_text (GTK_EDITABLE (entry));
GtkEntryBuffer *buffer = gtk_entry_get_buffer (entry);
guint text_length = gtk_entry_buffer_get_length (buffer);
gboolean enabled = FALSE;
if (text && *text != '\0') {
enabled = gst_uri_is_valid (text);
if (text_length > 0) {
const gchar *text = gtk_entry_buffer_get_text (buffer);
enabled = (text && gst_uri_is_valid (text));
}
adw_alert_dialog_set_response_enabled (dialog, "add", enabled);
adw_message_dialog_set_response_enabled (dialog, "add", enabled);
}
static void
_open_uri_cb (AdwAlertDialog *dialog, GAsyncResult *result, GtkApplication *gtk_app)
_open_uri_cb (AdwMessageDialog *dialog, GAsyncResult *result, GtkApplication *gtk_app)
{
const gchar *response = adw_alert_dialog_choose_finish (dialog, result);
const gchar *response = adw_message_dialog_choose_finish (dialog, result);
if (strcmp (response, "add") == 0) {
GtkWidget *extra_child = adw_alert_dialog_get_extra_child (dialog);
AdwEntryRow *entry_row = ADW_ENTRY_ROW (gtk_list_box_get_row_at_index (GTK_LIST_BOX (extra_child), 0));
const gchar *text = gtk_editable_get_text (GTK_EDITABLE (entry_row));
GtkWidget *extra_child = adw_message_dialog_get_extra_child (dialog);
GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (extra_child));
const gchar *text = gtk_entry_buffer_get_text (buffer);
GFile **files = NULL;
gint n_files = 0;
@@ -58,15 +60,16 @@ _open_uri_cb (AdwAlertDialog *dialog, GAsyncResult *result, GtkApplication *gtk_
}
static void
_read_text_cb (GdkClipboard *clipboard, GAsyncResult *result, GtkWidget *entry_row)
_read_text_cb (GdkClipboard *clipboard, GAsyncResult *result, GtkWidget *extra_child)
{
GtkEntry *entry = GTK_ENTRY (extra_child);
GError *error = NULL;
gchar *text = gdk_clipboard_read_text_finish (clipboard, result, &error);
if (G_LIKELY (error == NULL)) {
if (gst_uri_is_valid (text)) {
gtk_editable_set_text (GTK_EDITABLE (entry_row), text);
gtk_editable_select_region (GTK_EDITABLE (entry_row), 0, -1);
gtk_editable_set_text (GTK_EDITABLE (entry), text);
gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
}
} else {
/* Common error when clipboard is empty or has unsupported content.
@@ -86,28 +89,30 @@ clapper_app_uri_dialog_open_uri (GtkApplication *gtk_app)
{
GtkWindow *window = gtk_application_get_active_window (gtk_app);
GtkBuilder *builder;
AdwAlertDialog *dialog;
GtkWidget *entry_row;
AdwMessageDialog *dialog;
GtkWidget *extra_child;
GdkDisplay *display;
builder = gtk_builder_new_from_resource (
CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-uri-dialog.ui");
dialog = ADW_ALERT_DIALOG (gtk_builder_get_object (builder, "dialog"));
entry_row = GTK_WIDGET (gtk_builder_get_object (builder, "entry_row"));
dialog = ADW_MESSAGE_DIALOG (gtk_builder_get_object (builder, "dialog"));
gtk_window_set_transient_for (GTK_WINDOW (dialog), window);
g_signal_connect (GTK_EDITABLE (entry_row), "notify::text",
extra_child = adw_message_dialog_get_extra_child (dialog);
g_signal_connect (GTK_ENTRY (extra_child), "notify::text",
G_CALLBACK (_entry_text_changed_cb), dialog);
if ((display = gdk_display_get_default ())) {
GdkClipboard *clipboard = gdk_display_get_clipboard (display);
gdk_clipboard_read_text_async (clipboard, NULL,
(GAsyncReadyCallback) _read_text_cb, entry_row);
(GAsyncReadyCallback) _read_text_cb, extra_child);
}
/* NOTE: Dialog will automatically unref itself after response */
adw_alert_dialog_choose (dialog, GTK_WIDGET (window), NULL,
adw_message_dialog_choose (dialog, NULL,
(GAsyncReadyCallback) _open_uri_cb,
gtk_app);

View File

@@ -23,11 +23,6 @@
#include "clapper-app-utils.h"
#include "clapper-app-media-item-box.h"
#ifdef HAVE_GRAPHVIZ
#include <graphviz/cgraph.h>
#include <graphviz/gvc.h>
#endif
#ifdef G_OS_WIN32
#include <windows.h>
#ifdef HAVE_WIN_PROCESS_THREADS_API
@@ -532,187 +527,3 @@ clapper_app_utils_make_element (const gchar *string)
return gst_element_factory_make (string, NULL);
}
/*
* _get_tmp_dir:
* @subdir: (nullable): an optional subdirectory
*
* Returns: (transfer full): a newly constructed #GFile
*/
static inline GFile *
_get_tmp_dir (const gchar *subdir)
{
/* XXX: System tmp directory does not work within containers such as Flatpak
* for our usage with file launcher, so make our own temp in app data dir */
return g_file_new_build_filename (
g_get_user_data_dir (), CLAPPER_APP_ID, "tmp", subdir, NULL);
}
#ifdef HAVE_GRAPHVIZ
static GFile *
_create_tmp_subdir (const gchar *subdir, GCancellable *cancellable, GError **error)
{
GFile *tmp_dir;
GError *my_error = NULL;
tmp_dir = _get_tmp_dir (subdir);
if (!g_file_make_directory_with_parents (tmp_dir, cancellable, &my_error)) {
if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_EXISTS) {
*error = g_error_copy (my_error);
g_clear_object (&tmp_dir); // return NULL
}
g_error_free (my_error);
}
return tmp_dir;
}
#endif
static void
_create_pipeline_svg_file_in_thread (GTask *task, GObject *source G_GNUC_UNUSED,
ClapperPlayer *player, GCancellable *cancellable)
{
GFile *tmp_file = NULL;
GError *error = NULL;
#ifdef HAVE_GRAPHVIZ
GFile *tmp_subdir;
Agraph_t *graph;
GVC_t *gvc;
gchar *path, *template = NULL, *dot_data = NULL, *img_data = NULL;
gint fd;
gsize size = 0;
if (!(tmp_subdir = _create_tmp_subdir ("pipelines", cancellable, &error)))
goto finish;
path = g_file_get_path (tmp_subdir);
g_object_unref (tmp_subdir);
template = g_build_filename (path, "pipeline-XXXXXX.svg", NULL);
g_free (path);
fd = g_mkstemp (template); // Modifies template to actual filename
if (G_UNLIKELY (fd == -1)) {
g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
"Could not open temp file for writing");
goto finish;
}
dot_data = clapper_player_make_pipeline_graph (player, GST_DEBUG_GRAPH_SHOW_ALL);
if (g_cancellable_is_cancelled (cancellable))
goto close_and_finish;
graph = agmemread (dot_data);
gvc = gvContext ();
gvLayout (gvc, graph, "dot");
#ifdef HAVE_GVC_13
gvRenderData (gvc, graph, "svg", &img_data, &size);
#else
{
guint tmp_size = 0; // Temporary uint to satisfy older API
gvRenderData (gvc, graph, "svg", &img_data, &tmp_size);
size = tmp_size;
}
#endif
agclose (graph);
gvFreeContext (gvc);
if (g_cancellable_is_cancelled (cancellable))
goto close_and_finish;
if (write (fd, img_data, size) != -1) {
tmp_file = g_file_new_for_path (template);
} else {
g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
"Could not write data to temp file");
}
close_and_finish:
/* Always close the file IO */
if (G_UNLIKELY (close (fd) == -1))
GST_ERROR ("Could not close temp file!");
finish:
g_free (template);
g_free (dot_data);
g_free (img_data);
#else
g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
"Cannot create graph file when compiled without Graphviz");
#endif
if (tmp_file)
g_task_return_pointer (task, tmp_file, (GDestroyNotify) g_object_unref);
else
g_task_return_error (task, error);
}
void
clapper_app_utils_create_pipeline_svg_file_async (ClapperPlayer *player,
GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
{
GTask *task;
task = g_task_new (NULL, cancellable, callback, user_data);
g_task_set_task_data (task, gst_object_ref (player), (GDestroyNotify) gst_object_unref);
g_task_run_in_thread (task, (GTaskThreadFunc) _create_pipeline_svg_file_in_thread);
g_object_unref (task);
}
static gboolean
_delete_dir_recursive (GFile *dir, GError **error)
{
GFileEnumerator *dir_enum;
if ((dir_enum = g_file_enumerate_children (dir,
G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_TYPE,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, error))) {
while (TRUE) {
GFileInfo *info = NULL;
GFile *child = NULL;
if (!g_file_enumerator_iterate (dir_enum, &info,
&child, NULL, error) || !info)
break;
if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) {
if (!_delete_dir_recursive (child, error))
break;
} else if (!g_file_delete (child, NULL, error)) {
break;
}
}
g_object_unref (dir_enum);
}
if (*error != NULL)
return FALSE;
return g_file_delete (dir, NULL, error);
}
void
clapper_app_utils_delete_tmp_dir (void)
{
GFile *tmp_dir = _get_tmp_dir (NULL);
GError *error = NULL;
if (!_delete_dir_recursive (tmp_dir, &error)) {
if (error->domain != G_IO_ERROR || error->code != G_IO_ERROR_NOT_FOUND) {
GST_ERROR ("Could not remove temp dir, reason: %s",
GST_STR_NULL (error->message));
}
g_error_free (error);
}
g_object_unref (tmp_dir);
}

View File

@@ -84,10 +84,4 @@ void clapper_app_utils_iterate_plugin_feature_ranks (GSettings *settings, Clappe
G_GNUC_INTERNAL
GstElement * clapper_app_utils_make_element (const gchar *string);
G_GNUC_INTERNAL
void clapper_app_utils_create_pipeline_svg_file_async (ClapperPlayer *player, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data);
G_GNUC_INTERNAL
void clapper_app_utils_delete_tmp_dir (void);
G_END_DECLS

View File

@@ -86,7 +86,9 @@ typedef struct
gint64 last_tick;
} ClapperAppWindowResizeData;
#if CLAPPER_HAVE_MPRIS
static guint16 instance_count = 0;
#endif
static inline GQuark
clapper_app_window_extra_options_get_quark (void)
@@ -231,7 +233,7 @@ video_map_cb (GtkWidget *widget, ClapperAppWindow *self)
GST_TRACE_OBJECT (self, "Video map");
player = clapper_gtk_av_get_player (CLAPPER_GTK_AV_CAST (self->video));
player = clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video));
g_signal_connect (player, "notify::volume",
G_CALLBACK (_player_volume_changed_cb), self);
@@ -252,7 +254,7 @@ video_unmap_cb (GtkWidget *widget, ClapperAppWindow *self)
GST_TRACE_OBJECT (self, "Video unmap");
player = clapper_gtk_av_get_player (CLAPPER_GTK_AV_CAST (self->video));
player = clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video));
g_signal_handlers_disconnect_by_func (player, _player_volume_changed_cb, self);
g_signal_handlers_disconnect_by_func (player, _player_speed_changed_cb, self);
@@ -524,7 +526,7 @@ drag_update_cb (GtkGestureDrag *drag,
static inline void
_alter_volume (ClapperAppWindow *self, gdouble dy)
{
ClapperPlayer *player = clapper_gtk_av_get_player (CLAPPER_GTK_AV_CAST (self->video));
ClapperPlayer *player = clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video));
gdouble volume = clapper_player_get_volume (player);
/* We do not want for volume to change too suddenly */
@@ -547,7 +549,7 @@ _alter_volume (ClapperAppWindow *self, gdouble dy)
static inline void
_alter_speed (ClapperAppWindow *self, gdouble dx)
{
ClapperPlayer *player = clapper_gtk_av_get_player (CLAPPER_GTK_AV_CAST (self->video));
ClapperPlayer *player = clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video));
gdouble speed = clapper_player_get_speed (player);
speed -= dx * 0.02;
@@ -571,7 +573,8 @@ _begin_seek_operation (ClapperAppWindow *self)
if (self->seeking)
return FALSE;
player = clapper_gtk_av_get_player (CLAPPER_GTK_AV_CAST (self->video));
player = clapper_gtk_video_get_player (
CLAPPER_GTK_VIDEO_CAST (self->video));
queue = clapper_player_get_queue (player);
current_item = clapper_queue_get_current_item (queue);
@@ -599,8 +602,8 @@ static void
_end_seek_operation (ClapperAppWindow *self)
{
if (self->seeking && self->current_duration > 0) {
ClapperPlayer *player = clapper_gtk_av_get_player (
CLAPPER_GTK_AV_CAST (self->video));
ClapperPlayer *player = clapper_gtk_video_get_player (
CLAPPER_GTK_VIDEO_CAST (self->video));
clapper_player_seek_custom (player, self->pending_position,
g_settings_get_int (self->settings, "seek-method"));
@@ -763,8 +766,8 @@ _handle_seek_key_press (ClapperAppWindow *self, gboolean forward)
static void
_handle_chapter_key_press (ClapperAppWindow *self, gboolean forward)
{
ClapperPlayer *player = clapper_gtk_av_get_player (
CLAPPER_GTK_AV_CAST (self->video));
ClapperPlayer *player = clapper_gtk_video_get_player (
CLAPPER_GTK_VIDEO_CAST (self->video));
ClapperQueue *queue = clapper_player_get_queue (player);
ClapperMediaItem *current_item = clapper_queue_get_current_item (queue);
ClapperTimeline *timeline;
@@ -854,8 +857,8 @@ _handle_chapter_key_press (ClapperAppWindow *self, gboolean forward)
static void
_handle_item_key_press (ClapperAppWindow *self, gboolean forward)
{
ClapperPlayer *player = clapper_gtk_av_get_player (
CLAPPER_GTK_AV_CAST (self->video));
ClapperPlayer *player = clapper_gtk_video_get_player (
CLAPPER_GTK_VIDEO_CAST (self->video));
ClapperQueue *queue = clapper_player_get_queue (player);
guint prev_index, index;
@@ -863,7 +866,7 @@ _handle_item_key_press (ClapperAppWindow *self, gboolean forward)
prev_index = clapper_queue_get_current_index (queue);
gtk_widget_activate_action (self->video,
(forward) ? "av.next-item" : "av.previous-item", NULL);
(forward) ? "video.next-item" : "video.previous-item", NULL);
index = clapper_queue_get_current_index (queue);
/* Notify only when changed */
@@ -880,14 +883,14 @@ _handle_speed_key_press (ClapperAppWindow *self, gboolean forward)
forward ^= (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL);
gtk_widget_activate_action (self->video,
(forward) ? "av.speed-up" : "av.speed-down", NULL);
(forward) ? "video.speed-up" : "video.speed-down", NULL);
}
static inline void
_handle_progression_key_press (ClapperAppWindow *self)
{
ClapperPlayer *player = clapper_gtk_av_get_player (
CLAPPER_GTK_AV_CAST (self->video));
ClapperPlayer *player = clapper_gtk_video_get_player (
CLAPPER_GTK_VIDEO_CAST (self->video));
ClapperQueue *queue = clapper_player_get_queue (player);
ClapperQueueProgressionMode mode;
const gchar *icon = NULL, *label = NULL;
@@ -907,11 +910,11 @@ key_pressed_cb (GtkEventControllerKey *controller, guint keyval,
switch (keyval) {
case GDK_KEY_Up:
if ((state & GDK_MODIFIER_MASK) == 0)
gtk_widget_activate_action (self->video, "av.volume-up", NULL);
gtk_widget_activate_action (self->video, "video.volume-up", NULL);
break;
case GDK_KEY_Down:
if ((state & GDK_MODIFIER_MASK) == 0)
gtk_widget_activate_action (self->video, "av.volume-down", NULL);
gtk_widget_activate_action (self->video, "video.volume-down", NULL);
break;
case GDK_KEY_Left:
if ((state & GDK_MODIFIER_MASK) == 0) {
@@ -942,7 +945,7 @@ key_pressed_cb (GtkEventControllerKey *controller, guint keyval,
case GDK_KEY_space:
case GDK_KEY_k:
if (!self->key_held && (state & GDK_MODIFIER_MASK) == 0)
gtk_widget_activate_action (self->video, "av.toggle-play", NULL);
gtk_widget_activate_action (self->video, "video.toggle-play", NULL);
break;
case GDK_KEY_less:
if (!self->key_held) // Needs seek (action is slow)
@@ -954,7 +957,7 @@ key_pressed_cb (GtkEventControllerKey *controller, guint keyval,
break;
case GDK_KEY_m:
if (!self->key_held && (state & GDK_MODIFIER_MASK) == 0)
gtk_widget_activate_action (self->video, "av.toggle-mute", NULL);
gtk_widget_activate_action (self->video, "video.toggle-mute", NULL);
break;
case GDK_KEY_p:
if (!self->key_held && (state & GDK_MODIFIER_MASK) == 0)
@@ -1122,7 +1125,7 @@ clapper_app_window_get_video (ClapperAppWindow *self)
ClapperPlayer *
clapper_app_window_get_player (ClapperAppWindow *self)
{
return clapper_gtk_av_get_player (CLAPPER_GTK_AV_CAST (self->video));
return clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video));
}
ClapperAppWindowExtraOptions *
@@ -1197,7 +1200,6 @@ clapper_app_window_init (ClapperAppWindow *self)
GtkSettings *settings;
GtkWidget *dummy_titlebar;
gint distance = 0;
GtkWindowGroup *group;
gtk_widget_set_size_request (GTK_WIDGET (self),
MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT);
@@ -1229,11 +1231,6 @@ clapper_app_window_init (ClapperAppWindow *self)
gtk_drop_target_set_gtypes (self->drop_target,
(GType[3]) { GDK_TYPE_FILE_LIST, G_TYPE_FILE, G_TYPE_STRING }, 3);
/* Add to window group */
group = gtk_window_group_new ();
gtk_window_group_add_window (group, GTK_WINDOW (self));
g_object_unref (group);
}
static void
@@ -1242,8 +1239,6 @@ clapper_app_window_constructed (GObject *object)
ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (object);
ClapperPlayer *player = clapper_app_window_get_player (self);
ClapperQueue *queue = clapper_player_get_queue (player);
ClapperEnhancerProxyList *proxies = clapper_player_get_enhancer_proxies (player);
ClapperEnhancerProxy *proxy;
ClapperGtkExtraMenuButton *button;
AdwStyleManager *manager;
@@ -1257,30 +1252,22 @@ clapper_app_window_constructed (GObject *object)
#if (CLAPPER_HAVE_MPRIS || CLAPPER_HAVE_SERVER || CLAPPER_HAVE_DISCOVERER)
ClapperFeature *feature = NULL;
#endif
#if CLAPPER_HAVE_MPRIS
gchar mpris_name[45];
g_snprintf (mpris_name, sizeof (mpris_name),
"org.mpris.MediaPlayer2.Clapper.instance%" G_GUINT16_FORMAT, instance_count++);
#endif
self->settings = g_settings_new (CLAPPER_APP_ID);
self->last_volume = PERCENTAGE_ROUND (g_settings_get_double (self->settings, "volume"));
if ((proxy = clapper_enhancer_proxy_list_get_proxy_by_module (proxies, "clapper-mpris"))) {
clapper_enhancer_proxy_set_locally (proxy,
"own-name", mpris_name,
"identity", CLAPPER_APP_NAME,
"desktop-entry", CLAPPER_APP_ID,
"queue-controllable", TRUE, NULL);
gst_object_unref (proxy);
} else {
#if CLAPPER_HAVE_MPRIS
feature = CLAPPER_FEATURE (clapper_mpris_new (
mpris_name, CLAPPER_APP_NAME, CLAPPER_APP_ID));
clapper_mpris_set_queue_controllable (CLAPPER_MPRIS (feature), TRUE);
clapper_player_add_feature (player, feature);
gst_object_unref (feature);
feature = CLAPPER_FEATURE (clapper_mpris_new (
mpris_name, CLAPPER_APP_NAME, CLAPPER_APP_ID));
clapper_mpris_set_queue_controllable (CLAPPER_MPRIS (feature), TRUE);
clapper_player_add_feature (player, feature);
gst_object_unref (feature);
#endif
}
#if CLAPPER_HAVE_SERVER
feature = CLAPPER_FEATURE (clapper_server_new ());

View File

@@ -21,10 +21,10 @@ window.info .subcontent streamlist preferencesgroup {
window.preferences .subcontent {
margin: 16px;
}
window.preferences .configsubpage .subcontent popover {
window.preferences .pluginssubpage .subcontent popover {
min-width: 264px;
}
window.preferences .configsubpage .subcontent button.pill {
window.preferences .pluginssubpage .subcontent button.pill {
margin-top: 8px;
margin-bottom: 8px;
}

View File

@@ -12,7 +12,7 @@ StartupNotify=true
Terminal=false
Type=Application
# Translators: Search terms to find this application. Do NOT translate the semicolons!
Keywords=Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;
Keywords=Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;
# Translators: Do NOT translate or transliterate this text (these are enum types)!
X-Purism-FormFactor=Workstation;Mobile;
Actions=new-window;

View File

@@ -1,11 +1,10 @@
appstream_cli = find_program('appstreamcli', required: false)
if appstream_cli.found()
appstream_util = find_program('appstream-util', required: false)
if appstream_util.found()
test('Validate appstream file',
appstream_cli,
appstream_util,
args: [
'validate',
'--no-net',
'--explain',
'validate-relax',
'--nonet',
join_paths(meson.current_source_dir(), 'metainfo', 'com.github.rafostar.Clapper.metainfo.xml'),
]
)

View File

@@ -31,10 +31,8 @@
gint
main (gint argc, gchar **argv)
{
GApplication *application;
ClapperEnhancerProxyList *proxies;
const gchar *clapper_ldir;
guint i, n_proxies;
GApplication *application;
gint status;
#ifdef G_OS_WIN32
@@ -66,15 +64,6 @@ main (gint argc, gchar **argv)
resolution = clapper_app_utils_win_hi_res_clock_start ();
#endif
proxies = clapper_get_global_enhancer_proxies ();
n_proxies = clapper_enhancer_proxy_list_get_n_proxies (proxies);
/* Allow usage of all enhancers */
for (i = 0; i < n_proxies; ++i) {
ClapperEnhancerProxy *proxy = clapper_enhancer_proxy_list_peek_proxy (proxies, i);
clapper_enhancer_proxy_set_target_creation_allowed (proxy, TRUE);
}
application = clapper_app_application_new ();
status = g_application_run (application, argc, argv);
@@ -85,7 +74,5 @@ main (gint argc, gchar **argv)
clapper_app_utils_win_hi_res_clock_stop (resolution);
#endif
clapper_app_utils_delete_tmp_dir ();
return status;
}

View File

@@ -67,7 +67,7 @@ configure_file(
)
clapperapp_sources = [
'clapper-app-about-dialog.c',
'clapper-app-about-window.c',
'clapper-app-application.c',
'clapper-app-file-dialog.c',
'clapper-app-headerbar.c',
@@ -94,26 +94,6 @@ clapperapp_c_args = [
'-DGST_USE_UNSTABLE_API',
]
clapperapp_possible_functionalities = [
'pipeline-preview',
]
clapperapp_available_functionalities = []
pp_option = get_option('pipeline-preview')
if not pp_option.disabled()
if cgraph_dep.found() and gvc_dep.found()
clapperapp_c_args += ['-DHAVE_GRAPHVIZ']
clapperapp_deps += [cgraph_dep, gvc_dep]
if gvc_dep.version().version_compare('>= 13.0.0')
clapperapp_c_args += ['-DHAVE_GVC_13']
endif
clapperapp_available_functionalities += 'pipeline-preview'
elif pp_option.enabled()
error('pipeline-preview option was enabled, but required dependencies were not found')
endif
endif
is_windows = ['windows'].contains(host_machine.system())
if is_windows

View File

@@ -10,7 +10,7 @@ src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui
src/bin/clapper-app/ui/clapper-app-uri-dialog.ui
src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui
src/bin/clapper-app/clapper-app-about-dialog.c
src/bin/clapper-app/clapper-app-about-window.c
src/bin/clapper-app/clapper-app-application.c
src/bin/clapper-app/clapper-app-info-window.c
src/bin/clapper-app/clapper-app-list-item-utils.c

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Afrikaans\n"
"Language: af_ZA\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Language: ar_SA\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "عادي"
msgid "Fast"
msgstr "سريع"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Asturian\n"
"Language: ast_ES\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normal"
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normal"
msgid "Fast"
msgstr "Ràpid"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Sense progressió"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Consecutiu"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Repeteix l'ítem"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Carrusel"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Aleatori"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper-app\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -32,7 +32,9 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid ""
"Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;"
"Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -535,23 +537,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normální"
msgid "Fast"
msgstr "Rychlý"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Žádný postup"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Po sobě"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Opakovat položku"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Opakovat frontu"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Náhodně"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"Language: da_DK\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-04-11 18:29\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-13 18:01\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -32,8 +32,8 @@ msgstr "Gebe Videos uns Musik wieder"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr ""
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Video;Bewegtbildproduktion;Film;Clip;Serie;Wiedergabe;Wiedergabeliste;DVD;TV;Fernsehen;Platte;Album;Musik;GNOME;Clapper;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -374,7 +374,7 @@ msgstr "Versatz zwischen der Untertitel- und Videospur (in Sekunden)"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
msgstr "Standardschriftart"
msgstr "Standartschriftart"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
@@ -530,23 +530,23 @@ msgstr "Normal"
msgid "Fast"
msgstr "Schnell"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Kein Fortschritt"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Fortlaufend"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Wiederholen"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Kreislauf"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Zufallswiedergabe"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Greek\n"
"Language: el_GR\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 17:41\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -32,8 +32,8 @@ msgstr "Reproduce videos y música"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr ""
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Vídeo;Película;Film;Clip;Serie;Reproductor;Playlist;DVD;TV;Disco;Álbum;Música;GNOME;Clapper;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -531,23 +531,23 @@ msgstr "Normal"
msgid "Fast"
msgstr "Rápido"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Sin progresión"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Consecutivo"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Repetir elemento"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Carrusel"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Aleatorio"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Basque\n"
"Language: eu_ES\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normala"
msgid "Fast"
msgstr "Azkarra"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 13:14\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-13 15:41\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
"Language: fa_IR\n"
@@ -32,8 +32,8 @@ msgstr "پخش ویدیو و آهنگ"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;ویدیو;فیلم;کلیپ;سریال;نمایش;پخش;دی‌وی‌دی;تلویزیون;دیسک;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;ویدیو;فیلم;کلیپ;سریتال;پخش;تلویزیون;آلبوم;آهنگ;گنوم;کلاکت;کلپر;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -531,23 +531,23 @@ msgstr "معمولی"
msgid "Fast"
msgstr "تند"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "بدون پیشرفت"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "متوالی"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "تکرار مورد"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "چرخ فلک"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "بر زدن"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-17 08:37\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-12 13:02\n"
"Last-Translator: \n"
"Language-Team: Finnish\n"
"Language: fi_FI\n"
@@ -20,7 +20,7 @@ msgstr ""
#. Translators: Do NOT translate app name!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:4
msgid "Clapper"
msgstr "Clapper"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:5
msgid "Multimedia Player"
@@ -32,8 +32,8 @@ msgstr "Toista videoita ja musiikkia"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;elokuva;leffa;sarja;soittolista;soitin;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;elokuva;sarja;soittolista;levy;albumi;musiikki;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -530,23 +530,23 @@ msgstr "Normaali"
msgid "Fast"
msgstr "Nopea"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Ei etenemistä"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Perättäinen"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Toista kohde"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Karuselli"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Sekoita"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-27 20:49\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-18 09:13\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -32,8 +32,8 @@ msgstr "Lire des vidéos et de la musique"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr "Vidéo;Film;Clip;Série;Lecteur;Playlist;DVD;TV;Disque;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Vidéo;Movie;Film;Clip;Séries;Player;Lecteur;Playlist;DVD;TV;Disque;Album;Musique;GNOME;Clapper;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -531,23 +531,23 @@ msgstr "Normal"
msgid "Fast"
msgstr "Rapide"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Aucune progression"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Chronologique"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Répéter lélement"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Carrousel"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Aléatoire"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"Language: he_IL\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "רגילה"
msgid "Fast"
msgstr "מהיר"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Hindi\n"
"Language: hi_IN\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "साधारण"
msgid "Fast"
msgstr "तेज"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "प्रगति नहीं"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "लगातार"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "मद दोहराएं"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "कैरोसेल"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "शफल"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normalna"
msgid "Fast"
msgstr "Brzo"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normál"
msgid "Fast"
msgstr "Gyors"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Ne haladjon"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Folyamatos"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Listaelem ismétlése"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Körkörös"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Véletlenszerű"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normale"
msgid "Fast"
msgstr "Veloce"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "標準"
msgid "Fast"
msgstr "高速"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Lithuanian\n"
"Language: lt_LT\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Numatyta"
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normaal"
msgid "Fast"
msgstr "Snel"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"Language: no_NO\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normal"
msgid "Fast"
msgstr "Rask"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Ingen progresjon"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Konsekutiv"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Gjenta element"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Gjenta kø"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Omstokking"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Occitan\n"
"Language: oc_FR\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr "Rapid"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Cap de progression"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Consecutiu"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Repetir lelement"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Vira-vira"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Aleatòri"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-19 14:18\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
@@ -32,8 +32,8 @@ msgstr "Odtwarzaj filmy i muzykę"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr ""
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Wideo;Film;Clip;Serie;Odtwarzacz;Playlista;DVD;TV;CD;Album;Muzyka;GNOME;Clapper;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -530,23 +530,23 @@ msgstr "Normalny"
msgid "Fast"
msgstr "Szybki"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Brak progresji"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Po kolei"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Powtarzaj rzecz"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Karuzela"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Losowo"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-04-01 09:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-14 14:46\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
@@ -32,8 +32,8 @@ msgstr "Reproduzir vídeos e música"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr "Vídeo;Filme;Filme;Clipe;Série;Leitor;Reprodutor;Lista de reprodução;DVD;TV;Disco;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Vídeo;Filme;Clip;Leitor;Reprodutor;Playlist;Lista de reprodução;DVD;TV;Disco;Música;GNOME;Clapper;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -530,23 +530,23 @@ msgstr "Predefinido"
msgid "Fast"
msgstr "Rápido"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Sem progressão"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Consecutiva"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Repetir item"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Carrossel"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Aleatório"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-16 04:37\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-12 03:17\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -32,8 +32,8 @@ msgstr "Reproduza vídeos e músicas"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Vídeo;Filme;Clipe;Série;Reprodutor;Lista;Reprodução;Disco;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Vídeo;Filme;Clipe;Série;Show;Reprodutor;Player;Playlist;Lista;DVD;TV;Disco;Álbum;Música;GNOME;Clapper;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -531,23 +531,23 @@ msgstr "Normal"
msgid "Fast"
msgstr "Rápido"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Sem progressão"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Consecutiva"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Repetir item"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Repetir tudo"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Aleatório"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:10\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-20 20:06\n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
@@ -32,7 +32,7 @@ msgstr "Redă videoclipuri și muzică"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-25 20:33\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-14 21:16\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -20,25 +20,25 @@ msgstr ""
#. Translators: Do NOT translate app name!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:4
msgid "Clapper"
msgstr "Clapper"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:5
msgid "Multimedia Player"
msgstr "Проигрыватель мультимедиа"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:6
msgid "Play videos and music"
msgstr "Воспроизведение видео и музыки"
msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr "Видео;Фильм;Фильм;Клип;Серий;Плейлист;DVD;ТВ;Диск;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
msgid "New Window"
msgstr "Новое Окно"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
@@ -90,7 +90,7 @@ msgstr "Общие"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13
msgid "New window"
msgstr "Новое окно"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
@@ -110,15 +110,15 @@ msgstr "Двойное нажатие | Двойной клик"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:38
msgid "Unfullscreen"
msgstr "Выйти из полноэкранного режима"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:44
msgid "Auto window resize"
msgstr "Автоматически изменять размер окна"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:45
msgid "Middle click"
msgstr "Клик колёсиком"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:51
msgid "Quit"
@@ -468,19 +468,19 @@ msgstr "Игорь Дятлов"
#: src/bin/clapper-app/clapper-app-application.c:696
msgid "Create a new window"
msgstr "Создать новое окно"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:697
msgid "Add media to queue in primary application instance"
msgstr "Добавить контент в очередь в основной экземпляр приложения"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:698
msgid "Audio volume to set (0 - 2.0 range)"
msgstr "Установить громкость звука (диапазон 0 - 2,0)"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:699
msgid "Playback speed to set (0.05 - 2.0 range)"
msgstr "Установить скорость воспроизведения (диапазон 0,05 - 2,0)"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:700
msgid "Initial bitrate for adaptive streaming"
@@ -492,7 +492,7 @@ msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:702
msgid "Set window to be fullscreen"
msgstr "Запустить в полноэкранном окне"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:703
msgid "Video filter to use (\"none\" to disable)"
@@ -530,23 +530,23 @@ msgstr "Обычная"
msgid "Fast"
msgstr "Быстрый"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "Нет прогрессии"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Последовательно"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Повторить элемент"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Повтор очереди"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Случайно"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Slovak\n"
"Language: sk_SK\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normálne"
msgid "Fast"
msgstr "Rýchle"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Serbian (Cyrillic)\n"
"Language: sr_SP\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Swedish\n"
"Language: sv_SE\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr "Normal"
msgid "Fast"
msgstr "Snabbt"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 22:52\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
@@ -32,8 +32,8 @@ msgstr "Videoları ve müzikleri oynat"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgstr ""
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;Vidyo;Klip;Dizi;Oynatıcı;Oynatma Listesi;Çalma Listesi;Disk;Albüm;Müzik;"
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
@@ -530,23 +530,23 @@ msgstr "Normal"
msgid "Fast"
msgstr "Hızlı"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "İlerleme yok"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "Ardaşık"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "Ögeyi Yinele"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "Karosel"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "Karıştır"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Ukrainian\n"
"Language: uk_UA\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"Language: vi_VN\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-19 10:03\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -32,13 +32,13 @@ msgstr "播放视频和音乐"
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
msgid "New Window"
msgstr "新建窗口"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
@@ -90,7 +90,7 @@ msgstr "常规​​​​​"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13
msgid "New window"
msgstr "新建窗口"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
@@ -285,7 +285,7 @@ msgstr "过滤器"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "接收器"
msgstr "Sink"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
@@ -309,11 +309,11 @@ msgstr "添加媒体到播放队列即可开始"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
msgstr "快进/快退"
msgstr "定位播放"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "方式"
msgstr "快进/快退方式"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
@@ -465,8 +465,7 @@ msgstr "像素格式"
#: src/bin/clapper-app/clapper-app-about-window.c:47
msgid "translator-credits"
msgstr "刘韬\n"
"Tommy He\n"
"demo_007"
"Tommy He"
#: src/bin/clapper-app/clapper-app-application.c:696
msgid "Create a new window"
@@ -474,11 +473,11 @@ msgstr "新建一个窗口"
#: src/bin/clapper-app/clapper-app-application.c:697
msgid "Add media to queue in primary application instance"
msgstr "向主应用程序实例播放列队添加媒体"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:698
msgid "Audio volume to set (0 - 2.0 range)"
msgstr "设置音量(范围 0 - 2.0)"
msgstr "设置音量 (范围 0 - 2.0)"
#: src/bin/clapper-app/clapper-app-application.c:699
msgid "Playback speed to set (0.05 - 2.0 range)"
@@ -486,31 +485,31 @@ msgstr "设置播放速度(范围 0.05 - 2.0)"
#: src/bin/clapper-app/clapper-app-application.c:700
msgid "Initial bitrate for adaptive streaming"
msgstr "自适性流的初始比特率"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:701
msgid "Initial queue progression mode (0=none, 1=consecutive, 2=repeat-item, 3=carousel, 4=shuffle)"
msgstr "初始播放列队模式 (0=单集, 1=连续, 2=单机循环, 3=队列循环, 4=随机)"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:702
msgid "Set window to be fullscreen"
msgstr "窗口全屏"
msgstr "设置窗口全屏"
#: src/bin/clapper-app/clapper-app-application.c:703
msgid "Video filter to use (\"none\" to disable)"
msgstr "视频过滤器(\"none\"为禁用)"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:704
msgid "Audio filter to use (\"none\" to disable)"
msgstr "音频过滤器(\"none\"为禁用)"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:705
msgid "Video sink to use"
msgstr "视频接收器"
msgstr ""
#: src/bin/clapper-app/clapper-app-application.c:706
msgid "Audio sink to use"
msgstr "音频接收器"
msgstr ""
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
@@ -532,23 +531,23 @@ msgstr "标准"
msgid "Fast"
msgstr "快速"
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr "单集"
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr "连续"
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr "单集循环"
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr "队列循环"
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr "随机"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-15 12:47+0100\n"
"PO-Revision-Date: 2025-02-15 12:11\n"
"POT-Creation-Date: 2025-01-11 15:22+0100\n"
"PO-Revision-Date: 2025-01-11 14:36\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
@@ -32,7 +32,7 @@ msgstr ""
#. Translators: Search terms to find this application. Do NOT translate the semicolons!
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:16
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;"
msgid "Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;"
msgstr ""
#: src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop.in:22
@@ -530,23 +530,23 @@ msgstr ""
msgid "Fast"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:207
#: src/bin/clapper-app/clapper-app-utils.c:90
msgid "No progression"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:208
#: src/bin/clapper-app/clapper-app-utils.c:91
msgid "Consecutive"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:209
#: src/bin/clapper-app/clapper-app-utils.c:92
msgid "Repeat item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:210
#: src/bin/clapper-app/clapper-app-utils.c:93
msgid "Carousel"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:211
#: src/bin/clapper-app/clapper-app-utils.c:94
msgid "Shuffle"
msgstr ""

View File

@@ -26,12 +26,6 @@
<property name="accelerator">&lt;Ctrl&gt;question</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="title" translatable="yes">Show pipeline</property>
<property name="accelerator">&lt;Ctrl&gt;&lt;Shift&gt;p</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="title" translatable="yes">Toggle fullscreen</property>

View File

@@ -232,17 +232,6 @@
</child>
</object>
</child>
<child>
<object class="GtkButton" id="pipeline_button">
<property name="halign">center</property>
<property name="label" translatable="yes">Show Pipeline</property>
<property name="action-name">app.pipeline</property>
<property name="visible">false</property>
<style>
<class name="pill"/>
</style>
</object>
</child>
</object>
</child>
</object>

View File

@@ -136,24 +136,6 @@
<object class="AdwPreferencesPage">
<property name="title" translatable="yes">Tweaks</property>
<property name="icon-name">applications-engineering-symbolic</property>
<child>
<object class="AdwPreferencesGroup">
<property name="title" translatable="no">Clapper</property>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Enhancers</property>
<property name="subtitle" translatable="yes">Browse and configure properties of available enhancers</property>
<property name="activatable">true</property>
<signal name="activated" handler="enhancers_config_activated_cb"/>
<child>
<object class="GtkImage">
<property name="icon_name">go-next-symbolic</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="AdwPreferencesGroup">
<property name="title" translatable="no">GStreamer</property>
@@ -178,124 +160,6 @@
<class name="preferences"/>
</style>
</template>
<object class="AdwNavigationPage" id="enhancers_subpage">
<property name="title" translatable="yes">Clapper Enhancers</property>
<property name="child">
<object class="AdwToolbarView">
<child type="top">
<object class="AdwHeaderBar"/>
</child>
<property name="content">
<object class="GtkScrolledWindow">
<child>
<object class="AdwClamp">
<style>
<class name="subcontent"/>
</style>
<child>
<object class="GtkStack" id="enhancers_stack">
<child>
<object class="GtkBox" id="browse_enhancers_page">
<property name="orientation">vertical</property>
<child>
<object class="AdwPreferencesGroup">
<property name="title" translatable="yes">Available enhancers</property>
<property name="description" translatable="yes">Select an enhancer plugin to view its information and properties to configure.</property>
<child>
<object class="AdwComboRow" id="enhancers_combo_row">
<property name="title" translatable="yes">Enhancer</property>
<property name="enable-search">true</property>
<property name="expression">
<lookup type="ClapperEnhancerProxy" name="friendly-name"/>
</property>
<signal name="notify::selected" handler="selected_enhancer_changed_cb"/>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<binding name="visible">
<closure type="gboolean" function="list_has_selection_closure">
<lookup name="selected">enhancers_combo_row</lookup>
</closure>
</binding>
<child>
<object class="AdwPreferencesGroup">
<property name="title" translatable="yes">Information</property>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Module</property>
<binding name="subtitle">
<lookup name="module-name" type="ClapperEnhancerProxy">
<lookup name="selected-item">enhancers_combo_row</lookup>
</lookup>
</binding>
<style>
<class name="property"/>
</style>
</object>
</child>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Description</property>
<binding name="subtitle">
<lookup name="description" type="ClapperEnhancerProxy">
<lookup name="selected-item">enhancers_combo_row</lookup>
</lookup>
</binding>
<style>
<class name="property"/>
</style>
</object>
</child>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Version</property>
<binding name="subtitle">
<lookup name="version" type="ClapperEnhancerProxy">
<lookup name="selected-item">enhancers_combo_row</lookup>
</lookup>
</binding>
<style>
<class name="property"/>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="enhancer_config_group">
<property name="title" translatable="yes">Properties</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="AdwStatusPage" id="no_enhancers_page">
<property name="vexpand">true</property>
<property name="hexpand">true</property>
<property name="icon-name">edit-find-symbolic</property>
<property name="title" translatable="yes">No Clapper Enhancers Found</property>
<property name="description" translatable="yes">Install some to add more cool functionalities to the player!</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</property>
</object>
</property>
<signal name="unrealize" handler="plugin_ranking_unrealize_cb"/>
<style>
<class name="configsubpage"/>
</style>
</object>
<object class="AdwNavigationPage" id="plugins_subpage">
<property name="title" translatable="yes">Plugin Ranking</property>
<property name="child">
@@ -376,7 +240,7 @@
</property>
<signal name="unrealize" handler="plugin_ranking_unrealize_cb"/>
<style>
<class name="configsubpage"/>
<class name="pluginssubpage"/>
</style>
</object>
</interface>

View File

@@ -1,28 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface domain="clapper-app">
<object class="AdwAlertDialog" id="dialog">
<object class="AdwMessageDialog" id="dialog">
<property name="modal">true</property>
<property name="width-request">420</property>
<property name="heading" translatable="yes">Add URI</property>
<property name="body" translatable="yes">Insert an URI to be added to playback queue</property>
<property name="close-response">cancel</property>
<property name="default-response">add</property>
<property name="follows-content-size">false</property>
<property name="content-width">420</property>
<property name="extra-child">
<object class="GtkListBox">
<property name="selection-mode">none</property>
<style>
<class name="boxed-list"/>
</style>
<child>
<object class="AdwEntryRow" id="entry_row">
<property name="halign">fill</property>
<property name="valign">center</property>
<property name="hexpand">true</property>
<property name="activates-default">true</property>
<property name="input-purpose">url</property>
<property name="title" translatable="yes">Enter or drop URI here</property>
</object>
</child>
<object class="GtkEntry">
<property name="halign">fill</property>
<property name="valign">center</property>
<property name="hexpand">true</property>
<property name="activates-default">true</property>
<property name="truncate-multiline">true</property>
<property name="input-purpose">url</property>
<property name="placeholder-text" translatable="yes">Enter or drop URI here</property>
</object>
</property>
<responses>

View File

@@ -1,268 +0,0 @@
/* Clapper GTK Integration Library
* Copyright (C) 2025 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
*/
/**
* ClapperGtkAudio:
*
* A GTK widget for audio playback with Clapper API.
*
* #ClapperGtkAudio is a widget meant for integrating audio playback
* within GTK application. It exposes [class@Clapper.Player] through its
* base class [property@ClapperGtk.Av:player] property.
*
* Other widgets (buttons, seek bar, etc.) provided by `ClapperGtk` library, once placed
* anywhere inside audio container (including nesting within another widget like [class@Gtk.Box])
* will automatically control #ClapperGtkAudio they are within. This allows to freely create
* custom UI best suited for specific application.
*
* # Basic usage
*
* A typical use case is to embed audio widget as part of your app where audio playback
* is needed (can be even the very first child of the window). Get the [class@Clapper.Player]
* belonging to the AV widget and start adding new [class@Clapper.MediaItem] items to the
* [class@Clapper.Queue] for playback. For more information please refer to the Clapper
* playback library documentation.
*
* # Actions
*
* You can use built-in actions of parent [class@ClapperGtk.Av].
* See its documentation for the list of available ones.
*
* # ClapperGtkAudio as GtkBuildable
*
* #ClapperGtkAudio implementation of the [iface@Gtk.Buildable] interface supports
* placing a single widget (which might then hold multiple widgets) as `<child>` element.
*
* ```xml
* <object class="ClapperGtkAudio" id="audio">
* <child>
* <object class="GtkBox">
* <property name="orientation">horizontal</property>
* <child>
* <object class="ClapperGtkPreviousItemButton">
* </child>
* <child>
* <object class="ClapperGtkTogglePlayButton">
* </child>
* <child>
* <object class="ClapperGtkNextItemButton">
* </child>
* </object>
* </child>
* </object>
* ```
*
* Since: 0.10
*/
#include "config.h"
#include "clapper-gtk-audio.h"
#define GST_CAT_DEFAULT clapper_gtk_audio_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
struct _ClapperGtkAudio
{
ClapperGtkAv parent;
GtkWidget *child;
};
static void
clapper_gtk_audio_add_child (GtkBuildable *buildable,
GtkBuilder *builder, GObject *child, const char *type)
{
if (GTK_IS_WIDGET (child)) {
clapper_gtk_audio_set_child (CLAPPER_GTK_AUDIO (buildable), GTK_WIDGET (child));
} else {
GtkBuildableIface *parent_iface = g_type_interface_peek_parent (GTK_BUILDABLE_GET_IFACE (buildable));
parent_iface->add_child (buildable, builder, child, type);
}
}
static void
_buildable_iface_init (GtkBuildableIface *iface)
{
iface->add_child = clapper_gtk_audio_add_child;
}
#define parent_class clapper_gtk_audio_parent_class
G_DEFINE_TYPE_WITH_CODE (ClapperGtkAudio, clapper_gtk_audio, CLAPPER_GTK_TYPE_AV,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, _buildable_iface_init))
enum
{
PROP_0,
PROP_CHILD,
PROP_LAST
};
static GParamSpec *param_specs[PROP_LAST] = { NULL, };
static inline void
_unparent_child (ClapperGtkAudio *self)
{
GtkWidget *child;
if ((child = gtk_widget_get_first_child (GTK_WIDGET (self))))
gtk_widget_unparent (child);
}
/**
* clapper_gtk_audio_new:
*
* Creates a new #ClapperGtkAudio instance.
*
* Newly created audio widget will also have set "scaletempo" GStreamer element
* as default audio filter on its [class@Clapper.Player] and disable video and
* subtitle streams. This can be changed after construction by setting
* corresponding player properties.
*
* Returns: a new audio #GtkWidget.
*/
GtkWidget *
clapper_gtk_audio_new (void)
{
return g_object_new (CLAPPER_GTK_TYPE_AUDIO, NULL);
}
/**
* clapper_gtk_audio_set_child:
* @audio: a #ClapperGtkAudio
* @child: (nullable): a #GtkWidget
*
* Set a child #GtkWidget of @audio.
*/
void
clapper_gtk_audio_set_child (ClapperGtkAudio *self, GtkWidget *child)
{
g_return_if_fail (CLAPPER_GTK_IS_AUDIO (self));
g_return_if_fail (GTK_IS_WIDGET (child));
_unparent_child (self);
if (child)
gtk_widget_set_parent (child, GTK_WIDGET (self));
}
/**
* clapper_gtk_audio_get_child:
* @audio: a #ClapperGtkAudio
*
* Get a child #GtkWidget of @audio.
*
* Returns: (transfer none) (nullable): #GtkWidget set as child.
*/
GtkWidget *
clapper_gtk_audio_get_child (ClapperGtkAudio *self)
{
g_return_val_if_fail (CLAPPER_GTK_IS_AUDIO (self), NULL);
return gtk_widget_get_first_child (GTK_WIDGET (self));
}
static void
clapper_gtk_audio_init (ClapperGtkAudio *self)
{
}
static void
clapper_gtk_audio_constructed (GObject *object)
{
ClapperGtkAudio *self = CLAPPER_GTK_AUDIO_CAST (object);
ClapperPlayer *player;
G_OBJECT_CLASS (parent_class)->constructed (object);
player = clapper_gtk_av_get_player (CLAPPER_GTK_AV_CAST (self));
clapper_player_set_video_enabled (player, FALSE);
clapper_player_set_subtitles_enabled (player, FALSE);
}
static void
clapper_gtk_audio_dispose (GObject *object)
{
ClapperGtkAudio *self = CLAPPER_GTK_AUDIO_CAST (object);
_unparent_child (self);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
clapper_gtk_audio_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
ClapperGtkAudio *self = CLAPPER_GTK_AUDIO_CAST (object);
switch (prop_id) {
case PROP_CHILD:
g_value_set_object (value, clapper_gtk_audio_get_child (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
clapper_gtk_audio_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
ClapperGtkAudio *self = CLAPPER_GTK_AUDIO_CAST (object);
switch (prop_id) {
case PROP_CHILD:
clapper_gtk_audio_set_child (self, g_value_get_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
clapper_gtk_audio_class_init (ClapperGtkAudioClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappergtkaudio", GST_DEBUG_FG_MAGENTA,
"Clapper GTK Audio");
gobject_class->constructed = clapper_gtk_audio_constructed;
gobject_class->get_property = clapper_gtk_audio_get_property;
gobject_class->set_property = clapper_gtk_audio_set_property;
gobject_class->dispose = clapper_gtk_audio_dispose;
/**
* ClapperGtkAudio:child:
*
* The child widget of `ClapperGtkAudio`.
*/
param_specs[PROP_CHILD] = g_param_spec_object ("child",
NULL, NULL, GTK_TYPE_WIDGET,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, PROP_LAST, param_specs);
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GENERIC);
gtk_widget_class_set_css_name (widget_class, "clapper-gtk-audio");
}

View File

@@ -1,49 +0,0 @@
/* Clapper GTK Integration Library
* Copyright (C) 2025 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
*/
#pragma once
#if !defined(__CLAPPER_GTK_INSIDE__) && !defined(CLAPPER_GTK_COMPILATION)
#error "Only <clapper-gtk/clapper-gtk.h> can be included directly."
#endif
#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-av.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_AUDIO (clapper_gtk_audio_get_type())
#define CLAPPER_GTK_AUDIO_CAST(obj) ((ClapperGtkAudio *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkAudio, clapper_gtk_audio, CLAPPER_GTK, AUDIO, ClapperGtkAv)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_audio_new (void);
CLAPPER_GTK_API
void clapper_gtk_audio_set_child (ClapperGtkAudio *audio, GtkWidget *child);
CLAPPER_GTK_API
GtkWidget * clapper_gtk_audio_get_child (ClapperGtkAudio *audio);
G_END_DECLS

View File

@@ -1,645 +0,0 @@
/* Clapper GTK Integration Library
* Copyright (C) 2025 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
*/
/**
* ClapperGtkAv:
*
* A base class for GTK audio and video widgets.
*
* See its descendants: [class@ClapperGtk.Audio] and [class@ClapperGtk.Video].
*
* # Actions
*
* #ClapperGtkAv defines a set of built-in actions:
*
* ```yaml
* - "av.toggle-play": toggle play/pause
* - "av.play": start/resume playback
* - "av.pause": pause playback
* - "av.stop": stop playback
* - "av.seek": seek to position (variant "d")
* - "av.seek-custom": seek to position using seek method (variant "(di)")
* - "av.toggle-mute": toggle mute state
* - "av.set-mute": set mute state (variant "b")
* - "av.volume-up": increase volume by 2%
* - "av.volume-down": decrease volume by 2%
* - "av.set-volume": set volume to specified value (variant "d")
* - "av.speed-up": increase speed (from 0.05x - 2x range to nearest quarter)
* - "av.speed-down": decrease speed (from 0.05x - 2x range to nearest quarter)
* - "av.set-speed": set speed to specified value (variant "d")
* - "av.previous-item": select previous item in queue
* - "av.next-item": select next item in queue
* - "av.select-item": select item at specified index in queue (variant "u")
* ```
*
* Since: 0.10
*/
#include "config.h"
#include <math.h>
#include "clapper-gtk-av.h"
#define PERCENTAGE_ROUND(a) (round ((gdouble) a / 0.01) * 0.01)
#define DEFAULT_AUTO_INHIBIT FALSE
#define GST_CAT_DEFAULT clapper_gtk_av_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
typedef struct _ClapperGtkAvPrivate ClapperGtkAvPrivate;
struct _ClapperGtkAvPrivate
{
ClapperPlayer *player;
gboolean auto_inhibit;
guint inhibit_cookie;
};
#define parent_class clapper_gtk_av_parent_class
G_DEFINE_TYPE_WITH_PRIVATE (ClapperGtkAv, clapper_gtk_av, GTK_TYPE_WIDGET)
enum
{
PROP_0,
PROP_PLAYER,
PROP_AUTO_INHIBIT,
PROP_INHIBITED,
PROP_LAST
};
static gboolean provider_added = FALSE;
static GParamSpec *param_specs[PROP_LAST] = { NULL, };
static void
toggle_play_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
switch (clapper_player_get_state (player)) {
case CLAPPER_PLAYER_STATE_PLAYING:
clapper_player_pause (player);
break;
case CLAPPER_PLAYER_STATE_STOPPED:
case CLAPPER_PLAYER_STATE_PAUSED:
clapper_player_play (player);
break;
default:
break;
}
}
static void
play_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
clapper_player_play (player);
}
static void
pause_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
clapper_player_pause (player);
}
static void
stop_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
clapper_player_stop (player);
}
static void
seek_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
gdouble position = g_variant_get_double (parameter);
clapper_player_seek (player, position);
}
static void
seek_custom_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
ClapperPlayerSeekMethod method = CLAPPER_PLAYER_SEEK_METHOD_NORMAL;
gdouble position = 0;
g_variant_get (parameter, "(di)", &position, &method);
clapper_player_seek_custom (player, position, method);
}
static void
toggle_mute_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
clapper_player_set_mute (player, !clapper_player_get_mute (player));
}
static void
set_mute_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
gboolean mute = g_variant_get_boolean (parameter);
clapper_player_set_mute (player, mute);
}
static void
volume_up_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
gdouble volume = (clapper_player_get_volume (player) + 0.02);
if (volume > 2.0)
volume = 2.0;
clapper_player_set_volume (player, PERCENTAGE_ROUND (volume));
}
static void
volume_down_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
gdouble volume = (clapper_player_get_volume (player) - 0.02);
if (volume < 0)
volume = 0;
clapper_player_set_volume (player, PERCENTAGE_ROUND (volume));
}
static void
set_volume_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
gdouble volume = g_variant_get_double (parameter);
clapper_player_set_volume (player, volume);
}
static void
speed_up_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
gdouble dest, speed = clapper_player_get_speed (player);
if (speed >= 2.0)
return;
dest = 0.25;
while (speed >= dest)
dest += 0.25;
if (dest > 2.0)
dest = 2.0;
clapper_player_set_speed (player, dest);
}
static void
speed_down_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
gdouble dest, speed = clapper_player_get_speed (player);
if (speed <= 0.05)
return;
dest = 2.0;
while (speed <= dest)
dest -= 0.25;
if (dest < 0.05)
dest = 0.05;
clapper_player_set_speed (player, dest);
}
static void
set_speed_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
gdouble speed = g_variant_get_double (parameter);
clapper_player_set_speed (player, speed);
}
static void
previous_item_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
clapper_queue_select_previous_item (clapper_player_get_queue (player));
}
static void
next_item_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
clapper_queue_select_next_item (clapper_player_get_queue (player));
}
static void
select_item_action_cb (GtkWidget *widget, const gchar *action_name, GVariant *parameter)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperPlayer *player = clapper_gtk_av_get_player (self);
guint index = g_variant_get_uint32 (parameter);
clapper_queue_select_index (clapper_player_get_queue (player), index);
}
static void
_ensure_css_provider (void)
{
GdkDisplay *display;
if (provider_added)
return;
display = gdk_display_get_default ();
if (G_LIKELY (display != NULL)) {
GtkCssProvider *provider = gtk_css_provider_new ();
gtk_css_provider_load_from_resource (provider,
CLAPPER_GTK_RESOURCE_PREFIX "/css/styles.css");
gtk_style_context_add_provider_for_display (display,
(GtkStyleProvider *) provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - 1);
g_object_unref (provider);
provider_added = TRUE;
}
}
static inline void
_set_inhibit_session (ClapperGtkAv *self, gboolean inhibit)
{
ClapperGtkAvPrivate *priv = clapper_gtk_av_get_instance_private (self);
GtkRoot *root;
GApplication *app;
gboolean inhibited = (priv->inhibit_cookie != 0);
if (inhibited == inhibit)
return;
GST_DEBUG_OBJECT (self, "Trying to %sinhibit session...", (inhibit) ? "" : "un");
root = gtk_widget_get_root (GTK_WIDGET (self));
if (!root && !GTK_IS_WINDOW (root)) {
GST_WARNING_OBJECT (self, "Cannot %sinhibit session "
"without root window", (inhibit) ? "" : "un");
return;
}
/* NOTE: Not using application from window prop,
* as it goes away early when unrooting */
app = g_application_get_default ();
if (!app && !GTK_IS_APPLICATION (app)) {
GST_WARNING_OBJECT (self, "Cannot %sinhibit session "
"without window application set", (inhibit) ? "" : "un");
return;
}
if (inhibited) {
gtk_application_uninhibit (GTK_APPLICATION (app), priv->inhibit_cookie);
priv->inhibit_cookie = 0;
}
if (inhibit) {
priv->inhibit_cookie = gtk_application_inhibit (GTK_APPLICATION (app),
GTK_WINDOW (root), GTK_APPLICATION_INHIBIT_IDLE,
"Media is playing");
}
GST_DEBUG_OBJECT (self, "Session %sinhibited", (inhibit) ? "" : "un");
g_object_notify_by_pspec (G_OBJECT (self), param_specs[PROP_INHIBITED]);
}
static void
_player_state_changed_cb (ClapperPlayer *player,
GParamSpec *pspec G_GNUC_UNUSED, ClapperGtkAv *self)
{
ClapperGtkAvPrivate *priv = clapper_gtk_av_get_instance_private (self);
if (priv->auto_inhibit) {
ClapperPlayerState state = clapper_player_get_state (player);
_set_inhibit_session (self, state == CLAPPER_PLAYER_STATE_PLAYING);
}
}
/**
* clapper_gtk_av_get_player:
* @av: a #ClapperGtkAv
*
* Get #ClapperPlayer used by this #ClapperGtkAv instance.
*
* Returns: (transfer none): a #ClapperPlayer used by widget.
*
* Since: 0.10
*/
ClapperPlayer *
clapper_gtk_av_get_player (ClapperGtkAv *self)
{
ClapperGtkAvPrivate *priv;
g_return_val_if_fail (CLAPPER_GTK_IS_AV (self), NULL);
priv = clapper_gtk_av_get_instance_private (self);
return priv->player;
}
/**
* clapper_gtk_av_set_auto_inhibit:
* @av: a #ClapperGtkAv
* @inhibit: whether to enable automatic session inhibit
*
* Set whether widget should try to automatically inhibit session
* from idling (and possibly screen going black) when media is playing.
*
* Since: 0.10
*/
void
clapper_gtk_av_set_auto_inhibit (ClapperGtkAv *self, gboolean inhibit)
{
ClapperGtkAvPrivate *priv;
g_return_if_fail (CLAPPER_GTK_IS_AV (self));
priv = clapper_gtk_av_get_instance_private (self);
if (priv->auto_inhibit != inhibit) {
priv->auto_inhibit = inhibit;
/* Uninhibit if we were auto inhibited earlier */
if (!priv->auto_inhibit)
_set_inhibit_session (self, FALSE);
g_object_notify_by_pspec (G_OBJECT (self), param_specs[PROP_AUTO_INHIBIT]);
}
}
/**
* clapper_gtk_av_get_auto_inhibit:
* @av: a #ClapperGtkAv
*
* Get whether automatic session inhibit is enabled.
*
* Returns: %TRUE if enabled, %FALSE otherwise.
*
* Since: 0.10
*/
gboolean
clapper_gtk_av_get_auto_inhibit (ClapperGtkAv *self)
{
ClapperGtkAvPrivate *priv;
g_return_val_if_fail (CLAPPER_GTK_IS_AV (self), FALSE);
priv = clapper_gtk_av_get_instance_private (self);
return priv->auto_inhibit;
}
/**
* clapper_gtk_av_get_inhibited:
* @av: a #ClapperGtkAv
*
* Get whether session is currently inhibited by
* [property@ClapperGtk.Av:auto-inhibit].
*
* Returns: %TRUE if inhibited, %FALSE otherwise.
*
* Since: 0.10
*/
gboolean
clapper_gtk_av_get_inhibited (ClapperGtkAv *self)
{
ClapperGtkAvPrivate *priv;
g_return_val_if_fail (CLAPPER_GTK_IS_AV (self), FALSE);
priv = clapper_gtk_av_get_instance_private (self);
return (priv->inhibit_cookie != 0);
}
static void
clapper_gtk_av_root (GtkWidget *widget)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
ClapperGtkAvPrivate *priv = clapper_gtk_av_get_instance_private (self);
_ensure_css_provider ();
GTK_WIDGET_CLASS (parent_class)->root (widget);
if (priv->auto_inhibit) {
ClapperPlayerState state = clapper_player_get_state (priv->player);
_set_inhibit_session (self, state == CLAPPER_PLAYER_STATE_PLAYING);
}
}
static void
clapper_gtk_av_unroot (GtkWidget *widget)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (widget);
_set_inhibit_session (self, FALSE);
GTK_WIDGET_CLASS (parent_class)->unroot (widget);
}
static void
clapper_gtk_av_init (ClapperGtkAv *self)
{
ClapperGtkAvPrivate *priv = clapper_gtk_av_get_instance_private (self);
priv->auto_inhibit = DEFAULT_AUTO_INHIBIT;
}
static void
clapper_gtk_av_constructed (GObject *object)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (object);
ClapperGtkAvPrivate *priv = clapper_gtk_av_get_instance_private (self);
GstElement *afilter;
priv->player = clapper_player_new ();
g_signal_connect (priv->player, "notify::state",
G_CALLBACK (_player_state_changed_cb), self);
afilter = gst_element_factory_make ("scaletempo", NULL);
if (G_LIKELY (afilter != NULL))
clapper_player_set_audio_filter (priv->player, afilter);
G_OBJECT_CLASS (parent_class)->constructed (object);
}
static void
clapper_gtk_av_dispose (GObject *object)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (object);
ClapperGtkAvPrivate *priv = clapper_gtk_av_get_instance_private (self);
/* Something else might still be holding a reference on the player,
* thus we should disconnect everything before disposing template */
if (priv->player) {
g_signal_handlers_disconnect_by_func (priv->player,
_player_state_changed_cb, self);
}
gst_clear_object (&priv->player);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
clapper_gtk_av_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (object);
switch (prop_id) {
case PROP_PLAYER:
g_value_set_object (value, clapper_gtk_av_get_player (self));
break;
case PROP_AUTO_INHIBIT:
g_value_set_boolean (value, clapper_gtk_av_get_auto_inhibit (self));
break;
case PROP_INHIBITED:
g_value_set_boolean (value, clapper_gtk_av_get_inhibited (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
clapper_gtk_av_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
ClapperGtkAv *self = CLAPPER_GTK_AV_CAST (object);
switch (prop_id) {
case PROP_AUTO_INHIBIT:
clapper_gtk_av_set_auto_inhibit (self, g_value_get_boolean (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
clapper_gtk_av_class_init (ClapperGtkAvClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappergtkav", GST_DEBUG_FG_MAGENTA,
"Clapper GTK AV");
widget_class->root = clapper_gtk_av_root;
widget_class->unroot = clapper_gtk_av_unroot;
gobject_class->constructed = clapper_gtk_av_constructed;
gobject_class->get_property = clapper_gtk_av_get_property;
gobject_class->set_property = clapper_gtk_av_set_property;
gobject_class->dispose = clapper_gtk_av_dispose;
/**
* ClapperGtkAv:player:
*
* A #ClapperPlayer used by widget.
*/
param_specs[PROP_PLAYER] = g_param_spec_object ("player",
NULL, NULL, CLAPPER_TYPE_PLAYER,
G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* ClapperGtkAv:auto-inhibit:
*
* Try to automatically inhibit session when media is playing.
*/
param_specs[PROP_AUTO_INHIBIT] = g_param_spec_boolean ("auto-inhibit",
NULL, NULL, DEFAULT_AUTO_INHIBIT,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* ClapperGtkAv:inhibited:
*
* Get whether session is currently inhibited by playback.
*/
param_specs[PROP_INHIBITED] = g_param_spec_boolean ("inhibited",
NULL, NULL, FALSE,
G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, PROP_LAST, param_specs);
gtk_widget_class_install_action (widget_class, "av.toggle-play", NULL, toggle_play_action_cb);
gtk_widget_class_install_action (widget_class, "av.play", NULL, play_action_cb);
gtk_widget_class_install_action (widget_class, "av.pause", NULL, pause_action_cb);
gtk_widget_class_install_action (widget_class, "av.stop", NULL, stop_action_cb);
gtk_widget_class_install_action (widget_class, "av.seek", "d", seek_action_cb);
gtk_widget_class_install_action (widget_class, "av.seek-custom", "(di)", seek_custom_action_cb);
gtk_widget_class_install_action (widget_class, "av.toggle-mute", NULL, toggle_mute_action_cb);
gtk_widget_class_install_action (widget_class, "av.set-mute", "b", set_mute_action_cb);
gtk_widget_class_install_action (widget_class, "av.volume-up", NULL, volume_up_action_cb);
gtk_widget_class_install_action (widget_class, "av.volume-down", NULL, volume_down_action_cb);
gtk_widget_class_install_action (widget_class, "av.set-volume", "d", set_volume_action_cb);
gtk_widget_class_install_action (widget_class, "av.speed-up", NULL, speed_up_action_cb);
gtk_widget_class_install_action (widget_class, "av.speed-down", NULL, speed_down_action_cb);
gtk_widget_class_install_action (widget_class, "av.set-speed", "d", set_speed_action_cb);
gtk_widget_class_install_action (widget_class, "av.previous-item", NULL, previous_item_action_cb);
gtk_widget_class_install_action (widget_class, "av.next-item", NULL, next_item_action_cb);
gtk_widget_class_install_action (widget_class, "av.select-item", "u", select_item_action_cb);
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GENERIC);
gtk_widget_class_set_css_name (widget_class, "clapper-gtk-av");
}

View File

@@ -1,60 +0,0 @@
/* Clapper GTK Integration Library
* Copyright (C) 2025 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
*/
#pragma once
#if !defined(__CLAPPER_GTK_INSIDE__) && !defined(CLAPPER_GTK_COMPILATION)
#error "Only <clapper-gtk/clapper-gtk.h> can be included directly."
#endif
#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper/clapper.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_AV (clapper_gtk_av_get_type())
#define CLAPPER_GTK_AV_CAST(obj) ((ClapperGtkAv *)(obj))
CLAPPER_GTK_API
G_DECLARE_DERIVABLE_TYPE (ClapperGtkAv, clapper_gtk_av, CLAPPER_GTK, AV, GtkWidget)
struct _ClapperGtkAvClass
{
GtkWidgetClass parent_class;
/*< private >*/
gpointer padding[4];
};
CLAPPER_GTK_API
ClapperPlayer * clapper_gtk_av_get_player (ClapperGtkAv *av);
CLAPPER_GTK_API
void clapper_gtk_av_set_auto_inhibit (ClapperGtkAv *av, gboolean inhibit);
CLAPPER_GTK_API
gboolean clapper_gtk_av_get_auto_inhibit (ClapperGtkAv *av);
CLAPPER_GTK_API
gboolean clapper_gtk_av_get_inhibited (ClapperGtkAv *av);
G_END_DECLS

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/**

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <clapper/clapper.h>

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "clapper-gtk-buffering-paintable-private.h"

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/**

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/**

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/**

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <clapper/clapper.h>

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/**
@@ -82,7 +83,7 @@ clapper_gtk_next_item_button_init (ClapperGtkNextItemButton *self)
{
gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
gtk_button_set_icon_name (GTK_BUTTON (self), "media-skip-forward-symbolic");
gtk_actionable_set_action_name (GTK_ACTIONABLE (self), "av.next-item");
gtk_actionable_set_action_name (GTK_ACTIONABLE (self), "video.next-item");
}
static void

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/**
@@ -82,7 +83,7 @@ clapper_gtk_previous_item_button_init (ClapperGtkPreviousItemButton *self)
{
gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
gtk_button_set_icon_name (GTK_BUTTON (self), "media-skip-backward-symbolic");
gtk_actionable_set_action_name (GTK_ACTIONABLE (self), "av.previous-item");
gtk_actionable_set_action_name (GTK_ACTIONABLE (self), "video.previous-item");
}
static void

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once

View File

@@ -12,8 +12,9 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <https://www.gnu.org/licenses/>.
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/**
@@ -395,47 +396,6 @@ _update_duration_label (ClapperGtkSeekBar *self, gdouble duration)
gtk_adjustment_set_upper (adjustment, duration);
}
static gboolean
_find_marks_in_widget (GtkWidget *widget, GtkWidget **top_marks, GtkWidget **bottom_marks)
{
GtkWidget *child;
if (g_strcmp0 (gtk_widget_get_css_name (widget), "marks") == 0) {
if (gtk_widget_has_css_class (widget, "top"))
*top_marks = widget;
else if (gtk_widget_has_css_class (widget, "bottom"))
*bottom_marks = widget;
/* Its unexpected to have marks within marks,
* so do not iterate children of marks widget */
return (*top_marks && *bottom_marks);
}
child = gtk_widget_get_first_child (widget);
while (child != NULL) {
if (_find_marks_in_widget (child, top_marks, bottom_marks))
return TRUE;
child = gtk_widget_get_next_sibling (child);
}
return FALSE;
}
static gboolean
_find_last_mark_in_marks (GtkWidget *marks, GtkWidget **last_mark)
{
GtkWidget *widget = gtk_widget_get_last_child (marks);
if (widget && g_strcmp0 (gtk_widget_get_css_name (widget), "mark") == 0) {
*last_mark = widget;
return TRUE;
}
return FALSE;
}
static void
_update_scale_marks (ClapperGtkSeekBar *self, ClapperTimeline *timeline)
{
@@ -464,43 +424,11 @@ _update_scale_marks (ClapperGtkSeekBar *self, ClapperTimeline *timeline)
for (i = 0; i < n_markers; ++i) {
ClapperMarker *marker = clapper_timeline_get_marker (timeline, i);
ClapperMarkerType marker_type = clapper_marker_get_marker_type (marker);
gdouble start = clapper_marker_get_start (marker);
gtk_scale_add_mark (GTK_SCALE (self->scale), start, GTK_POS_TOP, NULL);
gtk_scale_add_mark (GTK_SCALE (self->scale), start, GTK_POS_BOTTOM, NULL);
if (marker_type >= CLAPPER_MARKER_TYPE_CUSTOM_1) {
GtkWidget *top_marks = NULL, *bottom_marks = NULL;
GtkWidget *top_mark = NULL, *bottom_mark = NULL;
if (_find_marks_in_widget (self->scale, &top_marks, &bottom_marks)
&& _find_last_mark_in_marks (top_marks, &top_mark)
&& _find_last_mark_in_marks (bottom_marks, &bottom_mark)) {
const gchar *custom_name;
switch (marker_type) {
case CLAPPER_MARKER_TYPE_CUSTOM_1:
custom_name = "custom1";
break;
case CLAPPER_MARKER_TYPE_CUSTOM_2:
custom_name = "custom2";
break;
case CLAPPER_MARKER_TYPE_CUSTOM_3:
custom_name = "custom3";
break;
default:
custom_name = NULL;
break;
}
if (G_LIKELY (custom_name != NULL)) {
gtk_widget_add_css_class (top_mark, custom_name);
gtk_widget_add_css_class (bottom_mark, custom_name);
}
}
}
gst_object_unref (marker);
}

Some files were not shown because too many files have changed in this diff Show More