+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)