[gtk+/saved/mir: 17/47] Handle Mir events on the main thread



commit 552862aa448dd1c3b50949af8e48a00e61b8359a
Author: Robert Ancell <robert ancell canonical com>
Date:   Tue May 27 14:50:36 2014 +0200

    Handle Mir events on the main thread

 gdk/mir/gdkmirwindowimpl.c |  222 +++++++++++++++++++++++++++-----------------
 1 files changed, 137 insertions(+), 85 deletions(-)
---
diff --git a/gdk/mir/gdkmirwindowimpl.c b/gdk/mir/gdkmirwindowimpl.c
index a9a6f22..5e94d35 100644
--- a/gdk/mir/gdkmirwindowimpl.c
+++ b/gdk/mir/gdkmirwindowimpl.c
@@ -494,107 +494,147 @@ get_modifier_state (unsigned int modifiers, unsigned int button_state)
   return modifier_state;
 }
 
-static void
-event_cb (MirSurface *surface, const MirEvent *event, void *context)
-{
-  GdkWindow *window = context;
-  GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl);
+/*
+  GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (event_data->window->impl);
   MirMotionButton changed_button_state;
   GdkEventType event_type;
   gdouble x, y;
   guint modifier_state;
   gboolean is_modifier = FALSE;
+*/
 
-  if (g_getenv ("GDK_MIR_LOG_EVENTS"))
-    print_event (event);
+static void
+handle_key_event (GdkWindow *window, MirKeyEvent *event)
+{
+  guint modifier_state;
+  gboolean is_modifier = FALSE;
 
-  // FIXME: Only generate events if the window wanted them?
-  switch (event->type)
+  modifier_state = get_modifier_state (event->modifiers, 0); // FIXME: Need to track button state
+
+  switch (event->action)
     {
-    case mir_event_type_key:
-      modifier_state = get_modifier_state (event->key.modifiers, 0); // FIXME: Need to track button state
+    case mir_key_action_down:
+    case mir_key_action_up:
+      // FIXME: Convert keycode
+      // FIXME: is_modifier
+      generate_key_event (window,
+                          event->action == mir_key_action_down ? GDK_KEY_PRESS : GDK_KEY_RELEASE,
+                          modifier_state,
+                          event->key_code,
+                          event->scan_code,
+                          is_modifier);
+      break;
+    default:
+    //case mir_key_action_multiple:
+      // FIXME
+      break;
+    }
+}
 
-      switch (event->key.action)
+static void
+handle_motion_event (GdkWindow *window, MirMotionEvent *event)
+{
+  GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl);
+  gdouble x, y;
+  guint modifier_state;
+  GdkEventType event_type;
+  MirMotionButton changed_button_state;
+
+  if (event->pointer_count < 1)
+    return;
+
+  x = event->pointer_coordinates[0].x;
+  y = event->pointer_coordinates[0].y;
+  modifier_state = get_modifier_state (event->modifiers, event->button_state);
+
+  /* Update which window has focus */
+  _gdk_mir_pointer_set_location (get_pointer (window), x, y, window, modifier_state);
+
+  switch (event->action)
+    {
+    case mir_motion_action_down:
+    case mir_motion_action_up:
+      event_type = event->action == mir_motion_action_down ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE;
+      changed_button_state = impl->button_state ^ event->button_state;
+      if ((event_type == GDK_BUTTON_PRESS && (impl->event_mask & GDK_BUTTON_PRESS_MASK) != 0) ||
+          (event_type == GDK_BUTTON_RELEASE && (impl->event_mask & GDK_BUTTON_RELEASE_MASK) != 0))
         {
-        case mir_key_action_down:
-        case mir_key_action_up:
-          // FIXME: Convert keycode
-          // FIXME: is_modifier
-          generate_key_event (window,
-                              event->key.action == mir_key_action_down ? GDK_KEY_PRESS : GDK_KEY_RELEASE,
-                              modifier_state,
-                              event->key.key_code,
-                              event->key.scan_code,
-                              is_modifier);
-          break;
-        default:
-        //case mir_key_action_multiple:
-          // FIXME
-          break;
+          if ((changed_button_state & mir_motion_button_primary) != 0)
+            generate_button_event (window, event_type, x, y, GDK_BUTTON_PRIMARY, modifier_state);
+          if ((changed_button_state & mir_motion_button_secondary) != 0)
+            generate_button_event (window, event_type, x, y, GDK_BUTTON_SECONDARY, modifier_state);
+          if ((changed_button_state & mir_motion_button_tertiary) != 0)
+            generate_button_event (window, event_type, x, y, GDK_BUTTON_MIDDLE, modifier_state);
         }
+        impl->button_state = event->button_state;
       break;
-    case mir_event_type_motion:
-      if (event->motion.pointer_count < 1)
-        return;
-      x = event->motion.pointer_coordinates[0].x;
-      y = event->motion.pointer_coordinates[0].y;
-      modifier_state = get_modifier_state (event->motion.modifiers, event->motion.button_state);
+    case mir_motion_action_scroll:
+      if ((impl->event_mask & GDK_SMOOTH_SCROLL_MASK) != 0)
+        generate_scroll_event (window, x, y, event->pointer_coordinates[0].hscroll, 
event->pointer_coordinates[0].vscroll, modifier_state);
+      break;
+    case mir_motion_action_move: // move with button
+    case mir_motion_action_hover_move: // move without button
+      if ((impl->event_mask & GDK_POINTER_MOTION_MASK) != 0 ||
+          ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK)) != 0 && (modifier_state & 
GDK_BUTTON1_MASK)) != 0 ||
+          ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON2_MOTION_MASK)) != 0 && (modifier_state & 
GDK_BUTTON2_MASK)) != 0 ||
+          ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON3_MOTION_MASK)) != 0 && (modifier_state & 
GDK_BUTTON3_MASK)) != 0)
+        generate_motion_event (window, x, y, modifier_state);
+      break;
+    }
+}
+
+static void
+handle_surface_event (GdkWindow *window, MirSurfaceEvent *event)
+{
+  GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl);
 
