diff --git a/meson.build b/meson.build index 47f8522ca30fdbe930eeaeb842cdb223ef617de0..a50749bef68f24984bc44ac7107e6cd36bb7151f 100644 --- a/meson.build +++ b/meson.build @@ -8,12 +8,15 @@ project( app_id = 'mobi.phosh.MobileSettings' +top_inc = include_directories('.') + prefix = get_option('prefix') bindir = prefix / get_option('bindir') datadir = prefix / get_option('datadir') libdir = prefix / get_option('libdir') pkgdatadir = datadir / meson.project_name() pkglibdir = libdir / meson.project_name() +libexecdir = join_paths(prefix, get_option('libexecdir')) ms_plugins_dir = prefix / libdir / 'phosh-mobile-settings' / 'plugins' glib_ver = '2.76' diff --git a/src/meson.build b/src/meson.build index 100b924321cc230c47319ede1cdefc18ee0ea2cd..ea4ba64e880dbbea0527c175cfbd926bf4577311 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,5 +1,6 @@ subdir('dbus') subdir('pmos-tweaks') +subdir('search-provider') mobile_settings_enum_sources = gnome.mkenums_simple( 'ms-enum-types', diff --git a/src/search-provider/meson.build b/src/search-provider/meson.build new file mode 100644 index 0000000000000000000000000000000000000000..87c2cf095658326de024905ca1d4f356a286954a --- /dev/null +++ b/src/search-provider/meson.build @@ -0,0 +1,47 @@ +service_conf = configuration_data() +service_conf.set('libexecdir', libexecdir) + +service = 'mobi.phosh.MobileSettings.service' + +configure_file( + input : service + '.in', + output : service, + install : true, + install_dir : join_paths(datadir, 'dbus-1', 'services'), + configuration : service_conf +) + +install_data( + 'mobi.phosh.MobileSettings.search-provider.ini', + install_dir: join_paths(datadir, 'gnome-shell', 'search-providers') +) + +sources = files( + 'ms-search-provider.c', + 'ms-search-provider-app.c' +) + +sources += gnome.gdbus_codegen( + 'ms-shell-search-provider-generated', + 'mobi.phosh.ShellSearchProvider2.xml', + interface_prefix : 'mobi.phosh.', + namespace : 'Ms' +) + +search_provider_deps = [ + gio_dep, + gio_unix_dep, + glib_dep, + gtk_dep, + adwaita_dep, +] + +executable( + 'phosh-mobile-settings-search-provider', + sources, + include_directories : top_inc, + dependencies : search_provider_deps, + install : true, + install_dir : libexecdir +) + diff --git a/src/search-provider/mobi.phosh.MobileSettings.search-provider.ini b/src/search-provider/mobi.phosh.MobileSettings.search-provider.ini new file mode 100644 index 0000000000000000000000000000000000000000..37b5685ffcf3beaefe200e6f32b720f6f10aab13 --- /dev/null +++ b/src/search-provider/mobi.phosh.MobileSettings.search-provider.ini @@ -0,0 +1,5 @@ +[Shell Search Provider] +DesktopId=mobi.phosh.MobileSettings.desktop +BusName=mobi.phosh.MobileSettings.SearchProvider +ObjectPath=/mobi/phosh/MobileSettings/SearchProvider +Version=2 diff --git a/src/search-provider/mobi.phosh.MobileSettings.service.in b/src/search-provider/mobi.phosh.MobileSettings.service.in new file mode 100644 index 0000000000000000000000000000000000000000..df5ad5565335dadbd40f8dacff3df25a7c8db6e8 --- /dev/null +++ b/src/search-provider/mobi.phosh.MobileSettings.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=mobi.phosh.MobileSettings.SearchProvider +Exec=@libexecdir@/phosh-mobile-settings-search-provider diff --git a/src/search-provider/mobi.phosh.ShellSearchProvider2.xml b/src/search-provider/mobi.phosh.ShellSearchProvider2.xml new file mode 100644 index 0000000000000000000000000000000000000000..9502340e4633e2885c9beaec31248161ee46000b --- /dev/null +++ b/src/search-provider/mobi.phosh.ShellSearchProvider2.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/search-provider/ms-search-provider-app.c b/src/search-provider/ms-search-provider-app.c new file mode 100644 index 0000000000000000000000000000000000000000..262052bb44131fb177bd4ccbd20251631d95fafb --- /dev/null +++ b/src/search-provider/ms-search-provider-app.c @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2024 Tether Operations Limited + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Author: Gotam Gorabh + */ + +/* + * Inspired by gnome-control-center search provider: + * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/control-center-search-provider.h + * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/control-center-search-provider.c + * + */ + +#include "mobile-settings-config.h" + +#include +#include + +#include + +#include "ms-search-provider.h" +#include "ms-search-provider-app.h" + +G_DEFINE_TYPE (MsSearchProviderApp, ms_search_provider_app, GTK_TYPE_APPLICATION); + +static gboolean +ms_search_provider_app_dbus_register (GApplication *application, + GDBusConnection *connection, + const gchar *object_path, + GError **error) +{ + MsSearchProviderApp *self; + + if (!G_APPLICATION_CLASS (ms_search_provider_app_parent_class)->dbus_register (application, + connection, + object_path, + error)) + return FALSE; + + self = MS_SEARCH_PROVIDER_APP (application); + + return ms_search_provider_dbus_register (self->search_provider, connection, + object_path, error); +} + +static void +ms_search_provider_app_dbus_unregister (GApplication *application, + GDBusConnection *connection, + const gchar *object_path) +{ + MsSearchProviderApp *self; + + self = MS_SEARCH_PROVIDER_APP (application); + if (self->search_provider) + ms_search_provider_dbus_unregister (self->search_provider, connection, object_path); + + G_APPLICATION_CLASS (ms_search_provider_app_parent_class)->dbus_unregister (application, + connection, + object_path); +} + +static void +ms_search_provider_app_dispose (GObject *object) +{ + MsSearchProviderApp *self; + + self = MS_SEARCH_PROVIDER_APP (object); + + g_clear_object (&self->search_provider); + + G_OBJECT_CLASS (ms_search_provider_app_parent_class)->dispose (object); +} + +static void +ms_search_provider_app_init (MsSearchProviderApp *self) +{ + self->search_provider = ms_search_provider_new (); +} + +static void +ms_search_provider_app_startup (GApplication *application) +{ +} + +static void +ms_search_provider_app_class_init (MsSearchProviderAppClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GApplicationClass *app_class = G_APPLICATION_CLASS (klass); + + object_class->dispose = ms_search_provider_app_dispose; + + app_class->dbus_register = ms_search_provider_app_dbus_register; + app_class->dbus_unregister = ms_search_provider_app_dbus_unregister; + app_class->startup = ms_search_provider_app_startup; +} + +MsSearchProviderApp * +ms_search_provider_app_get (void) +{ + static MsSearchProviderApp *singleton; + + if (singleton) + return singleton; + + singleton = g_object_new (MS_TYPE_SEARCH_PROVIDER_APP, + "application-id", "mobi.phosh.MobileSettings.SearchProvider", + "flags", G_APPLICATION_IS_SERVICE, + NULL); + + return singleton; +} + +int main (int argc, char **argv) +{ + GApplication *app; + + app = G_APPLICATION (ms_search_provider_app_get ()); + return g_application_run (app, argc, argv); +} diff --git a/src/search-provider/ms-search-provider-app.h b/src/search-provider/ms-search-provider-app.h new file mode 100644 index 0000000000000000000000000000000000000000..2919a73dcaa3e27db6e0d3735d4c291242dccf62 --- /dev/null +++ b/src/search-provider/ms-search-provider-app.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2024 Tether Operations Limited + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* + * Inspired by gnome-control-center search provider: + * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/control-center-search-provider.h + * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/control-center-search-provider.c + * + */ + +#pragma once + +#include + +#include "ms-search-provider.h" + +G_BEGIN_DECLS + +typedef struct { + GtkApplication parent; + + MsSearchProvider *search_provider; +} MsSearchProviderApp; + +typedef struct { + GtkApplicationClass parent_class; +} MsSearchProviderAppClass; + +#define MS_TYPE_SEARCH_PROVIDER_APP ms_search_provider_app_get_type () + +#define MS_SEARCH_PROVIDER_APP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + MS_TYPE_SEARCH_PROVIDER_APP, MsSearchProviderApp)) + +GType ms_search_provider_app_get_type (void) G_GNUC_CONST; + +MsSearchProviderApp *ms_search_provider_app_get (void); + +G_END_DECLS diff --git a/src/search-provider/ms-search-provider.c b/src/search-provider/ms-search-provider.c new file mode 100644 index 0000000000000000000000000000000000000000..53fda770fc530a9b2a1bd0c47c42c550e2198934 --- /dev/null +++ b/src/search-provider/ms-search-provider.c @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2024 Tether Operations Limited + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Author: Gotam Gorabh + */ + +/* + * Inspired by gnome-control-center search provider: + * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/cc-search-provider.h + * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/cc-search-provider.c + * + */ + +#include "mobile-settings-config.h" + +#include +#include +#include +#include +#include + +#include "ms-search-provider-app.h" +#include "ms-search-provider.h" + +struct _MsSearchProvider +{ + GObject parent; + + MsOrgGnomeShellSearchProvider2 *skeleton; +}; + +G_DEFINE_TYPE (MsSearchProvider, ms_search_provider, G_TYPE_OBJECT) + +static gboolean +handle_get_initial_result_set (MsSearchProvider *self, + GDBusMethodInvocation *invocation, + char **terms) +{ + return TRUE; +} + +static gboolean +handle_get_subsearch_result_set (MsSearchProvider *self, + GDBusMethodInvocation *invocation, + char **previous_results, + char **terms) +{ + return TRUE; +} + +static gboolean +handle_get_result_metas (MsSearchProvider *self, + GDBusMethodInvocation *invocation, + char **results) +{ + return TRUE; +} + +static gboolean +handle_activate_result (MsSearchProvider *self, + GDBusMethodInvocation *invocation, + char *identifier, + char **results, + guint timestamp) +{ + return TRUE; +} + +static gboolean +handle_launch_search (MsSearchProvider *self, + GDBusMethodInvocation *invocation, + char **terms, + guint timestamp) +{ + return TRUE; +} + +static void +ms_search_provider_init (MsSearchProvider *self) +{ + self->skeleton = ms_org_gnome_shell_search_provider2_skeleton_new (); + + g_signal_connect_swapped (self->skeleton, "handle-get-initial-result-set", + G_CALLBACK (handle_get_initial_result_set), self); + g_signal_connect_swapped (self->skeleton, "handle-get-subsearch-result-set", + G_CALLBACK (handle_get_subsearch_result_set), self); + g_signal_connect_swapped (self->skeleton, "handle-get-result-metas", + G_CALLBACK (handle_get_result_metas), self); + g_signal_connect_swapped (self->skeleton, "handle-activate-result", + G_CALLBACK (handle_activate_result), self); + g_signal_connect_swapped (self->skeleton, "handle-launch-search", + G_CALLBACK (handle_launch_search), self); +} + +gboolean +ms_search_provider_dbus_register (MsSearchProvider *self, + GDBusConnection *connection, + const gchar *object_path, + GError **error) +{ + GDBusInterfaceSkeleton *skeleton; + + skeleton = G_DBUS_INTERFACE_SKELETON (self->skeleton); + + return g_dbus_interface_skeleton_export (skeleton, connection, object_path, error); +} + +void +ms_search_provider_dbus_unregister (MsSearchProvider *self, + GDBusConnection *connection, + const gchar *object_path) +{ + GDBusInterfaceSkeleton *skeleton; + + skeleton = G_DBUS_INTERFACE_SKELETON (self->skeleton); + + if (g_dbus_interface_skeleton_has_connection (skeleton, connection)) + g_dbus_interface_skeleton_unexport_from_connection (skeleton, connection); +} + +static void +ms_search_provider_dispose (GObject *object) +{ + MsSearchProvider *self; + + self = MS_SEARCH_PROVIDER (object); + + g_clear_object (&self->skeleton); + + G_OBJECT_CLASS (ms_search_provider_parent_class)->dispose (object); +} + +static void +ms_search_provider_class_init (MsSearchProviderClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = ms_search_provider_dispose; +} + +MsSearchProvider * +ms_search_provider_new (void) +{ + return g_object_new (MS_TYPE_SEARCH_PROVIDER, NULL); +} + diff --git a/src/search-provider/ms-search-provider.h b/src/search-provider/ms-search-provider.h new file mode 100644 index 0000000000000000000000000000000000000000..38ed65f9ea68b31f7819881842793064a3906acb --- /dev/null +++ b/src/search-provider/ms-search-provider.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2024 Tether Operations Limited + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* + * Inspired by gnome-control-center search provider: + * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/cc-search-provider.h + * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/cc-search-provider.c + * + */ + +#pragma once + +#include +#include +#include "ms-shell-search-provider-generated.h" + +G_BEGIN_DECLS + +#define MS_TYPE_SEARCH_PROVIDER (ms_search_provider_get_type()) + +G_DECLARE_FINAL_TYPE (MsSearchProvider, ms_search_provider, MS, SEARCH_PROVIDER, GObject) + +MsSearchProvider *ms_search_provider_new (void); + +gboolean ms_search_provider_dbus_register (MsSearchProvider *provider, + GDBusConnection *connection, + const char *object_path, + GError **error); +void ms_search_provider_dbus_unregister (MsSearchProvider *provider, + GDBusConnection *connection, + const char *object_path); + +G_END_DECLS