[gnome-shell/wip/wayland] st-clipboard: Use GDK for the event filters instead of Clutter



commit 6166c191111461e76d77facc9673980886849300
Author: Neil Roberts <neil linux intel com>
Date:   Wed Jul 18 16:55:24 2012 +0100

    st-clipboard: Use GDK for the event filters instead of Clutter
    
    Instead of using Clutter to add an event filter for X events it now
    uses the GDK API. The Clutter API won't work if Clutter is not using
    an X11-based backend such as running a Wayland compositor under KMS.

 src/st/st-clipboard.c |  102 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 63 insertions(+), 39 deletions(-)
---
diff --git a/src/st/st-clipboard.c b/src/st/st-clipboard.c
index 6d98c95..a2184a1 100644
--- a/src/st/st-clipboard.c
+++ b/src/st/st-clipboard.c
@@ -30,7 +30,8 @@
 #include "st-clipboard.h"
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
-#include <clutter/x11/clutter-x11.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
 #include <string.h>
 
 G_DEFINE_TYPE (StClipboard, st_clipboard, G_TYPE_OBJECT)
@@ -106,20 +107,23 @@ st_clipboard_finalize (GObject *object)
   G_OBJECT_CLASS (st_clipboard_parent_class)->finalize (object);
 }
 
-static ClutterX11FilterReturn
-st_clipboard_provider (XEvent       *xev,
-                       ClutterEvent *cev,
-                       StClipboard  *clipboard)
+static GdkFilterReturn
+st_clipboard_provider (GdkXEvent *xevent_p,
+                       GdkEvent  *gev,
+                       void      *user_data)
 {
+  StClipboard *clipboard = user_data;
+  XEvent *xev = (XEvent *) xevent_p;
   XSelectionEvent notify_event;
   XSelectionRequestEvent *req_event;
+  GdkDisplay *display = gdk_display_get_default ();
 
   if (xev->type != SelectionRequest)
-    return CLUTTER_X11_FILTER_CONTINUE;
+    return GDK_FILTER_CONTINUE;
 
   req_event = &xev->xselectionrequest;
 
-  clutter_x11_trap_x_errors ();
+  gdk_x11_display_error_trap_push (display);
 
   if (req_event->target == __atom_targets)
     {
@@ -160,11 +164,14 @@ st_clipboard_provider (XEvent       *xev,
   XSendEvent (req_event->display, req_event->requestor, False, 0,
               (XEvent *) &notify_event);
   /* Make it happen non async */
-  XSync (clutter_x11_get_default_display(), FALSE);
+  XSync (GDK_DISPLAY_XDISPLAY (display), FALSE);
 
-  clutter_x11_untrap_x_errors (); /* FIXME: Warn here on fail ? */
+  if (gdk_x11_display_error_trap_pop (display))
+    {
+      /* FIXME: Warn here on fail ? */
+    }
 
-  return CLUTTER_X11_FILTER_REMOVE;
+  return GDK_FILTER_REMOVE;
 }
 
 
@@ -184,18 +191,20 @@ st_clipboard_class_init (StClipboardClass *klass)
 static void
 st_clipboard_init (StClipboard *self)
 {
+  GdkDisplay *gdk_display;
   Display *dpy;
   StClipboardPrivate *priv;
 
   priv = self->priv = CLIPBOARD_PRIVATE (self);
 
+  gdk_display = gdk_display_get_default ();
+  dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
+
   priv->clipboard_window =
-    XCreateSimpleWindow (clutter_x11_get_default_display (),
-                         clutter_x11_get_root_window (),
+    XCreateSimpleWindow (dpy,
+                         gdk_x11_get_default_root_xwindow (),
                          -1, -1, 1, 1, 0, 0, 0);
 
-  dpy = clutter_x11_get_default_display ();
-
   /* Only create once */
   if (__atom_clip == None)
     __atom_clip = XInternAtom (dpy, "CLIPBOARD", 0);
@@ -212,22 +221,26 @@ st_clipboard_init (StClipboard *self)
   priv->supported_targets[0] = __utf8_string;
   priv->supported_targets[1] = __atom_targets;
 
-  clutter_x11_add_filter ((ClutterX11FilterFunc) st_clipboard_provider,
-                          self);
+  gdk_window_add_filter (NULL, /* all windows */
+                         st_clipboard_provider,
+                         self);
 }
 
-static ClutterX11FilterReturn
-st_clipboard_x11_event_filter (XEvent          *xev,
-                               ClutterEvent    *cev,
-                               EventFilterData *filter_data)
+static GdkFilterReturn
+st_clipboard_x11_event_filter (GdkXEvent *xevent_p,
+                               GdkEvent  *gev,
+                               void      *user_data)
 {
+  XEvent *xev = (XEvent *) xevent_p;
+  EventFilterData *filter_data = user_data;
   Atom actual_type;
   int actual_format, result;
   unsigned long nitems, bytes_after;
   unsigned char *data = NULL;
+  GdkDisplay *display = gdk_display_get_default ();
 
   if(xev->type != SelectionNotify)
-    return CLUTTER_X11_FILTER_CONTINUE;
+    return GDK_FILTER_CONTINUE;
 
   if (xev->xselection.property == None)
     {
@@ -236,13 +249,14 @@ st_clipboard_x11_event_filter (XEvent          *xev,
                              NULL,
                              filter_data->user_data);
 
-      clutter_x11_remove_filter ((ClutterX11FilterFunc) st_clipboard_x11_event_filter,
-                                 filter_data);
+      gdk_window_remove_filter (NULL,
+                                st_clipboard_x11_event_filter,
+                                filter_data);
       g_free (filter_data);
-      return CLUTTER_X11_FILTER_REMOVE;
+      return GDK_FILTER_REMOVE;
     }
 
-  clutter_x11_trap_x_errors ();
+  gdk_x11_display_error_trap_push (display);
 
   result = XGetWindowProperty (xev->xselection.display,
                                xev->xselection.requestor,
@@ -256,7 +270,7 @@ st_clipboard_x11_event_filter (XEvent          *xev,
                                &bytes_after,
                                &data);
 
-  if (clutter_x11_untrap_x_errors () || result != Success)
+  if (gdk_x11_display_error_trap_pop (display) || result != Success)
     {
       /* FIXME: handle failure better */
       g_warning ("Clipboard: prop retrival failed");
@@ -265,16 +279,16 @@ st_clipboard_x11_event_filter (XEvent          *xev,
   filter_data->callback (filter_data->clipboard, (char*) data,
                          filter_data->user_data);
 
-  clutter_x11_remove_filter
-                          ((ClutterX11FilterFunc) st_clipboard_x11_event_filter,
-                          filter_data);
+  gdk_window_remove_filter (NULL,
+                            st_clipboard_x11_event_filter,
+                            filter_data);
 
   g_free (filter_data);
 
   if (data)
     XFree (data);
 
-  return CLUTTER_X11_FILTER_REMOVE;
+  return GDK_FILTER_REMOVE;
 }
 
 /**
@@ -314,7 +328,7 @@ st_clipboard_get_text (StClipboard            *clipboard,
                        gpointer                user_data)
 {
   EventFilterData *data;
-
+  GdkDisplay *gdk_display;
   Display *dpy;
 
   g_return_if_fail (ST_IS_CLIPBOARD (clipboard));
@@ -325,12 +339,14 @@ st_clipboard_get_text (StClipboard            *clipboard,
   data->callback = callback;
   data->user_data = user_data;
 
-  clutter_x11_add_filter ((ClutterX11FilterFunc) st_clipboard_x11_event_filter,
-                          data);
+  gdk_window_add_filter (NULL, /* all windows */
+                         st_clipboard_x11_event_filter,
+                         data);
 
-  dpy = clutter_x11_get_default_display ();
+  gdk_display = gdk_display_get_default ();
+  dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
 
-  clutter_x11_trap_x_errors (); /* safety on */
+  gdk_x11_display_error_trap_push (gdk_display);
 
   XConvertSelection (dpy,
                      __atom_clip,
@@ -338,7 +354,10 @@ st_clipboard_get_text (StClipboard            *clipboard,
                      clipboard->priv->clipboard_window,
                      CurrentTime);
 
-  clutter_x11_untrap_x_errors ();
+  if (gdk_x11_display_error_trap_pop (gdk_display))
+    {
+      /* FIXME */
+    }
 }
 
 /**
@@ -354,6 +373,7 @@ st_clipboard_set_text (StClipboard *clipboard,
                        const gchar *text)
 {
   StClipboardPrivate *priv;
+  GdkDisplay *gdk_display;
   Display *dpy;
 
   g_return_if_fail (ST_IS_CLIPBOARD (clipboard));
@@ -366,12 +386,16 @@ st_clipboard_set_text (StClipboard *clipboard,
   priv->clipboard_text = g_strdup (text);
 
   /* tell X we own the clipboard selection */
-  dpy = clutter_x11_get_default_display ();
+  gdk_display = gdk_display_get_default ();
+  dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
 
-  clutter_x11_trap_x_errors ();
+  gdk_x11_display_error_trap_push (gdk_display);
 
   XSetSelectionOwner (dpy, __atom_clip, priv->clipboard_window, CurrentTime);
   XSync (dpy, FALSE);
 
-  clutter_x11_untrap_x_errors ();
+  if (gdk_x11_display_error_trap_pop (gdk_display))
+    {
+      /* FIXME */
+    }
 }



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