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/");
+ }
+}