[gtk+] Make GdkAppLaunchContext display-dependent



commit 06f75b3727a0f06c1192b580f37edd8f31759263
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Dec 9 01:08:05 2010 -0500

    Make GdkAppLaunchContext display-dependent
    
    Add a GdkDisplay::get_app_launch_context vfunc, and a
    gdk_display_get_app_launch_context that for X11 returns a subclass.
    For win32 and quartz, the implementations were trivial, so we
    just return a new GdkAppLaunchContext without subclassing. Since
    the type of the context now depends on the display,
    gdk_app_launch_context_set_display is deprecated.

 gdk/gdk.symbols                         |    1 +
 gdk/gdkapplaunchcontext.c               |   81 +++++++++++++++++++------------
 gdk/gdkapplaunchcontext.h               |    2 +-
 gdk/gdkdisplay.c                        |   35 +++++++++++++-
 gdk/gdkdisplay.h                        |    2 +
 gdk/gdkinternals.h                      |    7 +--
 gdk/gdktypes.h                          |    1 +
 gdk/quartz/Makefile.am                  |    1 -
 gdk/quartz/gdkapplaunchcontext-quartz.c |   42 ----------------
 gdk/win32/Makefile.am                   |    1 -
 gdk/win32/gdkapplaunchcontext-win32.c   |   42 ----------------
 gdk/x11/gdkapplaunchcontext-x11.c       |   66 ++++++++++++++++---------
 gdk/x11/gdkdisplay-x11.c                |    3 +
 13 files changed, 133 insertions(+), 151 deletions(-)
---
diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols
index f3e72b7..7040bfc 100644
--- a/gdk/gdk.symbols
+++ b/gdk/gdk.symbols
@@ -85,6 +85,7 @@ gdk_display_beep
 gdk_display_close
 gdk_display_device_is_grabbed
 gdk_display_flush
+gdk_display_get_app_launch_context
 gdk_display_get_default
 gdk_display_get_default_cursor_size
 gdk_display_get_default_group
diff --git a/gdk/gdkapplaunchcontext.c b/gdk/gdkapplaunchcontext.c
index 1bd4dbb..c9188e0 100644
--- a/gdk/gdkapplaunchcontext.c
+++ b/gdk/gdkapplaunchcontext.c
@@ -61,10 +61,14 @@ static void    gdk_app_launch_context_finalize    (GObject           *object);
 static gchar * gdk_app_launch_context_get_display (GAppLaunchContext *context,
                                                    GAppInfo          *info,
                                                    GList             *files);
+static gchar * gdk_app_launch_context_get_startup_notify_id (GAppLaunchContext *context,
+                                                             GAppInfo          *info,
+                                                             GList             *files);
+static void    gdk_app_launch_context_launch_failed (GAppLaunchContext *context,
+                                                     const gchar       *startup_notify_id);
 
 
-G_DEFINE_TYPE (GdkAppLaunchContext, gdk_app_launch_context,
-	       G_TYPE_APP_LAUNCH_CONTEXT)
+G_DEFINE_TYPE (GdkAppLaunchContext, gdk_app_launch_context, G_TYPE_APP_LAUNCH_CONTEXT)
 
 static void
 gdk_app_launch_context_class_init (GdkAppLaunchContextClass *klass)
@@ -75,8 +79,8 @@ gdk_app_launch_context_class_init (GdkAppLaunchContextClass *klass)
   gobject_class->finalize = gdk_app_launch_context_finalize;
 
   context_class->get_display = gdk_app_launch_context_get_display;
-  context_class->get_startup_notify_id = _gdk_windowing_get_startup_notify_id;
-  context_class->launch_failed = _gdk_windowing_launch_failed;
+  context_class->get_startup_notify_id = gdk_app_launch_context_get_startup_notify_id;
+  context_class->launch_failed = gdk_app_launch_context_launch_failed;
 
   g_type_class_add_private (klass, sizeof (GdkAppLaunchContextPrivate));
 }
@@ -85,8 +89,8 @@ static void
 gdk_app_launch_context_init (GdkAppLaunchContext *context)
 {
   context->priv = G_TYPE_INSTANCE_GET_PRIVATE (context,
-					       GDK_TYPE_APP_LAUNCH_CONTEXT,
-					       GdkAppLaunchContextPrivate);
+                                               GDK_TYPE_APP_LAUNCH_CONTEXT,
+                                               GdkAppLaunchContextPrivate);
   context->priv->workspace = -1;
 }
 
