From: billh Date: Wed, 21 Nov 2001 23:55:52 +0000 (+0000) Subject: Added filters for key events, so now basic key event support X-Git-Tag: AT_SPI2_CORE_0_1_3~1061 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1606c1dc9d0254169ab4d82ce64895ee8f4536de;p=platform%2Fupstream%2Fat-spi2-core.git Added filters for key events, so now basic key event support should be complete (initial implementation). git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@109 e2bd861d-eb25-0410-b326-f6ed22b6b98c --- diff --git a/ChangeLog b/ChangeLog index f7a6f58..f88a755 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2001-21-11 Bill Haneman + * libspi/deviceeventcontroller.c: + * libspi/keystrokelistener.c: + * cspi/spi_event.c: + * cspi/spi_registry.c: + Added filters for KeySets, KeyEventSeq, and event types to key + event dispatching, so listeners should only receive those events + that they requested :-) + +2001-21-11 Bill Haneman + * configure.in: * docs/Makefile.am: * docs/reference: diff --git a/cspi/spi.h b/cspi/spi.h index 97e6409..64bd801 100644 --- a/cspi/spi.h +++ b/cspi/spi.h @@ -61,9 +61,10 @@ typedef enum { SPI_COORD_TYPE_WINDOW } AccessibleCoordType; +/* XXX: must be single bits since they are used as masks in keylistener API */ typedef enum { - SPI_KEY_PRESSED, - SPI_KEY_RELEASED + SPI_KEY_PRESSED = 1, + SPI_KEY_RELEASED = 2 } AccessibleKeyEventType; typedef enum { diff --git a/cspi/spi_event.c b/cspi/spi_event.c index 3b2f458..a6280e0 100644 --- a/cspi/spi_event.c +++ b/cspi/spi_event.c @@ -133,7 +133,7 @@ boolean AccessibleKeystrokeListener_removeCallback (AccessibleKeystrokeListener *listener, AccessibleKeystrokeListenerCB callback) { - keystroke_listener_remove_callback (listener, callback); + spi_keystroke_listener_remove_callback (listener, callback); return TRUE; } diff --git a/cspi/spi_registry.c b/cspi/spi_registry.c index 382f253..8826eaf 100644 --- a/cspi/spi_registry.c +++ b/cspi/spi_registry.c @@ -281,10 +281,46 @@ registerAccessibleKeystrokeListener (AccessibleKeystrokeListener *listener, Accessibility_ControllerEventMask__alloc(); Accessibility_DeviceEventController device_event_controller = Accessibility_Registry_getDeviceEventController (registry, &ev); - Accessibility_KeySet *all_keys = Accessibility_KeySet__alloc(); + Accessibility_KeySet *key_set = Accessibility_KeySet__alloc(); Accessibility_KeyEventTypeSeq *key_events = Accessibility_KeyEventTypeSeq__alloc(); Accessibility_KeystrokeListener spi_listener_corba_ref; + gint i, mask; Accessibility_DeviceEventController_ref (device_event_controller, &ev); + + /* copy the keyval filter values from the C api into the CORBA KeySet */ + if (keys) + { + key_set->_buffer = Accessibility_KeySet_allocbuf ( + (unsigned long) keys->len); + key_set->_length = (unsigned long) keys->len; + for (i=0; i < key_set->_length; ++i) + { + /* we overload the keyset long w/keycodes, the - bit acts as a flag */ + key_set->_buffer[i] = (keys->keysyms[i]) ? keys->keysyms[i] : + -keys->keycodes[i]; + } + } + /* copy the event filter values from the C api into the CORBA KeyEventTypeSeq */ + mask=1; + i=0; + do + { + if (mask & eventmask) ++i; + mask <<= 1; + } while (mask & 0xFFFF); + + key_events->_buffer = Accessibility_KeyEventTypeSeq_allocbuf (i); + i=0; + if (eventmask & SPI_KEY_PRESSED) + { + key_events->_buffer[i++] = Accessibility_KEY_PRESSED; + } + if (eventmask & SPI_KEY_RELEASED) + { + key_events->_buffer[i++] = Accessibility_KEY_RELEASED; + } + key_events->_length = i; + controller_event_mask->value = (CORBA_unsigned_long) modmask; controller_event_mask->refcount = (CORBA_unsigned_short) 1; @@ -294,7 +330,7 @@ registerAccessibleKeystrokeListener (AccessibleKeystrokeListener *listener, Accessibility_DeviceEventController_registerKeystrokeListener ( device_event_controller, spi_listener_corba_ref, - all_keys, + key_set, controller_event_mask, key_events, (CORBA_boolean) ((sync_type | SPI_KEYLISTENER_ALL_WINDOWS)!=0), diff --git a/libspi/deviceeventcontroller.c b/libspi/deviceeventcontroller.c index 9897f38..1356866 100644 --- a/libspi/deviceeventcontroller.c +++ b/libspi/deviceeventcontroller.c @@ -129,13 +129,15 @@ dec_key_listener_new (CORBA_Object l, key_listener->listener.type = SPI_DEVICE_TYPE_KBD; key_listener->keys = ORBit_copy_value (keys, TC_Accessibility_KeySet); key_listener->mask = ORBit_copy_value (mask, TC_Accessibility_ControllerEventMask); + key_listener->typeseq = ORBit_copy_value (typeseq, TC_Accessibility_KeyEventTypeSeq); key_listener->is_system_global = is_system_global; +#ifdef SPI_DEBUG g_print ("new listener, with mask %x, is_global %d, keys %p\n", (unsigned int) key_listener->mask->value, (int) key_listener->is_system_global, (void *) key_listener->keys); - +#endif return key_listener; } @@ -246,17 +248,65 @@ _controller_register_with_devices (SpiDeviceEventController *controller) return retval; } +static gboolean +key_set_contains_key (Accessibility_KeySet *key_set, Accessibility_KeyStroke *key_event) +{ + gint i; + gint len; + + /* g_assert (key_set); */ + if (!key_set) { g_print ("null key set!"); return TRUE; } + + len = key_set->_length; + + if (len == 0) /* special case, means "all keys/any key" */ + { + return TRUE; + } + + for (i=0; i_buffer[i]); + if (key_set->_buffer[i] == (CORBA_long) key_event->keyID) return TRUE; + } + + return TRUE; +} + +static gboolean +key_eventtype_seq_contains_event (Accessibility_KeyEventTypeSeq *type_seq, + Accessibility_KeyStroke *key_event) +{ + gint i; + gint len; + + /* g_assert (type_seq); */ + if (!type_seq) { g_print ("null type seq!"); return TRUE; } + + len = type_seq->_length; + + if (len == 0) /* special case, means "all events/any event" */ + { + return TRUE; + } + + for (i=0; i_buffer[i]); + if (type_seq->_buffer[i] == (CORBA_long) key_event->type) return TRUE; + } + + return TRUE; +} static gboolean key_event_matches_listener (Accessibility_KeyStroke *key_event, DEControllerKeyListener *listener, CORBA_boolean is_system_global) { - g_print ("mask=%x, listener mask= %x\n", (unsigned int) key_event->modifiers, - (unsigned int) (listener->mask->value & 0xFFFF)); - if ((key_event->modifiers == (CORBA_unsigned_short) (listener->mask->value && 0xFFFF)) && - ((listener->keys == NULL) || (1)) && /* in keyset seq */ - (1) && /* in event type seq */ + if ((key_event->modifiers == (CORBA_unsigned_short) (listener->mask->value & 0xFFFF)) && + key_set_contains_key (listener->keys, key_event) && + key_eventtype_seq_contains_event (listener->typeseq, key_event) && (is_system_global == listener->is_system_global)) { return TRUE; diff --git a/libspi/keystrokelistener.c b/libspi/keystrokelistener.c index 6e4d69d..9ec6a10 100644 --- a/libspi/keystrokelistener.c +++ b/libspi/keystrokelistener.c @@ -57,8 +57,8 @@ void spi_keystroke_listener_add_callback (SpiKeystrokeListener *listener, #endif } -void keystroke_listener_remove_callback (SpiKeystrokeListener *listener, - BooleanKeystrokeListenerCB callback) +void spi_keystroke_listener_remove_callback (SpiKeystrokeListener *listener, + BooleanKeystrokeListenerCB callback) { listener->callbacks = g_list_remove (listener->callbacks, callback); } @@ -88,6 +88,13 @@ impl_key_event (PortableServer_Servant servant, (char) toupper((int) key->keyID) : (char) tolower((int) key->keyID)); } #endif + /* TODO: convert from the CORBA-based struct to a c-type-based one ? */ + fprintf (stderr, "Key:\tsym %ld\n\tmods %x\n\tcode %d\n\ttime %ld\n", + (long) key->keyID, + (unsigned int) key->modifiers, + (int) key->keycode, + (long int) key->timestamp); + while (callbacks) { BooleanKeystrokeListenerCB cb = (BooleanKeystrokeListenerCB) callbacks->data; diff --git a/registryd/deviceeventcontroller.c b/registryd/deviceeventcontroller.c index 9897f38..1356866 100644 --- a/registryd/deviceeventcontroller.c +++ b/registryd/deviceeventcontroller.c @@ -129,13 +129,15 @@ dec_key_listener_new (CORBA_Object l, key_listener->listener.type = SPI_DEVICE_TYPE_KBD; key_listener->keys = ORBit_copy_value (keys, TC_Accessibility_KeySet); key_listener->mask = ORBit_copy_value (mask, TC_Accessibility_ControllerEventMask); + key_listener->typeseq = ORBit_copy_value (typeseq, TC_Accessibility_KeyEventTypeSeq); key_listener->is_system_global = is_system_global; +#ifdef SPI_DEBUG g_print ("new listener, with mask %x, is_global %d, keys %p\n", (unsigned int) key_listener->mask->value, (int) key_listener->is_system_global, (void *) key_listener->keys); - +#endif return key_listener; } @@ -246,17 +248,65 @@ _controller_register_with_devices (SpiDeviceEventController *controller) return retval; } +static gboolean +key_set_contains_key (Accessibility_KeySet *key_set, Accessibility_KeyStroke *key_event) +{ + gint i; + gint len; + + /* g_assert (key_set); */ + if (!key_set) { g_print ("null key set!"); return TRUE; } + + len = key_set->_length; + + if (len == 0) /* special case, means "all keys/any key" */ + { + return TRUE; + } + + for (i=0; i_buffer[i]); + if (key_set->_buffer[i] == (CORBA_long) key_event->keyID) return TRUE; + } + + return TRUE; +} + +static gboolean +key_eventtype_seq_contains_event (Accessibility_KeyEventTypeSeq *type_seq, + Accessibility_KeyStroke *key_event) +{ + gint i; + gint len; + + /* g_assert (type_seq); */ + if (!type_seq) { g_print ("null type seq!"); return TRUE; } + + len = type_seq->_length; + + if (len == 0) /* special case, means "all events/any event" */ + { + return TRUE; + } + + for (i=0; i_buffer[i]); + if (type_seq->_buffer[i] == (CORBA_long) key_event->type) return TRUE; + } + + return TRUE; +} static gboolean key_event_matches_listener (Accessibility_KeyStroke *key_event, DEControllerKeyListener *listener, CORBA_boolean is_system_global) { - g_print ("mask=%x, listener mask= %x\n", (unsigned int) key_event->modifiers, - (unsigned int) (listener->mask->value & 0xFFFF)); - if ((key_event->modifiers == (CORBA_unsigned_short) (listener->mask->value && 0xFFFF)) && - ((listener->keys == NULL) || (1)) && /* in keyset seq */ - (1) && /* in event type seq */ + if ((key_event->modifiers == (CORBA_unsigned_short) (listener->mask->value & 0xFFFF)) && + key_set_contains_key (listener->keys, key_event) && + key_eventtype_seq_contains_event (listener->typeseq, key_event) && (is_system_global == listener->is_system_global)) { return TRUE;