at-spi r1034 - in trunk: . registryd



Author: liyuan
Date: Mon Aug  4 09:16:58 2008
New Revision: 1034
URL: http://svn.gnome.org/viewvc/at-spi?rev=1034&view=rev

Log:
2008-08-04  Li Yuan  <li yuan sun com>

        * registryd/deviceeventcontroller.c: (spi_dec_poll_mouse_idle),
        (spi_dec_poll_mouse_moving), (spi_dec_init_mouse_listener),
        (spi_controller_register_device_listener),
        (spi_deregister_controller_device_listener),
        (spi_device_event_controller_start_poll_mouse),
        (spi_device_event_controller_stop_poll_mouse):
        * registryd/deviceeventcontroller.h:
        * registryd/registry.c:
        (impl_accessibility_registry_register_global_event_listener),
        (impl_accessibility_registry_deregister_global_event_listener_all),
        (impl_accessibility_registry_deregister_global_event_listener):
        Bug #545849. Only poll mouse when there is listeners for mouse:abs and
        mouse:rel or mouse device listeners.


Modified:
   trunk/ChangeLog
   trunk/registryd/deviceeventcontroller.c
   trunk/registryd/deviceeventcontroller.h
   trunk/registryd/registry.c

Modified: trunk/registryd/deviceeventcontroller.c
==============================================================================
--- trunk/registryd/deviceeventcontroller.c	(original)
+++ trunk/registryd/deviceeventcontroller.c	Mon Aug  4 09:16:58 2008
@@ -84,6 +84,9 @@
 static GQuark spi_dec_private_quark = 0;
 static XModifierKeymap* xmkeymap = NULL;
 
+static gboolean have_mouse_listener = FALSE;
+static gboolean have_mouse_event_listener = FALSE;
+
 static int (*x_default_error_handler) (Display *display, XErrorEvent *error_event);
 
 typedef enum {
@@ -599,7 +602,9 @@
 static gboolean
 spi_dec_poll_mouse_idle (gpointer data)
 {
-  if (! spi_dec_poll_mouse_moved (data)) 
+  if (!have_mouse_event_listener && !have_mouse_listener)
+    return FALSE;
+  else if (! spi_dec_poll_mouse_moved (data)) 
     return TRUE;
   else
     {
@@ -611,7 +616,9 @@
 static gboolean
 spi_dec_poll_mouse_moving (gpointer data)
 {
-  if (spi_dec_poll_mouse_moved (data))
+  if (!have_mouse_event_listener && !have_mouse_listener)
+    return FALSE;
+  else if (spi_dec_poll_mouse_moved (data))
     return TRUE;
   else
     {
@@ -639,10 +646,7 @@
 {
 #ifdef GRAB_BUTTON
   Display *display = spi_get_display ();
-#endif
-  g_timeout_add (100, spi_dec_poll_mouse_idle, registry);
 
-#ifdef GRAB_BUTTON
   if (display)
     {
       if (XGrabButton (display, AnyButton, AnyModifier,
@@ -925,6 +929,12 @@
       break;
   case SPI_DEVICE_TYPE_MOUSE:
       controller->mouse_listeners = g_list_prepend (controller->mouse_listeners, listener);
+      if (!have_mouse_listener)
+        {
+          have_mouse_listener = TRUE;
+          if (!have_mouse_event_listener)
+            g_timeout_add (100, spi_dec_poll_mouse_idle, controller->registry);
+        }
       break;
   default:
       DBG (1, g_warning ("listener registration for unknown device type.\n"));
@@ -1906,6 +1916,8 @@
 
   spi_re_entrant_list_foreach (&controller->mouse_listeners,
 			       remove_listener_cb, &ctx);
+  if (!controller->mouse_listeners)
+    have_mouse_listener = FALSE;
 }
 
 static void
@@ -2579,6 +2591,22 @@
   /* TODO: kill mouse listener on finalize */  
   return retval;
 }
+void
+spi_device_event_controller_start_poll_mouse (SpiRegistry *registry)
+{
+  if (!have_mouse_event_listener)
+    {
+      have_mouse_event_listener = TRUE;
+      if (!have_mouse_listener)
+        g_timeout_add (100, spi_dec_poll_mouse_idle, registry);
+    }
+}
+
+void
+spi_device_event_controller_stop_poll_mouse (void)
+{
+  have_mouse_event_listener = FALSE;
+}
 
 static gboolean
 is_key_released (KeyCode code)

Modified: trunk/registryd/deviceeventcontroller.h
==============================================================================
--- trunk/registryd/deviceeventcontroller.h	(original)
+++ trunk/registryd/deviceeventcontroller.h	Mon Aug  4 09:16:58 2008
@@ -60,6 +60,9 @@
 GType            spi_device_event_controller_get_type (void);
 SpiDEController *spi_device_event_controller_new      (SpiRegistry *registry);
 
+void spi_device_event_controller_start_poll_mouse (SpiRegistry *registry);
+void spi_device_event_controller_stop_poll_mouse (void);
+
 G_END_DECLS
 
 #endif /* DEVICEEVENTCONTROLLER_H_ */

Modified: trunk/registryd/registry.c
==============================================================================
--- trunk/registryd/registry.c	(original)
+++ trunk/registryd/registry.c	Mon Aug  4 09:16:58 2008
@@ -432,6 +432,10 @@
     {
       spi_listener_struct_free (ls, ev);
     }
+
+  if ((!g_ascii_strcasecmp (event_name, "mouse:abs")) ||
+       (!g_ascii_strcasecmp (event_name, "mouse:rel")))
+    spi_device_event_controller_start_poll_mouse (registry);
 }
 
 typedef struct {
@@ -478,6 +482,8 @@
   GList **lists[3];
   SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
   RemoveListenerClosure cl = { 0, };
+  GList *listeners;
+  gboolean has_mouse_listener = FALSE;
 
   lists[0] = &registry->object_listeners;
   lists[1] = &registry->window_listeners;
@@ -490,6 +496,18 @@
     {
       spi_re_entrant_list_foreach (lists [i], remove_listener_cb, &cl);
     }
+
+  for (listeners = *get_listener_list (registry, ETYPE_MOUSE); listeners; listeners = (listeners)->next)
+    {
+      SpiListenerStruct *ls = (SpiListenerStruct *) listeners->data;
+      if (ls->event_type_quark == g_quark_from_string ("abs") ||
+            ls->event_type_quark == g_quark_from_string ("rel"))
+        has_mouse_listener = TRUE;
+    }
+
+  if (!has_mouse_listener)
+    spi_device_event_controller_stop_poll_mouse ();
+
 }
 
 
@@ -505,6 +523,8 @@
 {
   SpiRegistry    *registry;
   RemoveListenerClosure cl = { 0, };
+  GList *listeners;
+  gboolean has_mouse_listener = FALSE;
 
   registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
 
@@ -514,6 +534,20 @@
 
   spi_re_entrant_list_foreach (get_listener_list (registry, cl.etype.type_cat),
 				remove_listener_cb, &cl);
+
+  if (cl.etype.type_cat == ETYPE_MOUSE)
+    {
+      for (listeners = *get_listener_list (registry, ETYPE_MOUSE); listeners; listeners = listeners->next)
+        {
+          SpiListenerStruct *ls = (SpiListenerStruct *) listeners->data;
+          if (ls->event_type_quark == g_quark_from_string ("abs") ||
+                ls->event_type_quark == g_quark_from_string ("rel"))
+            has_mouse_listener = TRUE;
+        }
+
+      if (!has_mouse_listener)
+        spi_device_event_controller_stop_poll_mouse ();
+    }
 }
 
 



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