-      /* Update which window has focus */
-      _gdk_mir_pointer_set_location (get_pointer (window), x, y, window, modifier_state);
+  switch (event->attrib)
+    {
+    case mir_surface_attrib_type:
+      break;
+    case mir_surface_attrib_state:
+      impl->surface_state = event->value;
+      // FIXME: notify
+      break;
+    case mir_surface_attrib_swapinterval:
+      break;
+    case mir_surface_attrib_focus:
+      if (event->value)
+        gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FOCUSED);
+      else
+        gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FOCUSED, 0);
+      break;
+    default:
+      break;
+    }
+}
 
-      switch (event->motion.action)
-        {
-        case mir_motion_action_down:
-        case mir_motion_action_up:
-          event_type = event->motion.action == mir_motion_action_down ? GDK_BUTTON_PRESS : 
GDK_BUTTON_RELEASE;
-          changed_button_state = impl->button_state ^ event->motion.button_state;
-          if ((event_type == GDK_BUTTON_PRESS && (impl->event_mask & GDK_BUTTON_PRESS_MASK) != 0) ||
-              (event_type == GDK_BUTTON_RELEASE && (impl->event_mask & GDK_BUTTON_RELEASE_MASK) != 0))
-            {
-              if ((changed_button_state & mir_motion_button_primary) != 0)
-                generate_button_event (window, event_type, x, y, GDK_BUTTON_PRIMARY, modifier_state);
-              if ((changed_button_state & mir_motion_button_secondary) != 0)
-                generate_button_event (window, event_type, x, y, GDK_BUTTON_SECONDARY, modifier_state);
-              if ((changed_button_state & mir_motion_button_tertiary) != 0)
-                generate_button_event (window, event_type, x, y, GDK_BUTTON_MIDDLE, modifier_state);
-            }
-            impl->button_state = event->motion.button_state;
-          break;
-        case mir_motion_action_scroll:
-          if ((impl->event_mask & GDK_SMOOTH_SCROLL_MASK) != 0)
-            generate_scroll_event (window, x, y, event->motion.pointer_coordinates[0].hscroll, 
event->motion.pointer_coordinates[0].vscroll, modifier_state);
-          break;
-        case mir_motion_action_move: // move with button
-        case mir_motion_action_hover_move: // move without button
-          if ((impl->event_mask & GDK_POINTER_MOTION_MASK) != 0 ||
-              ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK)) != 0 && 
(modifier_state & GDK_BUTTON1_MASK)) != 0 ||
-              ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON2_MOTION_MASK)) != 0 && 
(modifier_state & GDK_BUTTON2_MASK)) != 0 ||
-              ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON3_MOTION_MASK)) != 0 && 
(modifier_state & GDK_BUTTON3_MASK)) != 0)
-            generate_motion_event (window, x, y, modifier_state);
-          break;
-        }
+typedef struct
+{
+  GdkWindow *window;
+  MirEvent event;
+} EventData;
+
+static gboolean
+handle_event (gpointer data)
+{
+  EventData *event_data = data;
+  MirEvent *event = &event_data->event;
+
+  if (g_getenv ("GDK_MIR_LOG_EVENTS"))
+    print_event (&event_data->event);
+
+  // FIXME: Only generate events if the window wanted them?
+  switch (event->type)
+    {
+    case mir_event_type_key:
+      handle_key_event (event_data->window, &event->key);
+      break;
+    case mir_event_type_motion:
+      handle_motion_event (event_data->window, &event->motion);
       break;
     case mir_event_type_surface:
-      switch (event->surface.attrib)
-        {
-        case mir_surface_attrib_type:
-          break;
-        case mir_surface_attrib_state:
-          impl->surface_state = event->surface.value;
-          // FIXME: notify
-          break;
-        case mir_surface_attrib_swapinterval:
-          break;
-        case mir_surface_attrib_focus:
-          if (event->surface.value)
-            gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FOCUSED);
-          else
-            gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FOCUSED, 0);
-          break;
-        default:
-          break;
-        }
+      handle_surface_event (event_data->window, &event->surface);
       break;
     case mir_event_type_resize:
       // FIXME: Generate configure event
@@ -603,6 +643,18 @@ event_cb (MirSurface *surface, const MirEvent *event, void *context)
       // FIXME?
       break;
     }
+
+  return FALSE;
+}
+
+static void
+event_cb (MirSurface *surface, const MirEvent *event, void *context)
+{
+  EventData *data = g_new (EventData, 1);
+  data->window = context; // FIXME: ref?
+  data->event = *event;
+  gdk_threads_add_idle (handle_event, data);
+  return;
 }
 
 static void


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