at-spi r1034 - in trunk: . registryd
- From: liyuan svn gnome org
- To: svn-commits-list gnome org
- Subject: at-spi r1034 - in trunk: . registryd
- Date: Mon, 4 Aug 2008 09:16:58 +0000 (UTC)
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] = ®istry->object_listeners;
lists[1] = ®istry->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]