@@ -144,22 +148,17 @@ gdk_app_launch_context_get_display (GAppLaunchContext *context,
  * using this context. See also gdk_app_launch_context_set_screen().
  *
  * Since: 2.14
+ *
+ * Deprecated: 3.0: Use gdk_display_get_app_launch_context() instead
  */
 void
 gdk_app_launch_context_set_display (GdkAppLaunchContext *context,
-				    GdkDisplay          *display)
+                                    GdkDisplay          *display)
 {
   g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context));
   g_return_if_fail (display == NULL || GDK_IS_DISPLAY (display));
 
-  if (context->priv->display)
-    {
-      g_object_unref (context->priv->display);
-      context->priv->display = NULL;
-    }
-
-  if (display)
-    context->priv->display = g_object_ref (display);
+  g_warn_if_fail (display == NULL || display == context->priv->display);
 }
 
 /**
@@ -178,11 +177,13 @@ gdk_app_launch_context_set_display (GdkAppLaunchContext *context,
  */
 void
 gdk_app_launch_context_set_screen (GdkAppLaunchContext *context,
-				   GdkScreen           *screen)
+                                   GdkScreen           *screen)
 {
   g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context));
   g_return_if_fail (screen == NULL || GDK_IS_SCREEN (screen));
 
+  g_return_if_fail (screen == NULL || gdk_screen_get_display (screen) == context->priv->display);
+
   if (context->priv->screen)
     {
       g_object_unref (context->priv->screen);
@@ -199,12 +200,12 @@ gdk_app_launch_context_set_screen (GdkAppLaunchContext *context,
  * @desktop: the number of a workspace, or -1
  *
  * Sets the workspace on which applications will be launched when
- * using this context when running under a window manager that 
- * supports multiple workspaces, as described in the 
- * <ulink url="http://www.freedesktop.org/Standards/wm-spec";>Extended 
- * Window Manager Hints</ulink>. 
+ * using this context when running under a window manager that
+ * supports multiple workspaces, as described in the
+ * <ulink url="http://www.freedesktop.org/Standards/wm-spec";>Extended
+ * Window Manager Hints</ulink>.
  *
- * When the workspace is not specified or @desktop is set to -1, 
+ * When the workspace is not specified or @desktop is set to -1,
  * it is up to the window manager to pick one, typically it will
  * be the current workspace.
  *
@@ -212,7 +213,7 @@ gdk_app_launch_context_set_screen (GdkAppLaunchContext *context,
  */
 void
 gdk_app_launch_context_set_desktop (GdkAppLaunchContext *context,
-				    gint                 desktop)
+                                    gint                 desktop)
 {
   g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context));
 
@@ -225,7 +226,7 @@ gdk_app_launch_context_set_desktop (GdkAppLaunchContext *context,
  * @timestamp: a timestamp
  *
  * Sets the timestamp of @context. The timestamp should ideally
- * be taken from the event that triggered the launch. 
+ * be taken from the event that triggered the launch.
  *
  * Window managers can use this information to avoid moving the
  * focus to the newly launched application when the user is busy
@@ -236,7 +237,7 @@ gdk_app_launch_context_set_desktop (GdkAppLaunchContext *context,
  */
 void
 gdk_app_launch_context_set_timestamp (GdkAppLaunchContext *context,
-				      guint32              timestamp)
+                                      guint32              timestamp)
 {
   g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context));
 
@@ -280,20 +281,20 @@ gdk_app_launch_context_set_icon (GdkAppLaunchContext *context,
  * @context: a #GdkAppLaunchContext
  * @icon_name: (allow-none): an icon name, or %NULL
  *
- * Sets the icon for applications that are launched with this context. 
- * The @icon_name will be interpreted in the same way as the Icon field 
- * in desktop files. See also gdk_app_launch_context_set_icon(). 
+ * Sets the icon for applications that are launched with this context.
+ * The @icon_name will be interpreted in the same way as the Icon field
+ * in desktop files. See also gdk_app_launch_context_set_icon().
  *
  * If both @icon and @icon_name are set, the @icon_name takes priority.
- * If neither @icon or @icon_name is set, the icon is taken from either 
- * the file that is passed to launched application or from the #GAppInfo 
+ * If neither @icon or @icon_name is set, the icon is taken from either
+ * the file that is passed to launched application or from the #GAppInfo
  * for the launched application itself.
- * 
+ *
  * Since: 2.14
  */
 void
 gdk_app_launch_context_set_icon_name (GdkAppLaunchContext *context,
-				      const char          *icon_name)
+                                      const char          *icon_name)
 {
   g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context));
 
