static GQuark spi_dec_private_quark = 0;
-int (*x_default_error_handler) (Display *display, XErrorEvent *error_event);
+static int (*x_default_error_handler) (Display *display, XErrorEvent *error_event);
typedef enum {
SPI_DEVICE_TYPE_KBD,
if (desc && desc->map)
{
gint offset = desc->map->key_sym_map[keycode].offset;
- long old_sym = desc->map->syms[offset];
desc->map->syms[offset] = keysym;
}
else
e.source = BONOBO_OBJREF (controller->registry->desktop);
e.detail1 = last_mouse_pos->x;
e.detail2 = last_mouse_pos->y;
- spi_init_any_nil (&e.any_data);
+ spi_init_any_nil (&e.any_data,
+ spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+ Accessibility_ROLE_UNKNOWN,
+ "");
CORBA_exception_init (&ev);
if (!is_consumed)
{
}
else
spi_dec_set_unlatch_pending (controller, mask_return);
+
+ CORBA_free (e.any_data._value);
}
return TRUE;
}
int *x, int *y, gboolean *moved)
{
Accessibility_Event e;
+ Accessibility_EventDetails *details;
CORBA_Environment ev;
int win_x_return,win_y_return;
unsigned int mask_return;
e.source = BONOBO_OBJREF (controller->registry->desktop);
e.detail1 = *x;
e.detail2 = *y;
- spi_init_any_nil (&e.any_data);
+ spi_init_any_nil (&e.any_data,
+ spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+ Accessibility_ROLE_UNKNOWN,
+ "");
CORBA_exception_init (&ev);
Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry),
&e,
&ev);
+ details = e.any_data._value;
+ CORBA_free (details);
e.type = "mouse:rel";
e.source = BONOBO_OBJREF (controller->registry->desktop);
e.detail1 = *x - last_mouse_pos->x;
e.detail2 = *y - last_mouse_pos->y;
- spi_init_any_nil (&e.any_data);
+ spi_init_any_nil (&e.any_data,
+ spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+ Accessibility_ROLE_UNKNOWN,
+ "");
CORBA_exception_init (&ev);
last_mouse_pos->x = *x;
last_mouse_pos->y = *y;
Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry),
&e,
&ev);
+ details = e.any_data._value;
+ CORBA_free (details);
*moved = True;
}
else
e.source = BONOBO_OBJREF (controller->registry->desktop);
e.detail1 = prev_mask & key_modifier_mask;
e.detail2 = current_mask & key_modifier_mask;
- spi_init_any_nil (&e.any_data);
+ spi_init_any_nil (&e.any_data,
+ spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+ Accessibility_ROLE_UNKNOWN,
+ "");
CORBA_exception_init (&ev);
Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry),
&e,
&ev);
+ CORBA_free (e.any_data._value);
}
static gboolean
static void
spi_dec_init_mouse_listener (SpiRegistry *registry)
{
+#ifdef GRAB_BUTTON
Display *display = spi_get_display ();
+#endif
g_timeout_add (100, spi_dec_poll_mouse_idle, registry);
+#ifdef GRAB_BUTTON
if (display)
{
if (XGrabButton (display, AnyButton, AnyModifier,
fprintf (stderr, "mouse buttons grabbed\n");
#endif
}
+#endif
}
/**
GSList *notify = NULL, *l2;
GList **listeners = &controller->mouse_listeners;
gboolean is_consumed;
+#ifdef SPI_KEYEVENT_DEBUG
gboolean found = FALSE;
-
+#endif
if (!listeners)
{
return FALSE;
/* we clone (don't dup) the listener, to avoid refcount inc. */
notify = g_slist_prepend (notify,
spi_listener_clone (listener, ev));
+#ifdef SPI_KEYEVENT_DEBUG
found = TRUE;
+#endif
}
}
}
e.source = BONOBO_OBJREF (controller->registry->desktop);
e.detail1 = last_mouse_pos->x;
e.detail2 = last_mouse_pos->y;
- spi_init_any_nil (&e.any_data);
+ spi_init_any_nil (&e.any_data,
+ spi_accessible_new_return (atk_get_root (), FALSE, NULL),
+ Accessibility_ROLE_UNKNOWN,
+ "");
CORBA_exception_init (&ev);
Accessibility_Registry_notifyEvent (BONOBO_OBJREF (controller->registry),
&e,
&ev);
+ CORBA_free (e.any_data._value);
}
xkb_mod_unlatch_occurred = (xevent->type == ButtonPress ||
return GDK_FILTER_CONTINUE;
}
-int
+static int
_spi_controller_device_error_handler (Display *display, XErrorEvent *error)
{
if (error->error_code == BadAccess)
static gboolean
spi_controller_notify_keylisteners (SpiDEController *controller,
- const Accessibility_DeviceEvent *key_event,
+ Accessibility_DeviceEvent *key_event,
CORBA_boolean is_system_global,
CORBA_Environment *ev)
{
return FALSE;
}
+ /* set the NUMLOCK event mask bit if appropriate: see bug #143702 */
+ if (key_event->modifiers & _numlock_physical_mask)
+ key_event->modifiers |= SPI_KEYMASK_NUMLOCK;
+
for (l = *key_listeners; l; l = l->next)
{
DEControllerKeyListener *key_listener = l->data;
DEControllerKeyListener *key_listener = l2->data;
Accessibility_DeviceEventListener ls = key_listener->listener.object;
- is_consumed = Accessibility_DeviceEventListener_notifyEvent (ls, key_event, ev);
+ is_consumed = Accessibility_DeviceEventListener_notifyEvent (ls, key_event, ev) &&
+ key_listener->mode->preemptive;
if (BONOBO_EX (ev))
{
}
static gboolean
-spi_clear_error_state ()
+spi_clear_error_state (void)
{
gboolean retval = spi_error_code != 0;
spi_error_code = 0;
{
GList *l, *next;
gboolean update_failed = FALSE;
- KeyCode keycode;
+ KeyCode keycode = 0;
g_return_val_if_fail (controller != NULL, FALSE);
{
SpiDEController *controller =
SPI_DEVICE_EVENT_CONTROLLER (bonobo_object (servant));
- long key_synth_code;
gint err;
KeySym keysym;
*/
gdk_error_trap_push ();
- key_synth_code = keycode;
switch (synth_type)
{
keystring);
break;
}
- if (err = gdk_error_trap_pop ())
+ if ((err = gdk_error_trap_pop ()))
{
DBG (-1, g_warning ("Error [%d] emitting keystroke", err));
}
g_print ("notifylistening listeners synchronously: controller %p, event id %d\n",
controller, (int) event->id);
#endif
- return spi_controller_notify_keylisteners (controller, event, CORBA_FALSE, ev) ?
+ return spi_controller_notify_keylisteners (controller,
+ (Accessibility_DeviceEvent *)
+ event, CORBA_FALSE, ev) ?
CORBA_TRUE : CORBA_FALSE;
}
#ifdef SPI_DEBUG
fprintf (stderr, "notifying listeners asynchronously\n");
#endif
- spi_controller_notify_keylisteners (controller, event, CORBA_FALSE, ev);
+ spi_controller_notify_keylisteners (controller, (Accessibility_DeviceEvent *)
+ event, CORBA_FALSE, ev);
}
static void
}
#ifdef HAVE_XEVIE
-Bool isEvent(dpy,event,arg)
- Display *dpy;
- XEvent *event;
- char *arg;
+static Bool isEvent(Display *dpy, XEvent *event, char *arg)
{
return TRUE;
}
-gboolean
+static gboolean
handle_io (GIOChannel *source,
GIOCondition condition,
gpointer data)
{
CORBA_Environment ev;
Accessibility_DeviceEvent key_event;
+ gboolean ret;
g_assert (event->type == KeyPress || event->type == KeyRelease);
spi_controller_update_key_grabs (controller, &key_event);
/* relay to listeners, and decide whether to consume it or not */
- return spi_controller_notify_keylisteners (controller, &key_event, CORBA_TRUE, &ev);
+ ret = spi_controller_notify_keylisteners (controller, &key_event, CORBA_TRUE, &ev);
+ CORBA_free(key_event.event_string);
+ return ret;
}
SpiDEController *
{
char keys[32];
int down;
- int i;
XQueryKeymap (spi_get_display (), keys);
down = BIT (keys, code);