Added C binding for key synthesis, and a new test/demo program
[platform/core/uifw/at-spi2-atk.git] / cspi / spi_registry.c
index 28f39de..aa294c1 100644 (file)
@@ -5,6 +5,10 @@
  *
  */
 
+/* static stuff used only by registry C bindings */
+static GList *key_listeners = NULL;
+static Display *display = NULL;
+
 /**
  * registerGlobalEventListener:
  * @listener: the #AccessibleEventListener to be registered against an event type.
@@ -48,6 +52,34 @@ registerGlobalEventListener (AccessibleEventListener *listener,
 }
 
 /**
+ * deregisterGlobalEventListener:
+ * @listener: the #AccessibleEventListener to be registered against an event type.
+ *
+ * deregisters an AccessibleEventListener from the registry, for all event types it may be listening to.
+ *
+ * Returns: #TRUE if successful, otherwise #FALSE.
+ *
+ **/
+boolean
+deregisterGlobalEventListenerAll (AccessibleEventListener *listener)
+{
+  Accessibility_Registry_deregisterGlobalEventListenerAll (
+                         registry,
+                         (Accessibility_EventListener)
+                            CORBA_Object_duplicate (bonobo_object_corba_objref (bonobo_object (listener)), &ev),
+                         &ev);
+
+  if (ev._major != CORBA_NO_EXCEPTION)
+    {
+    return FALSE;
+    }
+  else
+    {
+      return TRUE;
+    }
+}
+
+/**
  * getDesktopCount:
  *
  * Get the number of virtual desktops.
@@ -101,16 +133,68 @@ getDesktopList (Accessible **list)
   return 0;
 }
 
+static gboolean
+key_event_source_func (void *p)
+{
+  GList *listeners = (GList *)p;
+  XEvent *x_event = g_new0 (XEvent, 1);
+  while (XPending (display))
+    {
+      XNextEvent (display, x_event);
+      while (listeners)
+        {
+        /* if the listener mask matches, notify it*/
+          if (1)
+           {
+             ;   
+           }
+       }
+    }
+  return TRUE;
+}
+
+void
+save_this_impl_registerKeystrokeListener (KeystrokeListener *listener, KeyMaskType keymask)
+{
+  static gboolean initialized = FALSE;
+  static Window grab_window;
+  XEvent *x_event = g_new0(XEvent, 1);
+  key_listeners = g_list_append (key_listeners, listener);
+  if (!initialized)
+    {
+      g_timeout_add_full (G_PRIORITY_HIGH_IDLE, 200, key_event_source_func, key_listeners, NULL);
+      display = XOpenDisplay (getenv ("DISPLAY"));
+      grab_window = DefaultRootWindow (display);
+      XSelectInput (display, grab_window, KeyPress | KeyRelease);
+      initialized = TRUE;
+    }
+  /* */
+  XGrabKey (display,
+           AnyKey,
+           LockMask,
+           grab_window,
+           False,
+           GrabModeAsync,
+           GrabModeAsync);
+  while (0)
+  {
+         XNextEvent (display, x_event);
+         g_print ("foo!\n");
+  }
+}
 /**
  * registerKeystrokeListener:
  * @listener: a pointer to the #KeystrokeListener for which
  *            keystroke events are requested.
  *
- * Not Yet Implemented.
- *
  **/
 void
-registerKeystrokeListener (KeystrokeListener *listener, KeyMaskType keymask)
+registerKeystrokeListener (KeystrokeListener *listener,
+                          KeySet *keys,
+                          KeyMaskType modmask,
+                          KeyEventMask eventmask,
+                          KeyListenerSyncType sync_type)
 {
   Accessibility_ControllerEventMask *controller_event_mask =
          Accessibility_ControllerEventMask__alloc();
@@ -118,19 +202,50 @@ registerKeystrokeListener (KeystrokeListener *listener, KeyMaskType keymask)
          Accessibility_Registry_getDeviceEventController (registry, &ev);
   Accessibility_KeySet *all_keys = Accessibility_KeySet__alloc();
   Accessibility_KeyEventTypeSeq *key_events = Accessibility_KeyEventTypeSeq__alloc();
+  Accessibility_KeystrokeListener listener_corba_ref;
   Accessibility_DeviceEventController_ref (device_event_controller, &ev);
-  controller_event_mask->value = (CORBA_unsigned_long) keymask;
+  controller_event_mask->value = (CORBA_unsigned_long) modmask;
   controller_event_mask->refcount = (CORBA_unsigned_short) 1;
-  /*
-  fprintf (stderr, "controller %p, mask value %lu\n", (void *) device_event_controller,
-          (unsigned long) controller_event_mask->value );
-  */
 
+  listener_corba_ref = (Accessibility_KeystrokeListener)
+         CORBA_Object_duplicate (bonobo_object_corba_objref (bonobo_object (listener)), &ev);
+  
+         Accessibility_DeviceEventController_registerKeystrokeListener (
+         device_event_controller,
+         listener_corba_ref,
+         all_keys,
+         controller_event_mask,
+         key_events,
+         (CORBA_boolean) ((sync_type | KEYLISTENER_CANCONSUME)!=0),
+         &ev);
+}
 
-  Accessibility_DeviceEventController_registerKeystrokeListener (
+/**
+ * deregisterKeystrokeListener:
+ * @listener: a pointer to the #KeystrokeListener for which
+ *            keystroke events are requested.
+ *
+ **/
+void
+deregisterKeystrokeListener (KeystrokeListener *listener, KeyMaskType keymask)
+{
+  Accessibility_ControllerEventMask *controller_event_mask =
+         Accessibility_ControllerEventMask__alloc();
+  Accessibility_DeviceEventController device_event_controller = 
+         Accessibility_Registry_getDeviceEventController (registry, &ev);
+  Accessibility_KeySet *all_keys = Accessibility_KeySet__alloc();
+  Accessibility_KeyEventTypeSeq *key_events = Accessibility_KeyEventTypeSeq__alloc();
+  Accessibility_KeystrokeListener listener_corba_ref;
+  Accessibility_DeviceEventController_unref (device_event_controller, &ev);
+  controller_event_mask->value = (CORBA_unsigned_long) keymask;
+  controller_event_mask->refcount = (CORBA_unsigned_short) 1;
+
+  listener_corba_ref = (Accessibility_KeystrokeListener)
+         CORBA_Object_duplicate (bonobo_object_corba_objref (bonobo_object (listener)), &ev);
+  
+  Accessibility_DeviceEventController_deregisterKeystrokeListener (
          device_event_controller,
-         (Accessibility_KeystrokeListener)
-             bonobo_object_corba_objref (bonobo_object (listener)),
+         listener_corba_ref,
          all_keys,
          controller_event_mask,
          key_events,
@@ -151,9 +266,17 @@ registerKeystrokeListener (KeystrokeListener *listener, KeyMaskType keymask)
  *
  **/
 void
-generateKeyEvent (long keyCode, long meta)
+generateKeyEvent (long keyval, KeySynthType type)
 {
-  ;
+/* TODO: check current modifier status and
+ *  send keycode to alter, if necessary
+ */
+  Accessibility_DeviceEventController device_event_controller = 
+         Accessibility_Registry_getDeviceEventController (registry, &ev);
+  Accessibility_DeviceEventController_generateKeyEvent (device_event_controller,
+                                                       keyval,
+                                                       (unsigned long) type,
+                                                       &ev);
 }
 
 /**