diff --git a/meson.build b/meson.build index 1d27915..b46af16 100644 --- a/meson.build +++ b/meson.build @@ -18,8 +18,8 @@ gnome = import('gnome') i18n = import('i18n') phosh_dep = dependency('phosh-plugins', version: '>= 0.45') -lockscreen_plugins_dir = phosh_dep.get_variable('lockscreen_plugins_dir') quick_setting_plugins_dir = phosh_dep.get_variable('quick_setting_plugins_dir') +quick_setting_prefs_dir = phosh_dep.get_variable('quick_setting_prefs_dir') common_deps = [ dependency('gee-0.8'), @@ -60,3 +60,9 @@ add_project_arguments(project_c_args, language: 'c') subdir('po') # The example plugin subdir('src') + +gnome.post_install( + glib_compile_schemas: true, + gtk_update_icon_cache: true, + update_desktop_database: true, +) diff --git a/src/media-player.desktop.in.in b/src/media-player.desktop.in.in index 7284fe6..5c0a911 100644 --- a/src/media-player.desktop.in.in +++ b/src/media-player.desktop.in.in @@ -5,3 +5,7 @@ Name=Beautiful media player widget Types=quick-setting;lockscreen Comment=Yep, it was written in vala Plugin=@plugins_dir@/libphosh-plugin-@name@.so + +[Prefs] +Id=@name@-prefs +Plugin=@plugin_prefs_dir@/libphosh-plugin-prefs-@name@.so diff --git a/src/meson.build b/src/meson.build index 4580a76..55ee2d3 100644 --- a/src/meson.build +++ b/src/meson.build @@ -37,10 +37,12 @@ shared_module( install: true, install_dir: quick_setting_plugins_dir, ) +subdir('prefs') pluginconf = configuration_data() pluginconf.set('name', meson.project_name()) pluginconf.set('plugins_dir', quick_setting_plugins_dir) +pluginconf.set('plugin_prefs_dir', quick_setting_prefs_dir) i18n.merge_file( input: configure_file( diff --git a/src/prefs/extension.gresources.xml b/src/prefs/extension.gresources.xml new file mode 100644 index 0000000..0e054ac --- /dev/null +++ b/src/prefs/extension.gresources.xml @@ -0,0 +1,6 @@ + + + + prefs.ui + + diff --git a/src/prefs/extension.vala b/src/prefs/extension.vala new file mode 100644 index 0000000..6ae1781 --- /dev/null +++ b/src/prefs/extension.vala @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2025 Vasiliy Doylov + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Author: Vasiliy Doylov + */ + +namespace MediaPlayer.Preferences { + [CCode (cname = "g_io_module_load")] + public static void stub (IOModule module) { + module.use (); + if (typeof (Preferences) == 0) { + init (module); + } + + IOExtensionPoint.implement ("phosh-quick-setting-widget-prefs", + typeof (Preferences), + "media-player-prefs", + 10); + } + + [ModuleInit] + [CCode (cname = "g_module_load_real")] + /* + * Weird hack. + * Move this attribute to stub and see what will happen + * We don't need to register type on all loads. + * In `stub` we're checking if any our types was registred if no, call module init + */ + public static void init (IOModule module) { + } + + [CCode (cname = "g_io_module_unload")] + public static void unload (IOModule module) { + } + + [CCode (cname = "g_io_phosh_plugin_prefs_media_player_query")] + public static string[] query () { + StrvBuilder builder = new StrvBuilder (); + + builder.add ("phosh-quick-setting-widget-prefs"); + return builder.end (); + } +} diff --git a/src/prefs/meson.build b/src/prefs/meson.build new file mode 100644 index 0000000..6c7006c --- /dev/null +++ b/src/prefs/meson.build @@ -0,0 +1,53 @@ +prefs_blueprints = custom_target( + 'prefs_blueprints', + input: files( + 'prefs.blp', + ), + output: '.', + command: [ + find_program('blueprint-compiler'), + 'batch-compile', + '@OUTPUT@', + '@CURRENT_SOURCE_DIR@', + '@INPUT@', + ], +) + +prefs_resources = gnome.compile_resources( + 'media-player-prefs-resources', + 'extension.gresources.xml', + c_name: 'phosh_plugin_media_player', + dependencies: prefs_blueprints, +) + +shared_module( + 'phosh-plugin-prefs-media-player', + sources: [ + 'prefs.vala', + 'extension.vala', + prefs_resources, + ], + dependencies: [ + dependency('gtk4'), + dependency('libadwaita-1'), + dependency('gio-2.0'), + ], + c_args: common_c_args, + install: true, + install_dir: quick_setting_prefs_dir, +) + +install_data( + [ + 'mobi.phosh.plugins.mediaplayer.gschema.xml', + ], + install_dir: get_option('datadir') / 'glib-2.0' / 'schemas', +) +compile_schemas = find_program('glib-compile-schemas', required: false) +if compile_schemas.found() + test( + 'Validate schema file', + compile_schemas, + args: ['--strict', '--dry-run', meson.current_source_dir()], + ) +endif diff --git a/src/prefs/mobi.phosh.plugins.mediaplayer.gschema.xml b/src/prefs/mobi.phosh.plugins.mediaplayer.gschema.xml new file mode 100644 index 0000000..45ddfc7 --- /dev/null +++ b/src/prefs/mobi.phosh.plugins.mediaplayer.gschema.xml @@ -0,0 +1,31 @@ + + + + 12 + + + 12 + + + 24 + + + 0 + + + + + + + + + diff --git a/src/prefs/prefs.blp b/src/prefs/prefs.blp new file mode 100644 index 0000000..0195d13 --- /dev/null +++ b/src/prefs/prefs.blp @@ -0,0 +1,56 @@ +using Gtk 4.0; +using Adw 1; + +template $MediaPlayerPreferencesPreferences: Adw.PreferencesDialog { + title: _("Quick settings preferences"); + + Adw.PreferencesPage { + Adw.PreferencesGroup { + title: _("Margins"); + + Adw.SpinRow { + title: _("Top"); + + adjustment: Adjustment adj_margin_top { + lower: 0; + upper: 4096; + step-increment: 1; + page-increment: 10; + }; + } + + Adw.SpinRow spin_margin_bottom { + title: _("Bottom"); + + adjustment: Adjustment adj_margin_bottom { + lower: 0; + upper: 4096; + step-increment: 1; + page-increment: 10; + }; + } + + Adw.SpinRow spin_margin_start { + title: _("Start"); + + adjustment: Adjustment adj_margin_start { + lower: 0; + upper: 4096; + step-increment: 1; + page-increment: 10; + }; + } + + Adw.SpinRow spin_margin_end { + title: _("End"); + + adjustment: Adjustment adj_margin_end { + lower: 0; + upper: 4096; + step-increment: 1; + page-increment: 10; + }; + } + } + } +} diff --git a/src/prefs/prefs.vala b/src/prefs/prefs.vala new file mode 100644 index 0000000..ee3c243 --- /dev/null +++ b/src/prefs/prefs.vala @@ -0,0 +1,7 @@ +[GtkTemplate (ui = "/mobi/phosh/plugins/media-player/prefs.ui")] +public class MediaPlayer.Preferences.Preferences : Adw.PreferencesDialog { + construct { + message ("Constuct"); + var settings = new Settings.with_path ("mobi.phosh.plugins.mediaplayer", "/mobi/phosh/plugins/media-player/"); + } +}