X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=registryd%2Fdeviceeventcontroller.c;h=ee43061669bf1e0edcd319cf931cf18a9c1f9a55;hb=44547ec0c43119287b742d3d84a760334ca77cca;hp=c758234b5958a974eedac1d408e09eed7465a632;hpb=b963bb8bbc5af70ad5da7c05e044ebcd2cef16a0;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/registryd/deviceeventcontroller.c b/registryd/deviceeventcontroller.c index c758234..ee43061 100644 --- a/registryd/deviceeventcontroller.c +++ b/registryd/deviceeventcontroller.c @@ -57,6 +57,7 @@ #include "deviceeventcontroller.h" KeySym ucs2keysym (long ucs); +long keysym2ucs(KeySym keysym); #define CHECK_RELEASE_DELAY 20 #define BIT(c, x) (c[x/8]&(1<<(x%8))) @@ -81,8 +82,9 @@ static unsigned int key_modifier_mask = static unsigned int _numlock_physical_mask = Mod2Mask; /* a guess, will be reset */ static GQuark spi_dec_private_quark = 0; +static XModifierKeymap* xmkeymap = NULL; -int (*x_default_error_handler) (Display *display, XErrorEvent *error_event); +static int (*x_default_error_handler) (Display *display, XErrorEvent *error_event); typedef enum { SPI_DEVICE_TYPE_KBD, @@ -220,7 +222,6 @@ spi_dec_replace_map_keysym (DEControllerPrivateData *priv, KeyCode keycode, KeyS if (desc && desc->map) { gint offset = desc->map->key_sym_map[keycode].offset; - long old_sym = desc->map->syms[offset]; desc->map->syms[offset] = keysym; } else @@ -445,7 +446,10 @@ spi_dec_button_update_and_emit (SpiDEController *controller, e.source = BONOBO_OBJREF (controller->registry->desktop); e.detail1 = last_mouse_pos->x; e.detail2 = last_mouse_pos->y; - spi_init_any_nil (&e.any_data); + spi_init_any_nil (&e.any_data, + spi_accessible_new_return (atk_get_root (), FALSE, NULL), + Accessibility_ROLE_UNKNOWN, + ""); CORBA_exception_init (&ev); if (!is_consumed) { @@ -455,6 +459,8 @@ spi_dec_button_update_and_emit (SpiDEController *controller, } else spi_dec_set_unlatch_pending (controller, mask_return); + + CORBA_free (e.any_data._value); } return TRUE; } @@ -470,6 +476,7 @@ spi_dec_mouse_check (SpiDEController *controller, int *x, int *y, gboolean *moved) { Accessibility_Event e; + Accessibility_EventDetails *details; CORBA_Environment ev; int win_x_return,win_y_return; unsigned int mask_return; @@ -499,22 +506,32 @@ spi_dec_mouse_check (SpiDEController *controller, e.source = BONOBO_OBJREF (controller->registry->desktop); e.detail1 = *x; e.detail2 = *y; - spi_init_any_nil (&e.any_data); + spi_init_any_nil (&e.any_data, + spi_accessible_new_return (atk_get_root (), FALSE, NULL), + Accessibility_ROLE_UNKNOWN, + ""); CORBA_exception_init (&ev); Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry), &e, &ev); + details = e.any_data._value; + CORBA_free (details); e.type = "mouse:rel"; e.source = BONOBO_OBJREF (controller->registry->desktop); e.detail1 = *x - last_mouse_pos->x; e.detail2 = *y - last_mouse_pos->y; - spi_init_any_nil (&e.any_data); + spi_init_any_nil (&e.any_data, + spi_accessible_new_return (atk_get_root (), FALSE, NULL), + Accessibility_ROLE_UNKNOWN, + ""); CORBA_exception_init (&ev); last_mouse_pos->x = *x; last_mouse_pos->y = *y; Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry), &e, &ev); + details = e.any_data._value; + CORBA_free (details); *moved = True; } else @@ -547,11 +564,15 @@ spi_dec_emit_modifier_event (SpiDEController *controller, guint prev_mask, e.source = BONOBO_OBJREF (controller->registry->desktop); e.detail1 = prev_mask & key_modifier_mask; e.detail2 = current_mask & key_modifier_mask; - spi_init_any_nil (&e.any_data); + spi_init_any_nil (&e.any_data, + spi_accessible_new_return (atk_get_root (), FALSE, NULL), + Accessibility_ROLE_UNKNOWN, + ""); CORBA_exception_init (&ev); Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry), &e, &ev); + CORBA_free (e.any_data._value); } static gboolean @@ -616,9 +637,12 @@ spi_dec_ungrab_mouse (gpointer data) static void spi_dec_init_mouse_listener (SpiRegistry *registry) { +#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, @@ -635,6 +659,7 @@ spi_dec_init_mouse_listener (SpiRegistry *registry) fprintf (stderr, "mouse buttons grabbed\n"); #endif } +#endif } /** @@ -917,8 +942,9 @@ spi_controller_notify_mouselisteners (SpiDEController *controlle GSList *notify = NULL, *l2; GList **listeners = &controller->mouse_listeners; gboolean is_consumed; +#ifdef SPI_KEYEVENT_DEBUG gboolean found = FALSE; - +#endif if (!listeners) { return FALSE; @@ -937,7 +963,9 @@ spi_controller_notify_mouselisteners (SpiDEController *controlle /* we clone (don't dup) the listener, to avoid refcount inc. */ notify = g_slist_prepend (notify, spi_listener_clone (listener, ev)); +#ifdef SPI_KEYEVENT_DEBUG found = TRUE; +#endif } } } @@ -1055,12 +1083,16 @@ spi_device_event_controller_forward_mouse_event (SpiDEController *controller, e.source = BONOBO_OBJREF (controller->registry->desktop); e.detail1 = last_mouse_pos->x; e.detail2 = last_mouse_pos->y; - spi_init_any_nil (&e.any_data); + spi_init_any_nil (&e.any_data, + spi_accessible_new_return (atk_get_root (), FALSE, NULL), + Accessibility_ROLE_UNKNOWN, + ""); CORBA_exception_init (&ev); Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry), &e, &ev); + CORBA_free (e.any_data._value); } xkb_mod_unlatch_occurred = (xevent->type == ButtonPress || @@ -1088,6 +1120,9 @@ global_filter_fn (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) priv = (DEControllerPrivateData *) g_object_get_qdata (G_OBJECT (controller), spi_dec_private_quark); + if (xevent->type == MappingNotify) + xmkeymap = NULL; + if (xevent->type == KeyPress || xevent->type == KeyRelease) { if (controller->xevie_display == NULL) @@ -1205,7 +1240,7 @@ global_filter_fn (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) return GDK_FILTER_CONTINUE; } -int +static int _spi_controller_device_error_handler (Display *display, XErrorEvent *error) { if (error->error_code == BadAccess) @@ -1389,7 +1424,7 @@ spi_key_event_matches_listener (const Accessibility_DeviceEvent *key_event, DEControllerKeyListener *listener, CORBA_boolean is_system_global) { - if ((key_event->modifiers == (CORBA_unsigned_short) (listener->mask & 0xFF)) && + if (((key_event->modifiers & 0xFF) == (CORBA_unsigned_short) (listener->mask & 0xFF)) && spi_key_set_contains_key (listener->keys, key_event) && spi_eventtype_seq_contains_event (listener->listener.typeseq, key_event) && (is_system_global == listener->mode->global)) @@ -1404,7 +1439,7 @@ spi_key_event_matches_listener (const Accessibility_DeviceEvent *key_event, static gboolean spi_controller_notify_keylisteners (SpiDEController *controller, - const Accessibility_DeviceEvent *key_event, + Accessibility_DeviceEvent *key_event, CORBA_boolean is_system_global, CORBA_Environment *ev) { @@ -1418,6 +1453,10 @@ spi_controller_notify_keylisteners (SpiDEController *controller, return FALSE; } + /* set the NUMLOCK event mask bit if appropriate: see bug #143702 */ + if (key_event->modifiers & _numlock_physical_mask) + key_event->modifiers |= SPI_KEYMASK_NUMLOCK; + for (l = *key_listeners; l; l = l->next) { DEControllerKeyListener *key_listener = l->data; @@ -1448,7 +1487,8 @@ spi_controller_notify_keylisteners (SpiDEController *controller, DEControllerKeyListener *key_listener = l2->data; Accessibility_DeviceEventListener ls = key_listener->listener.object; - is_consumed = Accessibility_DeviceEventListener_notifyEvent (ls, key_event, ev); + is_consumed = Accessibility_DeviceEventListener_notifyEvent (ls, key_event, ev) && + key_listener->mode->preemptive; if (BONOBO_EX (ev)) { @@ -1477,7 +1517,7 @@ spi_controller_notify_keylisteners (SpiDEController *controller, } static gboolean -spi_clear_error_state () +spi_clear_error_state (void) { gboolean retval = spi_error_code != 0; spi_error_code = 0; @@ -1589,8 +1629,8 @@ spi_keystroke_from_x_key_event (XKeyEvent *x_key_event) gunichar c; cbuf[nbytes] = '\0'; /* OK since length is cbuf_bytes+1 */ key_event.event_string = CORBA_string_dup (cbuf); - c = g_utf8_get_char_validated (cbuf, nbytes); - if ((c > 0) && g_unichar_isprint (c)) + c = keysym2ucs (keysym); + if (c > 0 && !g_unichar_iscntrl (c)) { key_event.is_text = CORBA_TRUE; /* incorrect for some composed chars? */ @@ -1641,7 +1681,7 @@ spi_controller_update_key_grabs (SpiDEController *controller, { GList *l, *next; gboolean update_failed = FALSE; - KeyCode keycode; + KeyCode keycode = 0; g_return_val_if_fail (controller != NULL, FALSE); @@ -2094,15 +2134,37 @@ dec_get_modifier_state (SpiDEController *controller) static gboolean dec_lock_modifiers (SpiDEController *controller, unsigned modifiers) { - return XkbLockModifiers (spi_get_display (), XkbUseCoreKbd, - modifiers, modifiers); + DEControllerPrivateData *priv = (DEControllerPrivateData *) + g_object_get_qdata (G_OBJECT (controller), spi_dec_private_quark); + + if (priv->have_xkb) { + return XkbLockModifiers (spi_get_display (), XkbUseCoreKbd, + modifiers, modifiers); + } else { + int mod_index; + for (mod_index=0;mod_index<8;mod_index++) + if (modifiers & (1<modifiermap[mod_index]); + return TRUE; + } } static gboolean dec_unlock_modifiers (SpiDEController *controller, unsigned modifiers) { - return XkbLockModifiers (spi_get_display (), XkbUseCoreKbd, - modifiers, 0); + DEControllerPrivateData *priv = (DEControllerPrivateData *) + g_object_get_qdata (G_OBJECT (controller), spi_dec_private_quark); + + if (priv->have_xkb) { + return XkbLockModifiers (spi_get_display (), XkbUseCoreKbd, + modifiers, 0); + } else { + int mod_index; + for (mod_index=0;mod_index<8;mod_index++) + if (modifiers & (1<modifiermap[mod_index]); + return TRUE; + } } static KeySym @@ -2216,9 +2278,9 @@ impl_generate_keyboard_event (PortableServer_Servant servant, { SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER (bonobo_object (servant)); - long key_synth_code; gint err; KeySym keysym; + DEControllerPrivateData *priv; #ifdef SPI_DEBUG fprintf (stderr, "synthesizing keystroke %ld, type %d\n", @@ -2232,7 +2294,13 @@ impl_generate_keyboard_event (PortableServer_Servant servant, */ gdk_error_trap_push (); - key_synth_code = keycode; + + priv = (DEControllerPrivateData *) + g_object_get_qdata (G_OBJECT (controller), spi_dec_private_quark); + + if (!priv->have_xkb && xmkeymap==NULL) { + xmkeymap = XGetModifierMapping(spi_get_display ()); + } switch (synth_type) { @@ -2261,7 +2329,7 @@ impl_generate_keyboard_event (PortableServer_Servant servant, keystring); break; } - if (err = gdk_error_trap_pop ()) + if ((err = gdk_error_trap_pop ())) { DBG (-1, g_warning ("Error [%d] emitting keystroke", err)); } @@ -2356,7 +2424,9 @@ impl_notify_listeners_sync (PortableServer_Servant servant, g_print ("notifylistening listeners synchronously: controller %p, event id %d\n", controller, (int) event->id); #endif - return spi_controller_notify_keylisteners (controller, event, CORBA_FALSE, ev) ? + return spi_controller_notify_keylisteners (controller, + (Accessibility_DeviceEvent *) + event, CORBA_FALSE, ev) ? CORBA_TRUE : CORBA_FALSE; } @@ -2371,7 +2441,8 @@ impl_notify_listeners_async (PortableServer_Servant servant, #ifdef SPI_DEBUG fprintf (stderr, "notifying listeners asynchronously\n"); #endif - spi_controller_notify_keylisteners (controller, event, CORBA_FALSE, ev); + spi_controller_notify_keylisteners (controller, (Accessibility_DeviceEvent *) + event, CORBA_FALSE, ev); } static void @@ -2398,15 +2469,12 @@ spi_device_event_controller_class_init (SpiDEControllerClass *klass) } #ifdef HAVE_XEVIE -Bool isEvent(dpy,event,arg) - Display *dpy; - XEvent *event; - char *arg; +static Bool isEvent(Display *dpy, XEvent *event, char *arg) { return TRUE; } -gboolean +static gboolean handle_io (GIOChannel *source, GIOCondition condition, gpointer data) @@ -2481,6 +2549,7 @@ spi_device_event_controller_forward_key_event (SpiDEController *controller, { CORBA_Environment ev; Accessibility_DeviceEvent key_event; + gboolean ret; g_assert (event->type == KeyPress || event->type == KeyRelease); @@ -2492,7 +2561,9 @@ spi_device_event_controller_forward_key_event (SpiDEController *controller, spi_controller_update_key_grabs (controller, &key_event); /* relay to listeners, and decide whether to consume it or not */ - return spi_controller_notify_keylisteners (controller, &key_event, CORBA_TRUE, &ev); + ret = spi_controller_notify_keylisteners (controller, &key_event, CORBA_TRUE, &ev); + CORBA_free(key_event.event_string); + return ret; } SpiDEController * @@ -2514,7 +2585,6 @@ is_key_released (KeyCode code) { char keys[32]; int down; - int i; XQueryKeymap (spi_get_display (), keys); down = BIT (keys, code);