@@ -309,9 +310,25 @@ gdk_app_launch_context_set_icon_name (GdkAppLaunchContext *context,
  * Returns: a new #GdkAppLaunchContext
  *
  * Since: 2.14
+ *
+ * Deprecated: 3.0: Use gdk_display_get_app_launch_context() instead
  */
 GdkAppLaunchContext *
 gdk_app_launch_context_new (void)
 {
-  return g_object_new (GDK_TYPE_APP_LAUNCH_CONTEXT, NULL);
+  return gdk_display_get_app_launch_context (gdk_display_get_default ());
+}
+
+static char *
+gdk_app_launch_context_get_startup_notify_id (GAppLaunchContext *context,
+                                              GAppInfo          *info,
+                                              GList             *files)
+{
+ return NULL;
+}
+
+static void
+gdk_app_launch_context_launch_failed (GAppLaunchContext *context,
+                                      const gchar       *startup_notify_id)
+{
 }
diff --git a/gdk/gdkapplaunchcontext.h b/gdk/gdkapplaunchcontext.h
index cb53025..6805d9f 100644
--- a/gdk/gdkapplaunchcontext.h
+++ b/gdk/gdkapplaunchcontext.h
@@ -28,6 +28,7 @@
 #define __GDK_APP_LAUNCH_CONTEXT_H__
 
 #include <gio/gio.h>
+#include <gdk/gdktypes.h>
 #include <gdk/gdkscreen.h>
 
 G_BEGIN_DECLS
@@ -39,7 +40,6 @@ G_BEGIN_DECLS
 #define GDK_IS_APP_LAUNCH_CONTEXT_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), GDK_TYPE_APP_LAUNCH_CONTEXT))
 #define GDK_APP_LAUNCH_CONTEXT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDK_TYPE_APP_LAUNCH_CONTEXT, GdkAppLaunchContextClass))
 
-typedef struct GdkAppLaunchContext	      GdkAppLaunchContext;
 typedef struct GdkAppLaunchContextClass       GdkAppLaunchContextClass;
 typedef struct GdkAppLaunchContextPrivate     GdkAppLaunchContextPrivate;
 
diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c
index cb8b9c2..f2ba0df 100644
--- a/gdk/gdkdisplay.c
+++ b/gdk/gdkdisplay.c
@@ -121,8 +121,7 @@ static GdkWindow* singlehead_default_window_get_pointer (GdkWindow       *window
 							 GdkModifierType *mask);
 static GdkWindow* singlehead_default_window_at_pointer  (GdkScreen       *screen,
 							 gint            *win_x,
-							 gint            *win_y);
-static GdkWindow *gdk_window_real_window_get_device_position     (GdkDisplay       *display,
+							 gint            *win_y);static GdkWindow *gdk_window_real_window_get_device_position     (GdkDisplay       *display,
                                                                   GdkDevice        *device,
                                                                   GdkWindow        *window,
                                                                   gint             *x,
@@ -132,6 +131,7 @@ static GdkWindow *gdk_display_real_get_window_at_device_position (GdkDisplay
                                                                   GdkDevice        *device,
                                                                   gint             *win_x,
                                                                   gint             *win_y);
+static GdkAppLaunchContext *gdk_display_real_get_app_launch_context (GdkDisplay *display);
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
@@ -179,6 +179,8 @@ gdk_display_class_init (GdkDisplayClass *class)
   object_class->finalize = gdk_display_finalize;
   object_class->dispose = gdk_display_dispose;
 
+  class->get_app_launch_context = gdk_display_real_get_app_launch_context;
+
   /**
    * GdkDisplay::opened:
    * @display: the object on which the signal is emitted
@@ -2211,3 +2213,32 @@ gdk_add_client_message_filter (GdkAtom       message_type,
   gdk_display_add_client_message_filter (gdk_display_get_default (),
 					 message_type, func, data);
 }
+
+static GdkAppLaunchContext *
+gdk_display_real_get_app_launch_context (GdkDisplay *display)
+{
+  GdkAppLaunchContext *ctx;
+
+  ctx = gdk_app_launch_context_new ();
+  gdk_app_launch_context_set_display (ctx, display);
+
+  return ctx;
+}
+
+/**
+ * gdk_display_get_app_launch_context:
+ * @display: a #GdkDisplay
+ *
+ * Returns a #GdkAppLaunchContext suitable for launching
+ * applications on the given display.
+ *
+ * Returns: a new #GdkAppLaunchContext for @display.
+ *     Free with g_object_unref() when done
+ *
+ * Since: 3.0
+ */
+GdkAppLaunchContext *
+gdk_display_get_app_launch_context (GdkDisplay *display)
+{
+  return GDK_DISPLAY_GET_CLASS(display)->get_app_launch_context (display);
+}
diff --git a/gdk/gdkdisplay.h b/gdk/gdkdisplay.h
index bd99b1d..0da4608 100644
--- a/gdk/gdkdisplay.h
+++ b/gdk/gdkdisplay.h
@@ -309,6 +309,8 @@ gboolean gdk_display_supports_composite        (GdkDisplay    *display);
 
 GdkDeviceManager * gdk_display_get_device_manager (GdkDisplay *display);
 
+GdkAppLaunchContext *gdk_display_get_app_launch_context (GdkDisplay *display);
+
 
 G_END_DECLS
 
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index d0fa21d..604ed64 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -304,6 +304,7 @@ struct _GdkDisplayClass
 							   GdkAtom       message_type,
 							   GdkFilterFunc func,
 							   gpointer      data);
+  GdkAppLaunchContext *      (*get_app_launch_context) (GdkDisplay *display);
 
 
   /* Signals */
@@ -575,12 +576,6 @@ struct GdkAppLaunchContextPrivate
   char *icon_name;
 };
 
