diff options
author | Tor Lillqvist <tml@iki.fi> | 2000-07-25 17:31:05 +0000 |
---|---|---|
committer | Tor Lillqvist <tml@src.gnome.org> | 2000-07-25 17:31:05 +0000 |
commit | 5ac61d3eeebe1947c4a3c5fbab3a89bb4d124a59 (patch) | |
tree | 752f2e7fc56b5ec78bac30d5dd1792cf0b3fd9f5 /gdk/win32/gdkinput.c | |
parent | 37e809867ef943dbfd407875f6c182b9a4ce2d9b (diff) | |
download | gtk+-5ac61d3eeebe1947c4a3c5fbab3a89bb4d124a59.tar.gz |
Include the build directory.
2000-07-25 Tor Lillqvist <tml@iki.fi>
* Makefile.am: Include the build directory.
* configure.in: Generate build/Makefile and build/win32/Makefile.
* config.h.win32: Add USE_GMODULE and USE_MMX for gdk-pixbuf.
* gdk/gdk.def
* gtk/gtk.def: Updates.
* gdk/makefile.mingw.in: Define GDK_COMPILATION. Link with
PANGOWIN32_LIBS and gdk_pixbuf.
* gdk/win32: Compiles, but no doubt doesn't work at all.
* gdk/win32/makefile.mingw.in: Define GDK_COMPILATION.
* gdk/win32/gdkinput.c: New file, temporarily.
* gdk/win32/gdkinput-win32.h: New file
* gdk/win32/gdkinputprivate.h: Remove.
* gtk/gtkrc.[ch] (gtk_win32_get_installation_directory): Renamed and
made externally visible.
Diffstat (limited to 'gdk/win32/gdkinput.c')
-rw-r--r-- | gdk/win32/gdkinput.c | 368 |
1 files changed, 368 insertions, 0 deletions
diff --git a/gdk/win32/gdkinput.c b/gdk/win32/gdkinput.c new file mode 100644 index 0000000000..feb135464b --- /dev/null +++ b/gdk/win32/gdkinput.c @@ -0,0 +1,368 @@ +/* GDK - The GIMP Drawing Kit + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* This file should really be one level up, in the backend-independent + * GDK, and the x11/gdkinput.c could also be removed. + * + * That stuff in x11/gdkinput.c which really *is* X11-dependent should + * be in x11/gdkinput-x11.c. + */ + +#include "config.h" + +#include "gdkinput.h" +#include "gdkprivate.h" + +/* When ther necessary stuff is in + * gdkinput.h, gdkinternals.h and + * gdkprivate.h, these includes shouldn't be here. + */ + +#include <windows.h> +#include <wintab.h> +#include "gdkinput-win32.h" + +static GdkDeviceAxis gdk_input_core_axes[] = { + { GDK_AXIS_X, 0, 0 }, + { GDK_AXIS_Y, 0, 0 } +}; + +GdkDevice gdk_input_core_info = +{ + "Core Pointer", + GDK_SOURCE_MOUSE, + GDK_MODE_SCREEN, + TRUE, + + 2, + gdk_input_core_axes, + + 0, + NULL +}; + +/* Global variables */ + +GDKVAR GdkDevice *gdk_core_pointer = (GdkDevice *)&gdk_input_core_info; + +gint gdk_input_ignore_core; + +GList *gdk_input_devices; +GList *gdk_input_windows; + +GList * +gdk_devices_list (void) +{ + 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; + } +} + +GdkTimeCoord ** +_gdk_device_allocate_history (GdkDevice *device, + gint n_events) +{ + GdkTimeCoord **result = g_new (GdkTimeCoord *, n_events); + gint i; + + for (i=0; i<n_events; i++) + result[i] = g_malloc (sizeof (GdkTimeCoord) - + sizeof (double) * (GDK_MAX_TIMECOORD_AXES - device->num_axes)); + + return result; +} + +void +gdk_device_free_history (GdkTimeCoord **events, + gint n_events) +{ + gint i; + + for (i=0; i<n_events; i++) + g_free (events[i]); + + g_free (events); +} + +GdkInputWindow * +gdk_input_window_find(GdkWindow *window) +{ + GList *tmp_list; + + for (tmp_list=gdk_input_windows; tmp_list; tmp_list=tmp_list->next) + 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 + gtk_window_set_extension_events, but will likely fail in other + cases */ + +void +gdk_input_set_extension_events (GdkWindow *window, gint mask, + GdkExtensionMode mode) +{ + GdkWindowObject *window_private; + GList *tmp_list; + GdkInputWindow *iw; + + 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) + { + iw = g_new(GdkInputWindow,1); + + iw->window = window; + iw->mode = mode; + + iw->obscuring = NULL; + iw->num_obscuring = 0; + iw->grabbed = FALSE; + + 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 + { + iw = gdk_input_window_find (window); + if (iw) + { + gdk_input_windows = g_list_remove(gdk_input_windows,iw); + g_free(iw); + } + + window_private->extension_events = 0; + } + + for (tmp_list = gdk_input_devices; tmp_list; tmp_list = tmp_list->next) + { + GdkDevicePrivate *gdkdev = tmp_list->data; + + 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); + } + } +} + +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); +} + +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); +} + +/** + * 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) +{ + gint i; + + g_return_val_if_fail (device != NULL, FALSE); + + 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; +} + +gboolean +gdk_device_set_mode (GdkDevice *device, + GdkInputMode mode) +{ + GList *tmp_list; + GdkDevicePrivate *gdkdev; + GdkInputMode old_mode; + GdkInputWindow *input_window; + + 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); + } + } + + return TRUE; +} |