]> Pileus Git - ~andy/gtk/commitdiff
Bug 560671 – the client_message API doesn't work in DirectFB
authorSven Neumann <sven@gimp.org>
Wed, 18 Feb 2009 18:03:51 +0000 (18:03 +0000)
committerSven Neumann <neo@src.gnome.org>
Wed, 18 Feb 2009 18:03:51 +0000 (18:03 +0000)
2009-02-18  Sven Neumann  <sven@gimp.org>

Bug 560671 – the client_message API doesn't work in DirectFB

* gdk/directfb/gdkevents-directfb.c: applied a slightly cleaned
up
patch from Steve Lhomme that adds this functionality using
DirectFB's DFBUserEvent.

svn path=/trunk/; revision=22363

ChangeLog
gdk/directfb/gdkevents-directfb.c

index 0278fa3c4a267353ec73922dc29e926ea9ebb677..26201c0bcf68c193337239a97660ee60c19e5b4c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-02-18  Sven Neumann  <sven@gimp.org>
+
+       Bug 560671 – the client_message API doesn't work in DirectFB
+
+       * gdk/directfb/gdkevents-directfb.c: applied a slightly cleaned up
+       patch from Steve Lhomme that adds this functionality using
+       DirectFB's DFBUserEvent.
+
 2009-02-18  Sven Neumann  <sven@gimp.org>
 
        Bug 543710 – Dead keys do not work anymore with DirectFB
index b9d020e75963ee85a5a8ac2bef6393b50911037a..a462d724d9f6c49e82dc1bc1c7e911343969b0f2 100644 (file)
@@ -162,24 +162,22 @@ dfb_events_process_window_event (DFBWindowEvent *event)
 
 static gboolean
 gdk_event_send_client_message_by_window (GdkEvent *event,
-                                        GdkWindow *window)
+                                         GdkWindow *window)
 {
-  GdkEvent *new_event;
+  DFBUserEvent evt;
 
   g_return_val_if_fail(event != NULL, FALSE);
   g_return_val_if_fail(GDK_IS_WINDOW(window), FALSE);
 
-  new_event = gdk_directfb_event_make (window, GDK_CLIENT_EVENT);
-  new_event->client.message_type = event->client.message_type;
-  new_event->client.data_format = event->client.data_format;
-  memcpy(&new_event->client.data,
-        &event->client.data,
-        sizeof(event->client.data));
+  evt.clazz = DFEC_USER;
+  evt.type = GPOINTER_TO_UINT (GDK_ATOM_TO_POINTER (event->client.message_type));
+  evt.data = (void *) event->client.data.l[0];
+
+  _gdk_display->buffer->PostEvent(_gdk_display->buffer, DFB_EVENT (&evt));
 
   return TRUE;
 }
 
-
 static void
 dfb_events_dispatch (void)
 {
@@ -230,6 +228,32 @@ dfb_events_io_func (GIOChannel   *channel,
           else
             dfb_events_process_window_event (&event->window);
           break;
+
+        case DFEC_USER:
+          {
+            GList *list;
+
+            GDK_NOTE (EVENTS, g_print (" client_message"));
+
+            for (list = client_filters; list; list = list->next)
+              {
+                GdkClientFilter *filter     = list->data;
+                DFBUserEvent    *user_event = (DFBUserEvent *) event;
+                GdkAtom          type;
+
+                type = GDK_POINTER_TO_ATOM (GUINT_TO_POINTER (user_event->type));
+
+                if (filter->type == type)
+                  {
+                    if (filter->function (user_event,
+                                          NULL,
+                                          filter->data) != GDK_FILTER_CONTINUE)
+                      break;
+                  }
+              }
+          }
+          break;
+
         default:
           break;
         }