aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/messages-service-dbus.c28
-rw-r--r--src/messages-service-dbus.h6
-rw-r--r--src/messages-service.c79
-rw-r--r--src/messages-service.xml7
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">