static void gtk_application_window_real_map (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); /* XXX could eliminate this by tweaking gtk_window_map */ if (window->priv->menubar) gtk_widget_map (window->priv->menubar); #ifdef GDK_WINDOWING_WAYLAND { GdkWindow *gdkwindow; GtkApplication *application; application = gtk_window_get_application (GTK_WINDOW (window)); gdkwindow = gtk_widget_get_window (widget); if (GDK_IS_WAYLAND_WINDOW (gdkwindow) && window->priv->session) { gdk_wayland_window_set_dbus_properties_libgtk_only (gdkwindow, g_application_get_application_id (G_APPLICATION (application)), gtk_application_get_app_menu_object_path (application), gtk_application_get_menubar_object_path (application), window->priv->object_path, g_application_get_dbus_object_path (G_APPLICATION (application)), g_dbus_connection_get_unique_name (window->priv->session)); } } #endif GTK_WIDGET_CLASS (gtk_application_window_parent_class)->map (widget); }
static void gtk_application_window_real_realize (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); GtkApplication *application; GtkSettings *settings; application = gtk_window_get_application (GTK_WINDOW (window)); settings = gtk_widget_get_settings (widget); g_signal_connect (settings, "notify::gtk-shell-shows-app-menu", G_CALLBACK (gtk_application_window_shell_shows_app_menu_changed), window); g_signal_connect (settings, "notify::gtk-shell-shows-menubar", G_CALLBACK (gtk_application_window_shell_shows_menubar_changed), window); if (!window->priv->muxer_initialised) { g_action_muxer_insert (G_ACTION_MUXER (window->priv->muxer), "app", G_ACTION_GROUP (application)); g_action_muxer_insert (G_ACTION_MUXER (window->priv->muxer), "win", G_ACTION_GROUP (window)); window->priv->muxer_initialised = TRUE; } gtk_application_window_update_shell_shows_app_menu (window, settings); gtk_application_window_update_shell_shows_menubar (window, settings); gtk_application_window_update_menubar (window); gtk_application_window_update_accels (window); GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->realize (widget); #ifdef GDK_WINDOWING_X11 { GdkWindow *gdkwindow; gdkwindow = gtk_widget_get_window (GTK_WIDGET (window)); if (GDK_IS_X11_WINDOW (gdkwindow) && window->priv->session) { gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APPLICATION_ID", g_application_get_application_id (G_APPLICATION (application))); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name (window->priv->session)); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APPLICATION_OBJECT_PATH", g_application_get_dbus_object_path (G_APPLICATION (application))); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_WINDOW_OBJECT_PATH", window->priv->object_path); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APP_MENU_OBJECT_PATH", gtk_application_get_app_menu_object_path (application)); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_MENUBAR_OBJECT_PATH", gtk_application_get_menubar_object_path (application)); } } #endif }
/* Quit running application and restart application */ static gboolean _restart(XfdashboardApplication *inApplication) { GMainLoop *mainLoop; guint dbusWatcherID; GSource *timeoutSource; RestartData restartData; g_return_val_if_fail(XFDASHBOARD_IS_APPLICATION(inApplication), FALSE); /* Create main loop for watching DBUS for application to disappear */ mainLoop=g_main_loop_new(NULL, FALSE); /* Set up user data for callbacks */ restartData.mainLoop=mainLoop; restartData.application=inApplication; restartData.appHasQuitted=FALSE; /* Set up DBUS watcher to get noticed when application disappears * which means it is safe to start a new instance. But if it takes * too long assume that either application did not quit and is still * running or we did get notified although we set up DBUS watcher * before quitting application. */ dbusWatcherID=g_bus_watch_name(G_BUS_TYPE_SESSION, g_application_get_application_id(G_APPLICATION(inApplication)), G_BUS_NAME_WATCHER_FLAGS_NONE, _on_dbus_watcher_name_appeared, _on_dbus_watcher_name_vanished, &restartData, NULL); /* Add an idle source to main loop to quit running application _after_ * the main loop is running and the DBUS watcher was set up. */ timeoutSource=g_timeout_source_new(DEFAULT_RESTART_WAIT_TIMEOUT); g_source_set_callback(timeoutSource, _on_quit_timeout, &restartData, NULL); g_source_attach(timeoutSource, g_main_loop_get_context(mainLoop)); g_source_unref(timeoutSource); /* Run main loop */ g_debug("Starting main loop for waiting the application to quit"); g_main_loop_run(mainLoop); g_debug("Returned from main loop for waiting the application to quit"); /* Show warning if timeout had been reached */ if(!restartData.appHasQuitted) { g_warning(_("Cannot restart application: Failed to quit running instance")); } /* Destroy DBUS watcher */ g_bus_unwatch_name(dbusWatcherID); /* Return TRUE if application was quitted successfully * otherwise FALSE. */ return(restartData.appHasQuitted); }
static void gtk_application_window_real_realize (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); GtkApplication *application; GtkSettings *settings; application = gtk_window_get_application (GTK_WINDOW (window)); settings = gtk_widget_get_settings (widget); g_signal_connect (settings, "notify::gtk-shell-shows-app-menu", G_CALLBACK (gtk_application_window_shell_shows_app_menu_changed), window); g_signal_connect (settings, "notify::gtk-shell-shows-menubar", G_CALLBACK (gtk_application_window_shell_shows_menubar_changed), window); gtk_application_window_update_shell_shows_app_menu (window, settings); gtk_application_window_update_shell_shows_menubar (window, settings); gtk_application_window_update_menubar (window); /* Update the accelerators, and ensure we do again * if the accel map changes */ gtk_application_window_update_accels (window); window->priv->accel_map_changed_id = g_signal_connect_swapped (gtk_accel_map_get (), "changed", G_CALLBACK (gtk_application_window_update_accels), window); GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->realize (widget); #ifdef GDK_WINDOWING_X11 { GdkWindow *gdkwindow; gdkwindow = gtk_widget_get_window (GTK_WIDGET (window)); if (GDK_IS_X11_WINDOW (gdkwindow) && window->priv->session) { gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APPLICATION_ID", g_application_get_application_id (G_APPLICATION (application))); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name (window->priv->session)); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APPLICATION_OBJECT_PATH", g_application_get_dbus_object_path (G_APPLICATION (application))); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_WINDOW_OBJECT_PATH", window->priv->object_path); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APP_MENU_OBJECT_PATH", gtk_application_get_app_menu_object_path (application)); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_MENUBAR_OBJECT_PATH", gtk_application_get_menubar_object_path (application)); } } #endif }
static void gtk_application_startup_x11 (GtkApplication *application) { const gchar *application_id; application_id = g_application_get_application_id (G_APPLICATION (application)); application->priv->session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); application->priv->object_path = object_path_from_appid (application_id); gtk_application_startup_session_dbus (GTK_APPLICATION (application)); }
static gchar * pk_guess_application_id (void) { GApplication *app; const gchar *app_id; app = g_application_get_default (); if (app == NULL) return NULL; app_id = g_application_get_application_id (app); if (app_id == NULL) return NULL; return g_strconcat (app_id, ".desktop", NULL); }
static void g_application_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GApplication *application = G_APPLICATION (object); switch (prop_id) { case PROP_APPLICATION_ID: g_value_set_string (value, g_application_get_application_id (application)); break; case PROP_FLAGS: g_value_set_flags (value, g_application_get_flags (application)); break; case PROP_IS_REGISTERED: g_value_set_boolean (value, g_application_get_is_registered (application)); break; case PROP_IS_REMOTE: g_value_set_boolean (value, g_application_get_is_remote (application)); break; case PROP_INACTIVITY_TIMEOUT: g_value_set_uint (value, g_application_get_inactivity_timeout (application)); break; default: g_assert_not_reached (); } }
static gboolean gsound_context_real_init(GInitable *initable, GCancellable *cancellable, GError **error) { GSoundContext *self = GSOUND_CONTEXT(initable); if (self->priv->ca) return TRUE; int success = ca_context_create(&self->priv->ca); if (!test_return(success, error)) return FALSE; /* Set a couple of attributes here if we can */ ca_proplist *pl; ca_proplist_create(&pl); ca_proplist_sets(pl, CA_PROP_APPLICATION_NAME, g_get_application_name()); if (g_application_get_default()) { GApplication *app = g_application_get_default (); ca_proplist_sets(pl, CA_PROP_APPLICATION_ID, g_application_get_application_id(app)); } success = ca_context_change_props_full(self->priv->ca, pl); ca_proplist_destroy(pl); if (!test_return(success, error)) { ca_context_destroy(self->priv->ca); self->priv->ca = NULL; } return TRUE; }
void gd_show_about_dialog (GtkWindow *parent) { GApplication *app; const char *artists[] = { "Jakub Steiner <*****@*****.**>", NULL }; const char *authors[] = { "Cosimo Cecchi <*****@*****.**>", "Florian Müllner <*****@*****.**>", "William Jon McCann <*****@*****.**>", "Bastien Nocera <*****@*****.**>", NULL }; const char *app_id; app = g_application_get_default (); app_id = g_application_get_application_id (app); gtk_show_about_dialog (parent, "artists", artists, "authors", authors, "translator-credits", _("translator-credits"), "comments", _("A document manager application"), "logo-icon-name", app_id, "website", "https://wiki.gnome.org/Apps/Documents", "copyright", "Copyright © 2011-2014 Red Hat, Inc.", "license-type", GTK_LICENSE_GPL_2_0, "version", PACKAGE_VERSION, "wrap-license", TRUE, NULL); }
static void gtk_application_impl_dbus_startup (GtkApplicationImpl *impl, gboolean register_session) { GtkApplicationImplDBus *dbus = (GtkApplicationImplDBus *) impl; static gchar *client_id; GError *error = NULL; GVariant *res; dbus->session = g_application_get_dbus_connection (G_APPLICATION (impl->application)); if (!dbus->session) return; dbus->application_id = g_application_get_application_id (G_APPLICATION (impl->application)); dbus->object_path = g_application_get_dbus_object_path (G_APPLICATION (impl->application)); dbus->unique_name = g_dbus_connection_get_unique_name (dbus->session); if (client_id == NULL) { const gchar *desktop_autostart_id; desktop_autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID"); /* Unset DESKTOP_AUTOSTART_ID in order to avoid child processes to * use the same client id. */ g_unsetenv ("DESKTOP_AUTOSTART_ID"); client_id = g_strdup (desktop_autostart_id ? desktop_autostart_id : ""); } g_debug ("Connecting to session manager"); dbus->sm_proxy = g_dbus_proxy_new_sync (dbus->session, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, NULL, "org.gnome.SessionManager", "/org/gnome/SessionManager", "org.gnome.SessionManager", NULL, &error); if (error) { g_warning ("Failed to get a session proxy: %s", error->message); g_error_free (error); return; } /* FIXME: should we reuse the D-Bus application id here ? */ dbus->app_id = g_strdup (g_get_prgname ()); if (!register_session) return; g_debug ("Registering client '%s' '%s'", dbus->app_id, client_id); res = g_dbus_proxy_call_sync (dbus->sm_proxy, "RegisterClient", g_variant_new ("(ss)", dbus->app_id, client_id), G_DBUS_CALL_FLAGS_NONE, G_MAXINT, NULL, &error); if (error) { g_warning ("Failed to register client: %s", error->message); g_error_free (error); g_clear_object (&dbus->sm_proxy); return; } g_variant_get (res, "(o)", &dbus->client_path); g_variant_unref (res); g_debug ("Registered client at '%s'", dbus->client_path); dbus->client_proxy = g_dbus_proxy_new_sync (dbus->session, 0, NULL, "org.gnome.SessionManager", dbus->client_path, "org.gnome.SessionManager.ClientPrivate", NULL, &error); if (error) { g_warning ("Failed to get client proxy: %s", error->message); g_error_free (error); g_clear_object (&dbus->sm_proxy); g_free (dbus->client_path); dbus->client_path = NULL; return; } g_signal_connect (dbus->client_proxy, "g-signal", G_CALLBACK (client_proxy_signal), dbus); }
static void gtk_application_impl_dbus_startup (GtkApplicationImpl *impl, gboolean register_session) { GtkApplicationImplDBus *dbus = (GtkApplicationImplDBus *) impl; static gchar *client_id; GError *error = NULL; GVariant *res; gboolean same_bus; const char *bus_name; const char *client_interface; dbus->session = g_application_get_dbus_connection (G_APPLICATION (impl->application)); if (!dbus->session) goto out; dbus->application_id = g_application_get_application_id (G_APPLICATION (impl->application)); dbus->object_path = g_application_get_dbus_object_path (G_APPLICATION (impl->application)); dbus->unique_name = g_dbus_connection_get_unique_name (dbus->session); if (client_id == NULL) { const gchar *desktop_autostart_id; desktop_autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID"); /* Unset DESKTOP_AUTOSTART_ID in order to avoid child processes to * use the same client id. */ g_unsetenv ("DESKTOP_AUTOSTART_ID"); client_id = g_strdup (desktop_autostart_id ? desktop_autostart_id : ""); } g_debug ("Connecting to session manager"); /* Try the GNOME session manager first */ dbus->sm_proxy = gtk_application_get_proxy_if_service_present (dbus->session, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START | G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, GNOME_DBUS_NAME, GNOME_DBUS_OBJECT_PATH, GNOME_DBUS_INTERFACE, &error); if (error) { g_warning ("Failed to get the GNOME session proxy: %s", error->message); g_clear_error (&error); } if (!dbus->sm_proxy) { /* Fallback to trying the Xfce session manager */ dbus->sm_proxy = gtk_application_get_proxy_if_service_present (dbus->session, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START | G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, XFCE_DBUS_NAME, XFCE_DBUS_OBJECT_PATH, XFCE_DBUS_INTERFACE, &error); if (error) { g_warning ("Failed to get the Xfce session proxy: %s", error->message); g_clear_error (&error); goto out; } } if (!register_session) goto out; g_debug ("Registering client '%s' '%s'", dbus->application_id, client_id); res = g_dbus_proxy_call_sync (dbus->sm_proxy, "RegisterClient", g_variant_new ("(ss)", dbus->application_id, client_id), G_DBUS_CALL_FLAGS_NONE, G_MAXINT, NULL, &error); if (error) { g_warning ("Failed to register client: %s", error->message); g_clear_error (&error); g_clear_object (&dbus->sm_proxy); goto out; } g_variant_get (res, "(o)", &dbus->client_path); g_variant_unref (res); g_debug ("Registered client at '%s'", dbus->client_path); if (g_str_equal (g_dbus_proxy_get_name (dbus->sm_proxy), GNOME_DBUS_NAME)) { bus_name = GNOME_DBUS_NAME; client_interface = GNOME_DBUS_CLIENT_INTERFACE; } else { bus_name = XFCE_DBUS_NAME; client_interface = XFCE_DBUS_CLIENT_INTERFACE; } dbus->client_proxy = g_dbus_proxy_new_sync (dbus->session, 0, NULL, bus_name, dbus->client_path, client_interface, NULL, &error); if (error) { g_warning ("Failed to get client proxy: %s", error->message); g_clear_error (&error); g_free (dbus->client_path); dbus->client_path = NULL; goto out; } g_signal_connect (dbus->client_proxy, "g-signal", G_CALLBACK (client_proxy_signal), dbus); out: same_bus = FALSE; if (dbus->session) { const gchar *id; const gchar *id2; GValue value = G_VALUE_INIT; g_value_init (&value, G_TYPE_STRING); gdk_screen_get_setting (gdk_screen_get_default (), "gtk-session-bus-id", &value); id = g_value_get_string (&value); if (id && id[0]) { res = g_dbus_connection_call_sync (dbus->session, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "GetId", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL); if (res) { g_variant_get (res, "(&s)", &id2); if (g_strcmp0 (id, id2) == 0) same_bus = TRUE; g_variant_unref (res); } } else same_bus = TRUE; g_value_unset (&value); } if (!same_bus) g_object_set (gtk_settings_get_default (), "gtk-shell-shows-app-menu", FALSE, "gtk-shell-shows-menubar", FALSE, NULL); if (dbus->sm_proxy == NULL) { dbus->inhibit_proxy = gtk_application_get_proxy_if_service_present (dbus->session, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop", "org.freedesktop.portal.Inhibit", &error); if (error) { g_warning ("Failed to get an inhibit portal proxy: %s", error->message); g_clear_error (&error); } } }