From c40c18577d315db6519322c77595c162b0ad226b Mon Sep 17 00:00:00 2001 From: Gotam Gorabh Date: Thu, 16 Oct 2025 12:08:13 +0530 Subject: [PATCH] plugins: Add location quick setting Closes: https://gitlab.gnome.org/World/Phosh/phosh/-/issues/783 Signed-off-by: Gotam Gorabh Part-of: --- .../location-quick-setting.c | 120 ++++++++++++++++++ .../location-quick-setting.desktop.in.in | 7 + .../location-quick-setting.h | 20 +++ plugins/location-quick-setting/meson.build | 42 ++++++ .../phosh-plugin-location-quick-setting.c | 39 ++++++ ...ugin-location-quick-setting.gresources.xml | 6 + plugins/location-quick-setting/qs.ui | 12 ++ plugins/meson.build | 1 + po/POTFILES.in | 2 + 9 files changed, 249 insertions(+) create mode 100644 plugins/location-quick-setting/location-quick-setting.c create mode 100644 plugins/location-quick-setting/location-quick-setting.desktop.in.in create mode 100644 plugins/location-quick-setting/location-quick-setting.h create mode 100644 plugins/location-quick-setting/meson.build create mode 100644 plugins/location-quick-setting/phosh-plugin-location-quick-setting.c create mode 100644 plugins/location-quick-setting/phosh-plugin-location-quick-setting.gresources.xml create mode 100644 plugins/location-quick-setting/qs.ui diff --git a/plugins/location-quick-setting/location-quick-setting.c b/plugins/location-quick-setting/location-quick-setting.c new file mode 100644 index 000000000..9c05a5d11 --- /dev/null +++ b/plugins/location-quick-setting/location-quick-setting.c @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2025 Phosh.mobi e.V. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Author: Gotam Gorabh + */ + +#include "location-quick-setting.h" +#include "quick-setting.h" +#include "status-icon.h" + +#include + +#define LOCATION_SETTINGS "org.gnome.system.location" +#define ENABLED_KEY "enabled" + +/** + * PhoshLocationQuickSetting: + * + * A quick setting to toggle location services on/off + */ +struct _PhoshLocationQuickSetting { + PhoshQuickSetting parent; + + GSettings *settings; + PhoshStatusIcon *info; +}; + +G_DEFINE_TYPE (PhoshLocationQuickSetting, phosh_location_quick_setting, PHOSH_TYPE_QUICK_SETTING); + +static void +on_clicked (PhoshLocationQuickSetting *self) +{ + gboolean enabled = phosh_quick_setting_get_active (PHOSH_QUICK_SETTING (self)); + + phosh_quick_setting_set_active (PHOSH_QUICK_SETTING (self), !enabled); +} + + +static gboolean +transform_to_icon_name (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + gboolean enabled = g_value_get_boolean (from_value); + const char *icon_name; + + icon_name = enabled ? "location-services-active-symbolic" : "location-services-disabled-symbolic"; + g_value_set_string (to_value, icon_name); + return TRUE; +} + + +static gboolean +transform_to_label (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + gboolean enabled = g_value_get_boolean (from_value); + const char *label; + + label = enabled ? _("Location On") : _("Location Off"); + g_value_set_string (to_value, label); + return TRUE; +} + +static void +phosh_location_quick_setting_finalize (GObject *object) +{ + PhoshLocationQuickSetting *self = PHOSH_LOCATION_QUICK_SETTING (object); + + g_clear_object (&self->settings); + + G_OBJECT_CLASS (phosh_location_quick_setting_parent_class)->finalize (object); +} + + +static void +phosh_location_quick_setting_class_init (PhoshLocationQuickSettingClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = phosh_location_quick_setting_finalize; + + gtk_widget_class_set_template_from_resource (widget_class, + "/mobi/phosh/plugins/location-quick-setting/qs.ui"); + + gtk_widget_class_bind_template_child (widget_class, PhoshLocationQuickSetting, info); + + gtk_widget_class_bind_template_callback (widget_class, on_clicked); +} + + +static void +phosh_location_quick_setting_init (PhoshLocationQuickSetting *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + self->settings = g_settings_new (LOCATION_SETTINGS); + + g_settings_bind (self->settings, "enabled", + self, "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + + g_object_bind_property_full (self, "active", + self->info, "icon-name", + G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE, + transform_to_icon_name, + NULL, NULL, NULL); + + g_object_bind_property_full (self, "active", + self->info, "info", + G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE, + transform_to_label, + NULL, NULL, NULL); +} diff --git a/plugins/location-quick-setting/location-quick-setting.desktop.in.in b/plugins/location-quick-setting/location-quick-setting.desktop.in.in new file mode 100644 index 000000000..2abd43844 --- /dev/null +++ b/plugins/location-quick-setting/location-quick-setting.desktop.in.in @@ -0,0 +1,7 @@ +[Plugin] +# Translators: This is an internal id, no need to translate it +Id=@name@ +Name=Location Quick Setting +Types=quick-setting; +Comment=Toggle location services on/off +Plugin=@plugins_dir@/libphosh-plugin-@name@.so diff --git a/plugins/location-quick-setting/location-quick-setting.h b/plugins/location-quick-setting/location-quick-setting.h new file mode 100644 index 000000000..712080fd4 --- /dev/null +++ b/plugins/location-quick-setting/location-quick-setting.h @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2025 Phosh.mobi e.V. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Author: Gotam Gorabh + */ + + #pragma once + + #include "quick-setting.h" + +G_BEGIN_DECLS + +#define PHOSH_TYPE_LOCATION_QUICK_SETTING phosh_location_quick_setting_get_type () +G_DECLARE_FINAL_TYPE (PhoshLocationQuickSetting, + phosh_location_quick_setting, + PHOSH, LOCATION_QUICK_SETTING, PhoshQuickSetting) + +G_END_DECLS diff --git a/plugins/location-quick-setting/meson.build b/plugins/location-quick-setting/meson.build new file mode 100644 index 000000000..dc37f2be8 --- /dev/null +++ b/plugins/location-quick-setting/meson.build @@ -0,0 +1,42 @@ +name = 'location-quick-setting' + +location_quick_setting_resources = gnome.compile_resources( + 'phosh-plugin-location-quick-setting-resources', + 'phosh-plugin-location-quick-setting.gresources.xml', + c_name: 'phosh_plugin_location_quick_setting', +) + +location_quick_setting_plugin_sources = files( + 'location-quick-setting.c', + 'phosh-plugin-location-quick-setting.c', +) + +phosh_location_quick_setting_plugin = shared_module( + 'phosh-plugin-location-quick-setting', + location_quick_setting_plugin_sources, + location_quick_setting_resources, + c_args: [ + '-DG_LOG_DOMAIN="phosh-plugin-@0@"'.format(name), + '-DPLUGIN_NAME="@0@"'.format(name), + ], + dependencies: plugin_dep, + install: true, + install_dir: plugins_dir, +) + +pluginconf = configuration_data() +pluginconf.set('name', name) +pluginconf.set('plugins_dir', plugins_dir) + +i18n.merge_file( + input: configure_file( + input: name + '.desktop.in.in', + output: name + '.desktop.in', + configuration: pluginconf, + ), + output: name + '.plugin', + po_dir: join_paths(meson.project_source_root(), 'po'), + install: true, + install_dir: plugins_dir, + type: 'desktop', +) diff --git a/plugins/location-quick-setting/phosh-plugin-location-quick-setting.c b/plugins/location-quick-setting/phosh-plugin-location-quick-setting.c new file mode 100644 index 000000000..f82ad6015 --- /dev/null +++ b/plugins/location-quick-setting/phosh-plugin-location-quick-setting.c @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2025 Phosh.mobi e.V. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Author: Gotam Gorabh + */ + +#include "location-quick-setting.h" +#include "phosh-plugin.h" + +#include +#include + +char **g_io_phosh_plugin_location_quick_setting_query (void); + +void +g_io_module_load (GIOModule *module) +{ + g_type_module_use (G_TYPE_MODULE (module)); + + g_io_extension_point_implement (PHOSH_PLUGIN_EXTENSION_POINT_QUICK_SETTING_WIDGET, + PHOSH_TYPE_LOCATION_QUICK_SETTING, + PLUGIN_NAME, + 10); +} + +void +g_io_module_unload (GIOModule *module) +{ +} + +char ** +g_io_phosh_plugin_location_quick_setting_query (void) +{ + char *extension_points[] = {PHOSH_PLUGIN_EXTENSION_POINT_QUICK_SETTING_WIDGET, NULL}; + + return g_strdupv (extension_points); +} diff --git a/plugins/location-quick-setting/phosh-plugin-location-quick-setting.gresources.xml b/plugins/location-quick-setting/phosh-plugin-location-quick-setting.gresources.xml new file mode 100644 index 000000000..9ff154c1c --- /dev/null +++ b/plugins/location-quick-setting/phosh-plugin-location-quick-setting.gresources.xml @@ -0,0 +1,6 @@ + + + + qs.ui + + diff --git a/plugins/location-quick-setting/qs.ui b/plugins/location-quick-setting/qs.ui new file mode 100644 index 000000000..92a11b056 --- /dev/null +++ b/plugins/location-quick-setting/qs.ui @@ -0,0 +1,12 @@ + + + + + + 1 + 16 + + diff --git a/plugins/meson.build b/plugins/meson.build index c61402682..d09b52e0b 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -61,6 +61,7 @@ lockscreen_plugins = [ quick_setting_plugins = [ 'caffeine-quick-setting', 'dark-mode-quick-setting', + 'location-quick-setting', 'mobile-data-quick-setting', 'night-light-quick-setting', 'pomodoro-quick-setting', diff --git a/po/POTFILES.in b/po/POTFILES.in index 6fbe47547..d3568b9ad 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -7,6 +7,7 @@ plugins/calendar/calendar.desktop.in.in plugins/dark-mode-quick-setting/dark-mode-quick-setting.desktop.in.in plugins/emergency-info/emergency-info.desktop.in.in plugins/launcher-box/launcher-box.desktop.in.in +plugins/location-quick-setting/location-quick-setting.desktop.in.in plugins/media-players/media-players.desktop.in.in plugins/mobile-data-quick-setting/mobile-data-quick-setting.desktop.in.in plugins/night-light-quick-setting/night-light-quick-setting.desktop.in.in @@ -118,6 +119,7 @@ plugins/emergency-info/prefs/emergency-info-prefs.ui plugins/emergency-info/prefs/emergency-info-prefs-row.c plugins/emergency-info/prefs/emergency-info-prefs-row.ui plugins/launcher-box/launcher-box.ui +plugins/location-quick-setting/location-quick-setting.c plugins/media-players/media-players.ui plugins/mobile-data-quick-setting/mobile-data-quick-setting.c plugins/night-light-quick-setting/night-light-quick-setting.c -- GitLab