-char *_gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
-					    GAppInfo          *info, 
-					    GList             *files);
-void  _gdk_windowing_launch_failed         (GAppLaunchContext *context, 
-				            const char        *startup_notify_id);
-
 void _gdk_display_device_grab_update                     (GdkDisplay *display,
                                                           GdkDevice  *device,
                                                           GdkDevice  *source_device,
diff --git a/gdk/gdktypes.h b/gdk/gdktypes.h
index 865a7f5..ce1e1f9 100644
--- a/gdk/gdktypes.h
+++ b/gdk/gdktypes.h
@@ -147,6 +147,7 @@ typedef struct _GdkVisual             GdkVisual;
 typedef struct _GdkWindow             GdkWindow;
 typedef struct _GdkDisplay	      GdkDisplay;
 typedef struct _GdkScreen	      GdkScreen;
+typedef struct  GdkAppLaunchContext   GdkAppLaunchContext;
 
 /**
  * GdkByteOrder:
diff --git a/gdk/quartz/Makefile.am b/gdk/quartz/Makefile.am
index f7ffd5a..a1d5664 100644
--- a/gdk/quartz/Makefile.am
+++ b/gdk/quartz/Makefile.am
@@ -21,7 +21,6 @@ libgdk_quartz_la_SOURCES =    	\
 	GdkQuartzView.h		\
 	GdkQuartzWindow.c	\
 	GdkQuartzWindow.h	\
-	gdkapplaunchcontext-quartz.c \
 	gdkcursor-quartz.c	\
 	gdkdevice-core.c	\
 	gdkdevicemanager-core.c	\
diff --git a/gdk/win32/Makefile.am b/gdk/win32/Makefile.am
index d851ccf..2f8dd8f 100644
--- a/gdk/win32/Makefile.am
+++ b/gdk/win32/Makefile.am
@@ -26,7 +26,6 @@ EXTRA_DIST += \
 
 libgdk_win32_la_SOURCES = \
 	xcursors.h \
-	gdkapplaunchcontext-win32.c \
 	gdkcursor-win32.c \
 	gdkdevicemanager-win32.c \
 	gdkdevicemanager-win32.h \
diff --git a/gdk/x11/gdkapplaunchcontext-x11.c b/gdk/x11/gdkapplaunchcontext-x11.c
index 5aea31d..5fdffec 100644
--- a/gdk/x11/gdkapplaunchcontext-x11.c
+++ b/gdk/x11/gdkapplaunchcontext-x11.c
@@ -23,10 +23,10 @@
 #include "config.h"
 
 #include "gdkapplaunchcontext.h"
+#include "gdkinternals.h"
 
 #include "gdkx.h"
 #include "gdkscreen.h"
-#include "gdkinternals.h"
 #include "gdkintl.h"
 
 #include <glib.h>
@@ -258,10 +258,10 @@ add_startup_timeout (GdkScreen  *screen,
 }
 
 
-char *
-_gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
-                                      GAppInfo          *info,
-                                      GList             *files)
+static char *
+gdk_app_launch_context_x11_get_startup_notify_id (GAppLaunchContext *context,
+                                                  GAppInfo          *info,
+                                                  GList             *files)
 {
   static int sequence = 0;
   GdkAppLaunchContextPrivate *priv;
@@ -281,21 +281,11 @@ _gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
 
   priv = GDK_APP_LAUNCH_CONTEXT (context)->priv;
 
+  display = priv->display;
   if (priv->screen)
-    {
-      screen = priv->screen;
-      display = gdk_screen_get_display (priv->screen);
-    }
-  else if (priv->display)
-    {
-      display = priv->display;
-      screen = gdk_display_get_default_screen (display);
-    }
+    screen = priv->screen;
   else
-    {
-      display = gdk_display_get_default ();
-      screen = gdk_display_get_default_screen (display);
-    }
+    screen = gdk_display_get_default_screen (priv->display);
 
   fileinfo = NULL;
 
@@ -398,9 +388,9 @@ _gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
 }
 
 
-void
-_gdk_windowing_launch_failed (GAppLaunchContext *context,
-                              const char        *startup_notify_id)
+static void
+gdk_app_launch_context_x11_launch_failed (GAppLaunchContext *context,
+                                          const char        *startup_notify_id)
 {
   GdkAppLaunchContextPrivate *priv;
   GdkScreen *screen;
@@ -412,10 +402,8 @@ _gdk_windowing_launch_failed (GAppLaunchContext *context,
 
   if (priv->screen)
     screen = priv->screen;
-  else if (priv->display)
-    screen = gdk_display_get_default_screen (priv->display);
   else
-    screen = gdk_display_get_default_screen (gdk_display_get_default ());
+    screen = gdk_display_get_default_screen (priv->display);
 
   data = g_object_get_data (G_OBJECT (screen), "appinfo-startup-data");
 
@@ -441,3 +429,33 @@ _gdk_windowing_launch_failed (GAppLaunchContext *context,
         }
     }
 }
+
+typedef struct GdkAppLaunchContext GdkAppLaunchContextX11;
+typedef struct GdkAppLaunchContextClass GdkAppLaunchContextX11Class;
+
+G_DEFINE_TYPE (GdkAppLaunchContextX11, _gdk_app_launch_context_x11, GDK_TYPE_APP_LAUNCH_CONTEXT)
+
+static void
+_gdk_app_launch_context_x11_class_init (GdkAppLaunchContextX11Class *klass)
+{
+  GAppLaunchContextClass *ctx_class = G_APP_LAUNCH_CONTEXT_CLASS (klass);
+
+  ctx_class->get_startup_notify_id = gdk_app_launch_context_x11_get_startup_notify_id;
+  ctx_class->launch_failed = gdk_app_launch_context_x11_launch_failed;
+}
+
+static void
+_gdk_app_launch_context_x11_init (GdkAppLaunchContextX11 *ctx)
+{
+}
+
+GdkAppLaunchContext *
+_gdk_x11_display_get_app_launch_context (GdkDisplay *display)
+{
+  GdkAppLaunchContext *ctx;
+
+  ctx = g_object_new (_gdk_app_launch_context_x11_get_type (), NULL);
+  gdk_app_launch_context_set_display (ctx, display);
+
+  return ctx;
+}
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index d09bec5..d89a171 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -2703,6 +2703,8 @@ gdk_x11_display_error_trap_pop_ignored (GdkDisplay *display)
   gdk_x11_display_error_trap_pop_internal (display, FALSE);
 }
 
+extern GdkAppLaunchContext *_gdk_x11_display_get_app_launch_context (GdkDisplay *display);
+
 static void
 _gdk_display_x11_class_init (GdkDisplayX11Class * class)
 {
@@ -2730,5 +2732,6 @@ _gdk_display_x11_class_init (GdkDisplayX11Class * class)
   display_class->list_devices = gdk_x11_display_list_devices;
   display_class->send_client_message = gdk_x11_display_send_client_message;
   display_class->add_client_message_filter = gdk_x11_display_add_client_message_filter;
+  display_class->get_app_launch_context = _gdk_x11_display_get_app_launch_context;
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]