static void bus_acquired (GDBusConnection *connection, const gchar *name, gpointer user_data) { IndicatorTestService *indicator = user_data; GError *error = NULL; indicator->actions_export_id = g_dbus_connection_export_action_group (connection, "/com/canonical/indicator/test", G_ACTION_GROUP (indicator->actions), &error); if (indicator->actions_export_id == 0) { g_warning ("cannot export action group: %s", error->message); g_error_free (error); return; } indicator->menu_export_id = g_dbus_connection_export_menu_model (connection, "/com/canonical/indicator/test/desktop", G_MENU_MODEL (indicator->menu), &error); if (indicator->menu_export_id == 0) { g_warning ("cannot export menu: %s", error->message); g_error_free (error); return; } }
static void gtk_application_impl_dbus_window_added (GtkApplicationImpl *impl, GtkWindow *window) { GtkApplicationImplDBus *dbus = (GtkApplicationImplDBus *) impl; GActionGroup *actions; gchar *path; guint id; if (!dbus->session || !GTK_IS_APPLICATION_WINDOW (window)) return; /* Export the action group of this window, based on its id */ actions = gtk_application_window_get_action_group (GTK_APPLICATION_WINDOW (window)); path = gtk_application_impl_dbus_get_window_path (dbus, window); id = g_dbus_connection_export_action_group (dbus->session, path, actions, NULL); g_free (path); g_object_set_qdata (G_OBJECT (window), gtk_application_impl_dbus_export_id_quark (), GUINT_TO_POINTER (id)); }
gboolean gtk_application_window_publish (GtkApplicationWindow *window, GDBusConnection *session, const gchar *object_path, guint object_id) { g_assert (window->priv->session == NULL); g_assert (window->priv->export_id == 0); g_assert (window->priv->object_path == NULL); g_assert (window->priv->id == 0); window->priv->export_id = g_dbus_connection_export_action_group (session, object_path, G_ACTION_GROUP (window->priv->actions), NULL); if (window->priv->export_id == 0) return FALSE; window->priv->session = session; window->priv->object_path = g_strdup (object_path); window->priv->id = object_id; return TRUE; }
int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *box; GtkWidget *button; GtkWidget *tv; GtkWidget *buttons; MenuHolder *holder; GMenuModel *model; GActionGroup *group; GDBusConnection *bus; GError *error = NULL; gboolean do_export = FALSE; gboolean do_import = FALSE; GOptionEntry entries[] = { { "export", 0, 0, G_OPTION_ARG_NONE, &do_export, "Export actions and menus over D-Bus", NULL }, { "import", 0, 0, G_OPTION_ARG_NONE, &do_import, "Use exported actions and menus", NULL }, { NULL, } }; gtk_init_with_args (&argc, &argv, NULL, entries, NULL, NULL); if (do_export && do_import) { g_error ("can't have it both ways\n"); exit (1); } window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (window, "delete-event", G_CALLBACK(on_delete_event), NULL); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_container_add (GTK_CONTAINER (window), box); bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); if (do_import) { g_print ("Getting menus from the bus...\n"); model = (GMenuModel*)g_dbus_menu_model_get (bus, BUS_NAME, OBJ_PATH); g_print ("Getting actions from the bus...\n"); group = (GActionGroup*)g_dbus_action_group_get (bus, BUS_NAME, OBJ_PATH); } else { group = get_group (); model = get_model (); tv = create_action_treeview (group); gtk_container_add (GTK_CONTAINER (box), tv); buttons = create_add_remove_buttons (group, model, tv); gtk_container_add (GTK_CONTAINER (box), buttons); } if (do_export) { g_print ("Exporting menus on the bus...\n"); if (!g_dbus_connection_export_menu_model (bus, OBJ_PATH, model, &error)) { g_warning ("Menu export failed: %s", error->message); exit (1); } g_print ("Exporting actions on the bus...\n"); if (!g_dbus_connection_export_action_group (bus, OBJ_PATH, group, &error)) { g_warning ("Action export failed: %s", error->message); exit (1); } g_bus_own_name_on_connection (bus, BUS_NAME, 0, NULL, NULL, NULL, NULL); } else { holder = menu_holder_new (model, group); button = gtk_button_new_with_label ("Click here"); g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), holder); gtk_container_add (GTK_CONTAINER (box), button); } gtk_widget_show_all (window); gtk_main (); return 0; }