X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gdk%2Fwin32%2Fgdkinput.c;h=64e461dd6d67126cf96f01fa39bf6fdaf311fac7;hb=1d838f586c574af7f05c618a337f8d34a58d9125;hp=4ec504a8d54ed11ceda7b5c1d8f60e070d5fdcef;hpb=fcbf646cceeb3ca5f8628a6453d9c15c28b3f89b;p=~andy%2Fgtk diff --git a/gdk/win32/gdkinput.c b/gdk/win32/gdkinput.c index 4ec504a8d..64e461dd6 100644 --- a/gdk/win32/gdkinput.c +++ b/gdk/win32/gdkinput.c @@ -31,200 +31,34 @@ * be in x11/gdkinput-x11.c. */ -#include +#include "config.h" #include "gdkdisplay.h" -#include "gdkinput.h" +#include "gdkdevice.h" +#include "gdkdisplayprivate.h" #include "gdkprivate-win32.h" -#include "gdkinput-win32.h" - -static GdkDeviceAxis gdk_input_core_axes[] = { - { GDK_AXIS_X, 0, 0 }, - { GDK_AXIS_Y, 0, 0 } -}; - -/* Global variables */ +#include "gdkdevicemanager-win32.h" gint _gdk_input_ignore_core; GList *_gdk_input_devices; GList *_gdk_input_windows; -void -_gdk_init_input_core (GdkDisplay *display) -{ - display->core_pointer = g_object_new (GDK_TYPE_DEVICE, NULL); - - display->core_pointer->name = "Core Pointer"; - display->core_pointer->source = GDK_SOURCE_MOUSE; - display->core_pointer->mode = GDK_MODE_SCREEN; - display->core_pointer->has_cursor = TRUE; - display->core_pointer->num_axes = 2; - display->core_pointer->axes = gdk_input_core_axes; - display->core_pointer->num_keys = 0; - display->core_pointer->keys = NULL; -} - -GType -gdk_device_get_type (void) -{ - static GType object_type = 0; - - if (!object_type) - { - static const GTypeInfo object_info = - { - sizeof (GdkDeviceClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) NULL, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GdkDevicePrivate), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL, - }; - - object_type = g_type_register_static (G_TYPE_OBJECT, - g_intern_static_string ("GdkDevice"), - &object_info, 0); - } - - return object_type; -} - GList * gdk_devices_list (void) { - return gdk_display_list_devices (_gdk_display); + return _gdk_win32_display_list_devices (_gdk_display); } GList * -gdk_display_list_devices (GdkDisplay *dpy) +_gdk_win32_display_list_devices (GdkDisplay *dpy) { g_return_val_if_fail (dpy == _gdk_display, NULL); - _gdk_input_wintab_init_check (); return _gdk_input_devices; } -void -gdk_device_set_source (GdkDevice *device, - GdkInputSource source) -{ - g_return_if_fail (device != NULL); - - device->source = source; -} - -void -gdk_device_set_key (GdkDevice *device, - guint index, - guint keyval, - GdkModifierType modifiers) -{ - g_return_if_fail (device != NULL); - g_return_if_fail (index < device->num_keys); - - device->keys[index].keyval = keyval; - device->keys[index].modifiers = modifiers; -} - -void -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; - } -} - -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, 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); - - if (n_events) - *n_events = 0; - if (events) - *events = NULL; - - if (GDK_WINDOW_DESTROYED (window)) - return FALSE; - - if (GDK_IS_CORE (device)) - return FALSE; - else - return _gdk_device_get_history (device, window, start, stop, events, n_events); -} - -GdkTimeCoord ** -_gdk_device_allocate_history (GdkDevice *device, - gint n_events) -{ - GdkTimeCoord **result = g_new (GdkTimeCoord *, n_events); - gint i; - - for (i=0; inum_axes)); - - return result; -} - -void -gdk_device_free_history (GdkTimeCoord **events, - gint n_events) -{ - gint i; - - for (i=0; inext) - if (((GdkInputWindow *)(tmp_list->data))->window == window) - return (GdkInputWindow *)(tmp_list->data); - - return NULL; /* Not found */ -} - /* FIXME: this routine currently needs to be called between creation and the corresponding configure event (because it doesn't get the root_relative_geometry). This should work with @@ -233,186 +67,58 @@ _gdk_input_window_find(GdkWindow *window) void gdk_input_set_extension_events (GdkWindow *window, gint mask, - GdkExtensionMode mode) + GdkExtensionMode mode) { - GdkWindowObject *window_private; - GList *tmp_list; - GdkInputWindow *iw; + GdkDeviceManager *device_manager; + GList *devices, *d; - g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); - window_private = (GdkWindowObject*) window; if (GDK_WINDOW_DESTROYED (window)) return; if (mode == GDK_EXTENSION_EVENTS_NONE) mask = 0; - if (mask != 0) - { - _gdk_input_wintab_init_check (); - - iw = g_new(GdkInputWindow,1); - - iw->window = window; - iw->mode = mode; + window->extension_events = mask; - iw->obscuring = NULL; - iw->num_obscuring = 0; - iw->grabbed = FALSE; + device_manager = gdk_display_get_device_manager (_gdk_display); + devices = gdk_device_manager_list_devices (device_manager, + GDK_DEVICE_TYPE_FLOATING); - _gdk_input_windows = g_list_append(_gdk_input_windows,iw); - window_private->extension_events = mask; - - /* Add enter window events to the event mask */ - if (g_list_length (_gdk_input_devices) > 1) - gdk_window_set_events (window, - gdk_window_get_events (window) | - GDK_ENTER_NOTIFY_MASK); - } - else + for (d = devices; d; d = d->next) { - iw = _gdk_input_window_find (window); - if (iw) - { - _gdk_input_windows = g_list_remove(_gdk_input_windows,iw); - g_free(iw); - } + GdkDevice *dev; + gint dev_mask; - window_private->extension_events = 0; - } + dev = d->data; + dev_mask = mask; - for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next) - { - GdkDevicePrivate *gdkdev = tmp_list->data; + if (gdk_device_get_mode (dev) == GDK_MODE_DISABLED || + (!gdk_device_get_has_cursor (dev) && mode == GDK_EXTENSION_EVENTS_CURSOR)) + dev_mask = 0; - if (!GDK_IS_CORE (gdkdev)) - { - if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED - && (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL)) - _gdk_input_enable_window (window,gdkdev); - else - _gdk_input_disable_window (window,gdkdev); - } + gdk_window_set_device_events (window, dev, mask); } -} -void -_gdk_input_window_destroy (GdkWindow *window) -{ - GdkInputWindow *input_window; - - input_window = _gdk_input_window_find (window); - g_return_if_fail (input_window != NULL); - - _gdk_input_windows = g_list_remove (_gdk_input_windows,input_window); - g_free(input_window); + g_list_free (devices); } void -_gdk_input_exit (void) -{ - GList *tmp_list; - GdkDevicePrivate *gdkdev; - - for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next) - { - gdkdev = (GdkDevicePrivate *)(tmp_list->data); - if (!GDK_IS_CORE (gdkdev)) - { - gdk_device_set_mode (&gdkdev->info, GDK_MODE_DISABLED); - - g_free(gdkdev->info.name); - g_free(gdkdev->axes); - g_free(gdkdev->info.axes); - g_free(gdkdev->info.keys); - g_free(gdkdev); - } - } - - g_list_free(_gdk_input_devices); - - for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next) - g_free(tmp_list->data); - - g_list_free(_gdk_input_windows); -} - -gboolean -gdk_device_get_axis (GdkDevice *device, - gdouble *axes, - GdkAxisUse use, - gdouble *value) +_gdk_input_init (GdkDisplay *display) { - gint i; - - g_return_val_if_fail (device != NULL, FALSE); + GdkDeviceManagerWin32 *device_manager; - if (axes == NULL) - return FALSE; - - for (i=0; inum_axes; i++) - if (device->axes[i].use == use) - { - if (value) - *value = axes[i]; - return TRUE; - } - - return FALSE; -} + _gdk_input_ignore_core = FALSE; -gboolean -gdk_device_set_mode (GdkDevice *device, - GdkInputMode mode) -{ - GList *tmp_list; - GdkDevicePrivate *gdkdev; - GdkInputMode old_mode; - GdkInputWindow *input_window; + device_manager = g_object_new (GDK_TYPE_DEVICE_MANAGER_WIN32, + "display", display, + NULL); + display->device_manager = GDK_DEVICE_MANAGER (device_manager); - if (GDK_IS_CORE (device)) - return FALSE; - - gdkdev = (GdkDevicePrivate *)device; - - if (device->mode == mode) - return TRUE; - - old_mode = device->mode; - device->mode = mode; - - if (mode == GDK_MODE_WINDOW) - { - device->has_cursor = FALSE; - for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next) - { - input_window = (GdkInputWindow *)tmp_list->data; - if (input_window->mode != GDK_EXTENSION_EVENTS_CURSOR) - _gdk_input_enable_window (input_window->window, gdkdev); - else - if (old_mode != GDK_MODE_DISABLED) - _gdk_input_disable_window (input_window->window, gdkdev); - } - } - else if (mode == GDK_MODE_SCREEN) - { - device->has_cursor = TRUE; - for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next) - _gdk_input_enable_window (((GdkInputWindow *)tmp_list->data)->window, - gdkdev); - } - else /* mode == GDK_MODE_DISABLED */ - { - for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next) - { - input_window = (GdkInputWindow *)tmp_list->data; - if (old_mode != GDK_MODE_WINDOW || - input_window->mode != GDK_EXTENSION_EVENTS_CURSOR) - _gdk_input_disable_window (input_window->window, gdkdev); - } - } + display->core_pointer = device_manager->core_pointer; - return TRUE; + _gdk_input_devices = g_list_append (NULL, display->core_pointer); + _gdk_input_devices = g_list_concat (_gdk_input_devices, + g_list_copy (device_manager->wintab_devices)); }