+2002-01-11 Bill Haneman <bill.haneman@sun.com>
+
+ * registryd/deviceeventcontroller.c:
+ Replaced standard X error handler with a special handler that
+ is non-fatal for failed keygrabs. This works around
+ problems with keygrab clashes sometimes observed on
+ Solaris using CDE.
+ Re-instated SPI_DEVICE_TYPE_MOUSE in enum (didn't reinstate
+ mouse handling code as yet).
+
2002-01-11 Bill Haneman <bill.haneman@sun.com>
* configure.in:
</para>
@obj:
-@childIndex:
@Returns:
+<!-- # Unused Parameters # -->
+@childIndex:
<!-- ##### FUNCTION Accessible_getIndexInParent ##### -->
</para>
@obj:
-@i:
@Returns:
+<!-- # Unused Parameters # -->
+@i:
<!-- ##### FUNCTION AccessibleAction_getKeyBinding ##### -->
</para>
@obj:
-@i:
@Returns:
+<!-- # Unused Parameters # -->
+@i:
<!-- ##### FUNCTION AccessibleAction_getName ##### -->
</para>
@obj:
-@i:
@Returns:
+<!-- # Unused Parameters # -->
+@i:
<!-- ##### FUNCTION AccessibleAction_getDescription ##### -->
</para>
@obj:
-@i:
@Returns:
+<!-- # Unused Parameters # -->
+@i:
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@x:
@y:
@ctype:
-@Returns:
<!-- ##### FUNCTION AccessibleComponent_getAccessibleAtPoint ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@x:
@y:
@ctype:
-@Returns:
<!-- ##### FUNCTION AccessibleComponent_getExtents ##### -->
</para>
@obj:
+<!-- # Unused Parameters # -->
@x:
@y:
@width:
</para>
@obj:
+<!-- # Unused Parameters # -->
@x:
@y:
@ctype:
</para>
@obj:
+<!-- # Unused Parameters # -->
@width:
@height:
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@startPos:
@endPos:
-@Returns:
<!-- ##### FUNCTION AccessibleEditableText_deleteText ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@startPos:
@endPos:
-@Returns:
<!-- ##### FUNCTION AccessibleEditableText_insertText ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@position:
@text:
@length:
-@Returns:
<!-- ##### FUNCTION AccessibleEditableText_cutText ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@startPos:
@endPos:
-@Returns:
<!-- ##### FUNCTION AccessibleEditableText_pasteText ##### -->
</para>
@obj:
-@position:
@Returns:
+<!-- # Unused Parameters # -->
+@position:
<!-- ##### FUNCTION AccessibleEditableText_setTextContents ##### -->
@obj:
@attributes:
+@Returns:
+<!-- # Unused Parameters # -->
@startOffset:
@endOffset:
-@Returns:
</para>
@obj:
+<!-- # Unused Parameters # -->
@startIndex:
@endIndex:
</para>
@obj:
-@i:
@Returns:
+<!-- # Unused Parameters # -->
+@i:
<!-- ##### FUNCTION AccessibleHyperlink_getURI ##### -->
</para>
@obj:
-@i:
@Returns:
+<!-- # Unused Parameters # -->
+@i:
<!-- ##### FUNCTION AccessibleHyperlink_isValid ##### -->
</para>
@obj:
-@linkIndex:
@Returns:
+<!-- # Unused Parameters # -->
+@linkIndex:
<!-- ##### FUNCTION AccessibleHypertext_getLinkIndex ##### -->
</para>
@obj:
-@characterOffset:
@Returns:
+<!-- # Unused Parameters # -->
+@characterOffset:
</para>
@obj:
+<!-- # Unused Parameters # -->
@width:
@height:
</para>
@obj:
+<!-- # Unused Parameters # -->
@x:
@y:
@ctype:
</para>
@obj:
+<!-- # Unused Parameters # -->
@x:
@y:
@width:
</para>
+@Returns:
+<!-- # Unused Parameters # -->
@keyval:
@keystring:
@synth_type:
-@Returns:
<!-- ##### FUNCTION SPI_generateMouseEvent ##### -->
</para>
+@Returns:
+<!-- # Unused Parameters # -->
@x:
@y:
@name:
-@Returns:
</para>
@obj:
-@selectedChildIndex:
@Returns:
+<!-- # Unused Parameters # -->
+@selectedChildIndex:
<!-- ##### FUNCTION AccessibleSelection_selectChild ##### -->
</para>
@obj:
-@childIndex:
@Returns:
+<!-- # Unused Parameters # -->
+@childIndex:
<!-- ##### FUNCTION AccessibleSelection_isChildSelected ##### -->
</para>
@obj:
-@childIndex:
@Returns:
+<!-- # Unused Parameters # -->
+@childIndex:
<!-- ##### FUNCTION AccessibleSelection_deselectSelectedChild ##### -->
</para>
@obj:
-@selectedChildIndex:
@Returns:
+<!-- # Unused Parameters # -->
+@selectedChildIndex:
<!-- ##### FUNCTION AccessibleSelection_clearSelection ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@row:
@column:
-@Returns:
<!-- ##### FUNCTION AccessibleTable_getCaption ##### -->
</para>
@obj:
-@index:
@Returns:
+<!-- # Unused Parameters # -->
+@index:
<!-- ##### FUNCTION AccessibleTable_getColumnDescription ##### -->
</para>
@obj:
-@column:
@Returns:
+<!-- # Unused Parameters # -->
+@column:
<!-- ##### FUNCTION AccessibleTable_getColumnExtentAt ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@row:
@column:
-@Returns:
<!-- ##### FUNCTION AccessibleTable_getColumnHeader ##### -->
</para>
@obj:
-@column:
@Returns:
+<!-- # Unused Parameters # -->
+@column:
<!-- ##### FUNCTION AccessibleTable_getIndexAt ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@row:
@column:
-@Returns:
<!-- ##### FUNCTION AccessibleTable_getNColumns ##### -->
</para>
@obj:
-@index:
@Returns:
+<!-- # Unused Parameters # -->
+@index:
<!-- ##### FUNCTION AccessibleTable_getRowDescription ##### -->
</para>
@obj:
-@row:
@Returns:
+<!-- # Unused Parameters # -->
+@row:
<!-- ##### FUNCTION AccessibleTable_getRowExtentAt ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@row:
@column:
-@Returns:
<!-- ##### FUNCTION AccessibleTable_getRowHeader ##### -->
</para>
@obj:
-@row:
@Returns:
+<!-- # Unused Parameters # -->
+@row:
<!-- ##### FUNCTION AccessibleTable_getSelectedRows ##### -->
</para>
@obj:
-@selectedRows:
@Returns:
+<!-- # Unused Parameters # -->
+@selectedRows:
<!-- ##### FUNCTION AccessibleTable_getSelectedColumns ##### -->
</para>
@obj:
-@selectedColumns:
@Returns:
+<!-- # Unused Parameters # -->
+@selectedColumns:
<!-- ##### FUNCTION AccessibleTable_getSummary ##### -->
</para>
@obj:
-@column:
@Returns:
+<!-- # Unused Parameters # -->
+@column:
<!-- ##### FUNCTION AccessibleTable_isRowSelected ##### -->
</para>
@obj:
-@row:
@Returns:
+<!-- # Unused Parameters # -->
+@row:
<!-- ##### FUNCTION AccessibleTable_isSelected ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@row:
@column:
-@Returns:
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@startOffset:
@endOffset:
-@Returns:
<!-- ##### FUNCTION AccessibleText_getAttributes ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@offset:
@startOffset:
@endOffset:
-@Returns:
<!-- ##### FUNCTION AccessibleText_getCaretOffset ##### -->
</para>
@obj:
+<!-- # Unused Parameters # -->
@offset:
@x:
@y:
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@x:
@y:
@type:
-@Returns:
<!-- ##### FUNCTION AccessibleText_getSelection ##### -->
</para>
@obj:
+<!-- # Unused Parameters # -->
@selectionNum:
@startOffset:
@endOffset:
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@startOffset:
@endOffset:
-@Returns:
<!-- ##### FUNCTION AccessibleText_getTextBeforeOffset ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@offset:
@type:
@startOffset:
@endOffset:
-@Returns:
<!-- ##### FUNCTION AccessibleText_getTextAfterOffset ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@offset:
@type:
@startOffset:
@endOffset:
-@Returns:
<!-- ##### FUNCTION AccessibleText_getTextAtOffset ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@offset:
@type:
@startOffset:
@endOffset:
-@Returns:
<!-- ##### FUNCTION AccessibleText_removeSelection ##### -->
</para>
@obj:
-@selectionNum:
@Returns:
+<!-- # Unused Parameters # -->
+@selectionNum:
<!-- ##### FUNCTION AccessibleText_setCaretOffset ##### -->
</para>
@obj:
-@newOffset:
@Returns:
+<!-- # Unused Parameters # -->
+@newOffset:
<!-- ##### FUNCTION AccessibleText_setSelection ##### -->
</para>
@obj:
+@Returns:
+<!-- # Unused Parameters # -->
@selectionNum:
@startOffset:
@endOffset:
-@Returns:
/* A pointer to our parent object class */
static GObjectClass *spi_device_event_controller_parent_class;
+int (*x_default_error_handler) (Display *display, XErrorEvent *error_event);
+
typedef enum {
SPI_DEVICE_TYPE_KBD,
+ SPI_DEVICE_TYPE_MOUSE,
SPI_DEVICE_TYPE_LAST_DEFINED
} SpiDeviceTypeCategory;
return GDK_FILTER_CONTINUE;
}
+int
+_spi_controller_device_error_handler (Display *display, XErrorEvent *error)
+{
+ if (error->error_code == BadAccess)
+ {
+ g_message ("Could not complete key grab: grab already in use.\n");
+ }
+ else
+ {
+ (*x_default_error_handler) (display, error);
+ }
+}
+
static void
spi_controller_register_with_devices (SpiDEController *controller)
{
gdk_window_set_events (gdk_get_default_root_window (),
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+ x_default_error_handler = XSetErrorHandler (_spi_controller_device_error_handler);
+
XSelectInput (GDK_DISPLAY (),
DefaultRootWindow (GDK_DISPLAY ()),
KeyPressMask | KeyReleaseMask);
}
else if (grab_mask->pending_remove)
{
+#ifdef SPI_DEBUG
+ fprintf (stderr, "ungrabbing, mask=%x\n", grab_mask->mod_mask);
+#endif
XUngrabKey (GDK_DISPLAY (),
grab_mask->key_val,
grab_mask->mod_mask,
}
else if (grab_mask->pending_add || re_issue_grab)
{
+
+#ifdef SPI_DEBUG
+ fprintf (stderr, "grab with mask %x\n", grab_mask->mod_mask);
+#endif
XGrabKey (GDK_DISPLAY (),
grab_mask->key_val,
grab_mask->mod_mask,
fprintf(stderr, "spi_device_event_controller_object_finalize called\n");
#endif
/* disconnect any special listeners, get rid of outstanding keygrabs */
+ XUngrabKey (GDK_DISPLAY (), AnyKey, AnyModifier, DefaultRootWindow (GDK_DISPLAY ()));
spi_device_event_controller_parent_class->finalize (object);
}
/* will listen only to Alt-key combinations */
SPI_registerAccessibleKeystrokeListener (key_listener,
(AccessibleKeySet *) SPI_KEYSET_ALL_KEYS,
- SPI_KEYMASK_ALT,
+ SPI_KEYMASK_ALT | SPI_KEYMASK_CONTROL,
(unsigned long) ( KeyPress | KeyRelease),
SPI_KEYLISTENER_CANCONSUME | SPI_KEYLISTENER_ALL_WINDOWS);
create_vkbd ();