+typedef enum {
+ SPI_DEVICE_TYPE_KBD,
+ SPI_DEVICE_TYPE_MOUSE,
+ SPI_DEVICE_TYPE_LAST_DEFINED
+} SpiDeviceTypeCategory;
+
+typedef struct {
+ char *bus_name;
+ char *path;
+ SpiDeviceTypeCategory type;
+ gulong types;
+} DEControllerListener;
+
+typedef struct {
+ DEControllerListener listener;
+
+ GSList *keys;
+ Accessibility_ControllerEventMask mask;
+ Accessibility_EventListenerMode *mode;
+} DEControllerKeyListener;
+
+typedef struct
+{
+ gint (*get_keycode) (SpiDEController *controller,
+ gint keysym,
+ gchar *key_str,
+ gboolean fix,
+ guint *modmask);
+
+ guint (*mouse_check) (SpiDEController *controller,
+ gint *x,
+ gint *y,
+ gboolean *moved);
+
+ gboolean (*register_global_keygrabs) (SpiDEController *controller,
+ DEControllerKeyListener *key_listener);
+
+ void (*deregister_global_keygrabs) (SpiDEController *controller,
+ DEControllerKeyListener *key_listener);
+
+ gboolean (*synth_keycode_press) (SpiDEController *controller,
+ guint keycode);
+
+ gboolean (*synth_keycode_release) (SpiDEController *controller,
+ guint keycode);
+
+ gboolean (*lock_modifiers) (SpiDEController *controller,
+ unsigned modifiers);
+
+ gboolean (*unlock_modifiers) (SpiDEController *controller,
+ unsigned modifiers);
+
+ gboolean (*synth_keystring) (SpiDEController *controller,
+ guint synth_type,
+ gint keycode,
+ const char *keystring);
+
+ gboolean (*grab_key) (SpiDEController *controller,
+ guint key_val,
+ Accessibility_ControllerEventMask mod_mask);
+
+ void (*ungrab_key) (SpiDEController *controller,
+ guint key_val,
+ Accessibility_ControllerEventMask mod_mask);
+
+ void (*emit_modifier_event) (SpiDEController *controller,
+ guint prev_mask,
+ guint current_mask);
+
+ void (*generate_mouse_event) (SpiDEController *controller,
+ gint x,
+ gint y,
+ const char *eventName);
+
+ void (*init) (SpiDEController *controller);
+ void (*finalize) (SpiDEController *controller);
+} SpiDEControllerPlat;
+