+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<len; ++i)
+ {
+#ifdef SPI_KEYEVENT_DEBUG
+ g_print ("key_set[%d] = %d; key_event %d, code %d\n",
+ i,
+ (int) key_set->_buffer[i],
+ (int) key_event->keyID,
+ (int) key_event->keycode);
+#endif
+ if (key_set->_buffer[i] == (CORBA_long) key_event->keyID) return TRUE;
+ if (key_set->_buffer[i] == (CORBA_long) -key_event->keycode) return TRUE;
+ }
+
+ return FALSE;
+}
+
+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<len; ++i)
+ {
+/* g_print ("type_seq[%d] = %d\n", i, (int) type_seq->_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)
+{
+ 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;
+ }
+ else
+ return FALSE;
+}
+
+static gboolean
+notify_keylisteners (GList *key_listeners,
+ Accessibility_KeyStroke *key_event,
+ CORBA_boolean is_system_global,
+ CORBA_Environment *ev)
+{
+ int i, n_listeners = g_list_length (key_listeners);
+ gboolean is_consumed = FALSE;
+
+ for (i=0; i<n_listeners && !is_consumed; ++i)
+ {
+ Accessibility_KeystrokeListener ls;
+ DEControllerKeyListener *key_listener = (DEControllerKeyListener *)
+ g_list_nth_data (key_listeners, i);
+ ls = (Accessibility_KeystrokeListener) key_listener->listener.object;
+ if (key_event_matches_listener (key_event, key_listener, is_system_global))
+ {
+ if (!CORBA_Object_is_nil(ls, ev))
+ {
+ is_consumed = Accessibility_KeystrokeListener_keyEvent (ls, key_event, ev);
+ }
+ }
+ else
+ {
+#ifdef SPI_KEYEVENT_DEBUG
+ g_print ("no match for listener %d\n", i);
+#endif
+ ;
+ }
+ }
+ return is_consumed;
+}
+
+static gboolean