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 0000000000000000000000000000000000000000..9c05a5d11d31c2b965f5e43551494773d8ad8f78 --- /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 0000000000000000000000000000000000000000..2abd4384485b5b635d8422c74a50a12da9c2ed18 --- /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 0000000000000000000000000000000000000000..712080fd4a049c4ff99f6b537072041c98159179 --- /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 0000000000000000000000000000000000000000..dc37f2be8fede946ad768bcc3d47b78896ba6954 --- /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 0000000000000000000000000000000000000000..f82ad6015525573ebaed0041d57787e1a2e30e84 --- /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 0000000000000000000000000000000000000000..9ff154c1c9f532400930215eede7113b3d03677f --- /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 0000000000000000000000000000000000000000..92a11b0563f4378b9637988301180d49c8b85046 --- /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 c61402682f84f41ce831e8a39d87a83fa5dd1c54..d09b52e0b8d04ae5a5d892cfa061a3329d258794 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 6fbe4754785b73a30f5f0bb05aa3e2e72994cab7..d3568b9ad60dae9f9556df9914193cad10d2c82b 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