+spi_controller_deregister_global_keygrabs (SpiDeviceEventController *controller,
+ DEControllerKeyListener *key_listener)
+{
+ GList *list_ptr;
+ DEControllerGrabMask *mask_ptr;
+ /* TODO: implement this! Also remember to release any keygrabs still held */
+ ;
+}
+
+static void
+spi_controller_register_global_keygrabs (SpiDeviceEventController *controller,
+ DEControllerKeyListener *key_listener)
+{
+ DEControllerGrabMask grabmask, *grabmask_ptr;
+ GList *list_ptr;
+ gint i;
+ /* TODO: deregistration version of this function */
+
+ grabmask.modmask = key_listener->mask;
+ if (key_listener->keys->_length == 0) /* special case means AnyKey/AllKeys */
+ {
+ grabmask.keyval = AnyKey;
+ list_ptr = g_list_find_custom (controller->keygrabs_list, &grabmask,
+ spi_grabmask_compare_values);
+ if (list_ptr)
+ {
+ grabmask_ptr = (DEControllerGrabMask *) list_ptr->data;
+ grabmask_ptr->refcount++;
+ }
+ else
+ {
+ controller->keygrabs_list =
+ g_list_prepend (controller->keygrabs_list,
+ spi_grabmask_clone (&grabmask));
+ }
+ }
+ else
+ {
+ for (i = 0; i < key_listener->keys->_length; ++i)
+ {
+ long int keyval = key_listener->keys->_buffer[i];
+ /* X Grabs require keycodes, not keysyms */
+ if (keyval >= 0)
+ {
+ keyval = XKeysymToKeycode(spi_get_display (), (KeySym) keyval);
+ }
+ grabmask.keyval = keyval;
+ list_ptr = g_list_find_custom (controller->keygrabs_list, &grabmask,
+ spi_grabmask_compare_values);
+ if (list_ptr)
+ {
+ grabmask_ptr = (DEControllerGrabMask *) list_ptr->data;
+ grabmask_ptr->refcount++;
+ }
+ else
+ {
+ controller->keygrabs_list =
+ g_list_prepend (controller->keygrabs_list,
+ spi_grabmask_clone (&grabmask));
+ fprintf (stderr, "appending mask with val=%lu\n",
+ (unsigned long) grabmask.modmask);
+ }
+ }
+ }
+}
+
+static void
+spi_controller_register_device_listener (SpiDeviceEventController *controller,
+ DEControllerListener *listener,
+ CORBA_Environment *ev)