diff options
-rw-r--r-- | src/messages-service-dbus.c | 28 | ||||
-rw-r--r-- | src/messages-service-dbus.h | 6 | ||||
-rw-r--r-- | src/messages-service.c | 79 | ||||
-rw-r--r-- | src/messages-service.xml | 7 |
4 files changed, 111 insertions, 9 deletions
diff --git a/src/messages-service-dbus.c b/src/messages-service-dbus.c index 2b72f2e..fec15e9 100644 --- a/src/messages-service-dbus.c +++ b/src/messages-service-dbus.c @@ -32,6 +32,8 @@ with this program. If not, see <http://www.gnu.org/licenses/>. enum { ATTENTION_CHANGED, ICON_CHANGED, + REGISTER_APPLICATION, + UNREGISTER_APPLICATION, LAST_SIGNAL }; @@ -101,6 +103,22 @@ message_service_dbus_class_init (MessageServiceDbusClass *klass) g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + signals[REGISTER_APPLICATION] = g_signal_new(MESSAGE_SERVICE_DBUS_SIGNAL_REGISTER_APPLICATION, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); + + signals[UNREGISTER_APPLICATION] = g_signal_new(MESSAGE_SERVICE_DBUS_SIGNAL_UNREGISTER_APPLICATION, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + if (bus_node_info == NULL) { GError * error = NULL; @@ -418,6 +436,16 @@ bus_method_call (GDBusConnection * connection, const gchar * sender, const gchar message_service_dbus_set_attention(ms, FALSE); g_dbus_method_invocation_return_value(invocation, NULL); return; + } else if (g_strcmp0("RegisterApplication", method) == 0) { + const gchar *desktop_id, *object_path; + g_variant_get(params, "(&s&o)", &desktop_id, &object_path); + g_signal_emit(ms, signals[REGISTER_APPLICATION], 0, desktop_id, object_path); + g_dbus_method_invocation_return_value(invocation, NULL); + } else if (g_strcmp0("UnregisterApplication", method) == 0) { + const gchar *desktop_id; + g_variant_get(params, "(&s)", &desktop_id); + g_signal_emit(ms, signals[UNREGISTER_APPLICATION], 0, desktop_id); + g_dbus_method_invocation_return_value(invocation, NULL); } else { g_warning("Unknown function call '%s'", method); } diff --git a/src/messages-service-dbus.h b/src/messages-service-dbus.h index 7a8574e..f95b61b 100644 --- a/src/messages-service-dbus.h +++ b/src/messages-service-dbus.h @@ -35,8 +35,10 @@ G_BEGIN_DECLS #define IS_MESSAGE_SERVICE_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MESSAGE_SERVICE_DBUS_TYPE)) #define MESSAGE_SERVICE_DBUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MESSAGE_SERVICE_DBUS_TYPE, MessageServiceDbusClass)) -#define MESSAGE_SERVICE_DBUS_SIGNAL_ATTENTION_CHANGED "attention-changed" -#define MESSAGE_SERVICE_DBUS_SIGNAL_ICON_CHANGED "icon-changed" +#define MESSAGE_SERVICE_DBUS_SIGNAL_ATTENTION_CHANGED "attention-changed" +#define MESSAGE_SERVICE_DBUS_SIGNAL_ICON_CHANGED "icon-changed" +#define MESSAGE_SERVICE_DBUS_SIGNAL_REGISTER_APPLICATION "register-application" +#define MESSAGE_SERVICE_DBUS_SIGNAL_UNREGISTER_APPLICATION "unregister-application" typedef struct _MessageServiceDbus MessageServiceDbus; typedef struct _MessageServiceDbusClass MessageServiceDbusClass; diff --git a/src/messages-service.c b/src/messages-service.c index cfc07fc..7c1a2b5 100644 --- a/src/messages-service.c +++ b/src/messages-service.c @@ -47,20 +47,17 @@ static GMainLoop * mainloop = NULL; static MessageServiceDbus * dbus_interface = NULL; -/* This function turns a specific desktop id into a menu - item and registers it appropriately with everyone */ -static gboolean -build_launcher (gpointer data) +static void +add_application (const gchar *desktop_id, + const gchar *menu_path) { - gchar *desktop_id = data; GDesktopAppInfo *appinfo; const gchar *desktop_file; appinfo = g_desktop_app_info_new (desktop_id); if (!appinfo) { g_warning ("could not find a desktop file with id '%s'\n", desktop_id); - g_free (desktop_id); - return FALSE; + return; } desktop_file = g_desktop_app_info_get_filename (appinfo); @@ -77,6 +74,17 @@ build_launcher (gpointer data) } g_object_unref (appinfo); +} + +/* This function turns a specific desktop id into a menu + item and registers it appropriately with everyone */ +static gboolean +build_launcher (gpointer data) +{ + gchar *desktop_id = data; + + add_application (desktop_id, NULL); + g_free (desktop_id); return FALSE; } @@ -128,6 +136,58 @@ clear_action_handler (MessageServiceDbus *msd, g_simple_action_set_enabled (action, attention); } +static void +register_application (MessageServiceDbus *msd, + const gchar *desktop_id, + const gchar *menu_path, + gpointer user_data) +{ + gchar **applications = g_settings_get_strv (settings, "applications"); + gchar **app; + + for (app = applications; *app; app++) { + if (!g_strcmp0 (desktop_id, *app)) + break; + } + + if (*app == NULL) { + GVariantBuilder builder; + + g_variant_builder_init (&builder, (GVariantType *)"as"); + for (app = applications; *app; app++) + g_variant_builder_add (&builder, "s", *app); + g_variant_builder_add (&builder, "s", desktop_id); + + g_settings_set_value (settings, "applications", + g_variant_builder_end (&builder)); + + add_application (desktop_id, menu_path); + } + + g_strfreev (applications); +} + +static void +unregister_application (MessageServiceDbus *msd, + const gchar *desktop_id, + gpointer user_data) +{ + gchar **applications = g_settings_get_strv (settings, "applications"); + gchar **app; + GVariantBuilder builder; + + g_variant_builder_init (&builder, (GVariantType *)"as"); + for (app = applications; *app; app++) { + if (g_strcmp0 (desktop_id, *app)) + g_variant_builder_add (&builder, "s", *app); + } + + g_settings_set_value (settings, "applications", + g_variant_builder_end (&builder)); + + g_strfreev (applications); +} + int main (int argc, char ** argv) { @@ -175,6 +235,11 @@ main (int argc, char ** argv) G_CALLBACK(clear_action_handler), g_action_map_lookup_action (G_ACTION_MAP (actions), "clear")); + g_signal_connect (dbus_interface, MESSAGE_SERVICE_DBUS_SIGNAL_REGISTER_APPLICATION, + G_CALLBACK (register_application), NULL); + g_signal_connect (dbus_interface, MESSAGE_SERVICE_DBUS_SIGNAL_UNREGISTER_APPLICATION, + G_CALLBACK (unregister_application), NULL); + status_items = status_items_build (g_action_map_lookup_action (G_ACTION_MAP (actions), "status")); menu = g_menu_new (); diff --git a/src/messages-service.xml b/src/messages-service.xml index d79049e..a560187 100644 --- a/src/messages-service.xml +++ b/src/messages-service.xml @@ -10,6 +10,13 @@ <arg type="b" name="hidden" direction="out" /> </method> <method name="ClearAttention" /> + <method name="RegisterApplication"> + <arg type="s" name="desktop_id" direction="in" /> + <arg type="o" name="menu_path" direction="in" /> + </method> + <method name="UnregisterApplication"> + <arg type="s" name="desktop_id" direction="in" /> + </method> <!-- Signals --> <signal name="AttentionChanged"> |