diff options
Diffstat (limited to 'gdk/linux-fb/gdkinput.c')
-rw-r--r-- | gdk/linux-fb/gdkinput.c | 214 |
1 files changed, 133 insertions, 81 deletions
diff --git a/gdk/linux-fb/gdkinput.c b/gdk/linux-fb/gdkinput.c index c70de7023e..20e2bdc60d 100644 --- a/gdk/linux-fb/gdkinput.c +++ b/gdk/linux-fb/gdkinput.c @@ -27,108 +27,159 @@ #include <stdlib.h> #include "config.h" -#include "gdkfb.h" +#include "gdkprivate-fb.h" #include "gdkinput.h" #include "gdkprivate.h" #include "gdkinputprivate.h" -static const GdkAxisUse gdk_input_core_axes[] = { GDK_AXIS_X, GDK_AXIS_Y }; +static const GdkDeviceAxis gdk_input_core_axes[] = { + { GDK_AXIS_X, 0, 0 }, + { GDK_AXIS_Y, 0, 0 } +}; -const GdkDeviceInfo gdk_input_core_info = +static GdkDevice gdk_input_core_info = { - GDK_CORE_POINTER, "Core Pointer", GDK_SOURCE_MOUSE, GDK_MODE_SCREEN, TRUE, 2, - gdk_input_core_axes + (GdkDeviceAxis *)gdk_input_core_axes, + 0, + NULL }; +GdkDevice *gdk_core_pointer = (GdkDevice *)&gdk_input_core_info; + /* Global variables */ -GdkInputVTable gdk_input_vtable; -/* information about network port and host for gxid daemon */ gchar *gdk_input_gxid_host; gint gdk_input_gxid_port; gint gdk_input_ignore_core; - -GList *gdk_input_devices; GList *gdk_input_windows; +GList *gdk_input_devices; GList * -gdk_input_list_devices (void) +gdk_devices_list (void) { return gdk_input_devices; } void -gdk_input_set_source (guint32 deviceid, GdkInputSource source) +gdk_device_set_source (GdkDevice *device, GdkInputSource source) { - GdkDevicePrivate *gdkdev = gdk_input_find_device(deviceid); - g_return_if_fail (gdkdev != NULL); - - gdkdev->info.source = source; + device->source = source; } -gint -gdk_input_set_mode (guint32 deviceid, GdkInputMode mode) + +void +gdk_device_set_key (GdkDevice *device, + guint index, + guint keyval, + GdkModifierType modifiers) { - if (deviceid == GDK_CORE_POINTER) - return FALSE; + g_return_if_fail (device != NULL); + g_return_if_fail (index < device->num_keys); - if (gdk_input_vtable.set_mode) - return gdk_input_vtable.set_mode(deviceid,mode); - else - return FALSE; + device->keys[index].keyval = keyval; + device->keys[index].modifiers = modifiers; } void -gdk_input_set_axes (guint32 deviceid, GdkAxisUse *axes) +gdk_device_set_axis_use (GdkDevice *device, + guint index, + GdkAxisUse use) +{ + g_return_if_fail (device != NULL); + g_return_if_fail (index < device->num_axes); + + device->axes[index].use = use; + + switch (use) + { + case GDK_AXIS_X: + case GDK_AXIS_Y: + device->axes[index].min = 0.; + device->axes[index].max = 0.; + break; + case GDK_AXIS_XTILT: + case GDK_AXIS_YTILT: + device->axes[index].min = -1.; + device->axes[index].max = 1; + break; + default: + device->axes[index].min = 0.; + device->axes[index].max = 1; + break; + } +} + +void +gdk_device_get_state (GdkDevice *device, + GdkWindow *window, + gdouble *axes, + GdkModifierType *mask) { - if (deviceid != GDK_CORE_POINTER && gdk_input_vtable.set_axes) - gdk_input_vtable.set_axes (deviceid, axes); + gint x_int, y_int; + + g_assert(device == gdk_core_pointer); + + gdk_window_get_pointer (window, &x_int, &y_int, mask); + + if (axes) + { + axes[0] = x_int; + axes[1] = y_int; + } } -void gdk_input_set_key (guint32 deviceid, - guint index, - guint keyval, - GdkModifierType modifiers) +void +gdk_device_free_history (GdkTimeCoord **events, + gint n_events) { - if (deviceid != GDK_CORE_POINTER && gdk_input_vtable.set_key) - gdk_input_vtable.set_key (deviceid, index, keyval, modifiers); + gint i; + + for (i=0; i<n_events; i++) + g_free (events[i]); + + g_free (events); } -GdkTimeCoord * -gdk_input_motion_events (GdkWindow *window, - guint32 deviceid, - guint32 start, - guint32 stop, - gint *nevents_return) +gboolean +gdk_device_get_history (GdkDevice *device, + GdkWindow *window, + guint32 start, + guint32 stop, + GdkTimeCoord ***events, + gint *n_events) { - g_return_val_if_fail (window != NULL, NULL); - g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); + g_return_val_if_fail (window != NULL, FALSE); + g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE); + g_return_val_if_fail (events != NULL, FALSE); + g_return_val_if_fail (n_events != NULL, FALSE); + + *n_events = 0; + *events = NULL; + return FALSE; +} - *nevents_return = 0; - return NULL; +gboolean +gdk_device_set_mode (GdkDevice *device, + GdkInputMode mode) +{ + return FALSE; } gint gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) { - if (gdk_input_vtable.enable_window) - return gdk_input_vtable.enable_window (window, gdkdev); - else - return TRUE; + return TRUE; } gint gdk_input_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) { - if (gdk_input_vtable.disable_window) - return gdk_input_vtable.disable_window(window,gdkdev); - else - return TRUE; + return TRUE; } @@ -162,8 +213,6 @@ gdk_input_set_extension_events (GdkWindow *window, gint mask, g_return_if_fail (GDK_IS_WINDOW (window)); window_private = (GdkWindowPrivate*) window; - if (GDK_DRAWABLE_DESTROYED (window)) - return; if (mode == GDK_EXTENSION_EVENTS_NONE) mask = 0; @@ -204,7 +253,7 @@ gdk_input_set_extension_events (GdkWindow *window, gint mask, { GdkDevicePrivate *gdkdev = (GdkDevicePrivate *)(tmp_list->data); - if (gdkdev->info.deviceid != GDK_CORE_POINTER) + if (gdkdev != (GdkDevicePrivate *)gdk_core_pointer) { if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED && (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL)) @@ -236,9 +285,9 @@ gdk_input_exit (void) for (tmp_list = gdk_input_devices; tmp_list; tmp_list = tmp_list->next) { gdkdev = (GdkDevicePrivate *)(tmp_list->data); - if (gdkdev->info.deviceid != GDK_CORE_POINTER) + if (gdkdev != (GdkDevicePrivate *)gdk_core_pointer) { - gdk_input_set_mode(gdkdev->info.deviceid,GDK_MODE_DISABLED); + gdk_device_set_mode((GdkDevice *)gdkdev, GDK_MODE_DISABLED); g_free(gdkdev->info.name); g_free(gdkdev->info.axes); @@ -256,32 +305,35 @@ gdk_input_exit (void) g_list_free(gdk_input_windows); } -GdkDevicePrivate * -gdk_input_find_device(guint32 id) +/** + * gdk_device_get_axis: + * @axis: a #GdkDevice + * @axes: pointer to an array of axes + * @use: the use to look for + * @value: location to store the found value. + * + * Interprets an array of double as axis values for a given device, + * and locates the value in the array for a given axis use. + * + * Return value: %TRUE if the given axis use was found, otherwies %FALSE + **/ +gboolean +gdk_device_get_axis (GdkDevice *device, gdouble *axes, GdkAxisUse use, gdouble *value) { - GList *tmp_list = gdk_input_devices; - GdkDevicePrivate *gdkdev; - while (tmp_list) - { - gdkdev = (GdkDevicePrivate *)(tmp_list->data); - if (gdkdev->info.deviceid == id) - return gdkdev; - tmp_list = tmp_list->next; - } - return NULL; -} + gint i; + + g_return_val_if_fail (device != NULL, FALSE); -void -gdk_input_window_get_pointer (GdkWindow *window, - guint32 deviceid, - gdouble *x, - gdouble *y, - gdouble *pressure, - gdouble *xtilt, - gdouble *ytilt, - GdkModifierType *mask) -{ - if (gdk_input_vtable.get_pointer) - gdk_input_vtable.get_pointer (window, deviceid, x, y, pressure, - xtilt, ytilt, mask); + if (axes == NULL) + return FALSE; + + for (i=0; i<device->num_axes; i++) + if (device->axes[i].use == use) + { + if (value) + *value = axes[i]; + return TRUE; + } + + return FALSE; } |