gtk2/gtk/gtkapplication-x11.c
Giovanni Campagna cecb2fa3ca GtkApplicationX11: read the startup ID from the platform data
If the platform data passed with actions and activations includes
a startup notify ID, we should read it and pass it down to GDK.
This ensures that the right startup notify is completed after the
signal emission, and that the user time of the GdkDisplay is properly
updated (which in turn makes sure the windows are not subjected
to focus-stealing-prevention)

https://bugzilla.gnome.org/show_bug.cgi?id=721304
2014-01-02 21:17:22 +01:00

105 lines
3.6 KiB
C

/*
* Copyright © 2010 Codethink Limited
* Copyright © 2013 Canonical Limited
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the licence, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Author: Ryan Lortie <desrt@desrt.ca>
*/
#include "config.h"
#include "gtkapplicationprivate.h"
#include <gdk/gdkx.h>
typedef GtkApplicationImplDBusClass GtkApplicationImplX11Class;
typedef struct
{
GtkApplicationImplDBus dbus;
} GtkApplicationImplX11;
G_DEFINE_TYPE (GtkApplicationImplX11, gtk_application_impl_x11, GTK_TYPE_APPLICATION_IMPL_DBUS)
static void
gtk_application_impl_x11_handle_window_realize (GtkApplicationImpl *impl,
GtkWindow *window)
{
GtkApplicationImplDBus *dbus = (GtkApplicationImplDBus *) impl;
GdkWindow *gdk_window;
gchar *window_path;
gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
if (!GDK_IS_X11_WINDOW (gdk_window))
return;
window_path = gtk_application_impl_dbus_get_window_path (dbus, window);
gdk_x11_window_set_utf8_property (gdk_window, "_GTK_APPLICATION_ID", dbus->application_id);
gdk_x11_window_set_utf8_property (gdk_window, "_GTK_UNIQUE_BUS_NAME", dbus->unique_name);
gdk_x11_window_set_utf8_property (gdk_window, "_GTK_APPLICATION_OBJECT_PATH", dbus->object_path);
gdk_x11_window_set_utf8_property (gdk_window, "_GTK_WINDOW_OBJECT_PATH", window_path);
gdk_x11_window_set_utf8_property (gdk_window, "_GTK_APP_MENU_OBJECT_PATH", dbus->app_menu_path);
gdk_x11_window_set_utf8_property (gdk_window, "_GTK_MENUBAR_OBJECT_PATH", dbus->menubar_path);
g_free (window_path);
}
static GVariant *
gtk_application_impl_x11_get_window_system_id (GtkApplicationImplDBus *dbus,
GtkWindow *window)
{
GdkWindow *gdk_window;
gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
if (GDK_IS_X11_WINDOW (gdk_window))
return g_variant_new_uint32 (GDK_WINDOW_XID (gdk_window));
return GTK_APPLICATION_IMPL_DBUS_CLASS (gtk_application_impl_x11_parent_class)->get_window_system_id (dbus, window);
}
static void
gtk_application_impl_x11_init (GtkApplicationImplX11 *x11)
{
}
static void
gtk_application_impl_x11_before_emit (GtkApplicationImpl *impl,
GVariant *platform_data)
{
const char *startup_notification_id;
if (g_variant_lookup (platform_data, "desktop-startup-id",
"&s", &startup_notification_id))
{
gdk_x11_display_set_startup_notification_id (gdk_display_get_default (),
startup_notification_id);
}
}
static void
gtk_application_impl_x11_class_init (GtkApplicationImplX11Class *class)
{
GtkApplicationImplDBusClass *dbus_class = GTK_APPLICATION_IMPL_DBUS_CLASS (class);
GtkApplicationImplClass *impl_class = GTK_APPLICATION_IMPL_CLASS (class);
impl_class->handle_window_realize = gtk_application_impl_x11_handle_window_realize;
dbus_class->get_window_system_id = gtk_application_impl_x11_get_window_system_id;
impl_class->before_emit = gtk_application_impl_x11_before_emit;
}