summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@src.gnome.org>1999-07-25 20:02:21 +0000
committerTor Lillqvist <tml@src.gnome.org>1999-07-25 20:02:21 +0000
commit51046a9fbf4bc1ee4b9b9e830daaf921405e681c (patch)
tree1e657ba1353a17c22136ce6e3ff133cfadac46d4
parentb0a2c890a74c6d4cf96f2f60104631cfa274811c (diff)
downloadgdk-pixbuf-51046a9fbf4bc1ee4b9b9e830daaf921405e681c.tar.gz
README.win32 Add HAVE_WINTAB. Undefine it if bulding without the Wintab
* README.win32 * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without the Wintab SDK. * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work OK, but getting closer. Guard against bogus tilt data from Wacom ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to enable easier building without Wintab. * gdk/win32/gdkinput.h * gdk/win32/gdkevents.c * gdk/win32/gdkwindow.c: Minor changes related related to above. * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 code. As we have just one visual on Win32, no sense to have it in a table, and no need for the hash table.
-rw-r--r--ChangeLog23
-rw-r--r--ChangeLog.pre-2-023
-rw-r--r--ChangeLog.pre-2-1023
-rw-r--r--ChangeLog.pre-2-223
-rw-r--r--ChangeLog.pre-2-423
-rw-r--r--ChangeLog.pre-2-623
-rw-r--r--ChangeLog.pre-2-823
-rw-r--r--README.win323
-rwxr-xr-xconfig.h.win323
-rw-r--r--gdk/win32/gdkevents-win32.c7
-rw-r--r--gdk/win32/gdkevents.c7
-rw-r--r--gdk/win32/gdkinput-win32.c458
-rw-r--r--gdk/win32/gdkinput.c458
-rw-r--r--gdk/win32/gdkinput.h39
-rw-r--r--gdk/win32/gdkvisual-win32.c464
-rw-r--r--gdk/win32/gdkvisual.c464
-rw-r--r--gdk/win32/gdkwindow-win32.c1
-rw-r--r--gdk/win32/gdkwindow.c1
18 files changed, 1076 insertions, 990 deletions
diff --git a/ChangeLog b/ChangeLog
index ccb53c916..ae36e9286 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,30 @@
-1999-07-21 Tor Lillqvist <tml@iki.fi>
+1999-07-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32
+ * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without
+ the Wintab SDK.
+
+ * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work
+ OK, but getting closer. Guard against bogus tilt data from Wacom
+ ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to
+ enable easier building without Wintab.
+
+ * gdk/win32/gdkinput.h
+ * gdk/win32/gdkevents.c
+ * gdk/win32/gdkwindow.c: Minor changes related related to above.
+ * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11
+ code. As we have just one visual on Win32, no sense to have it in a
+ table, and no need for the hash table.
+
+1999-07-21 Tor Lillqvist <tml@iki.fi>
+
* README.win32: Update gcc build instructions. Mention gettext is
GPL.
* gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct
supported cursor size with GetSystemMetrics.
-
+
* gdk/win32/gdkfont.c
* gtk/gtkfontsel.c: Guard against some font weight and charset
symbols being undefined (in mingw32 headers).
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index ccb53c916..ae36e9286 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,11 +1,30 @@
-1999-07-21 Tor Lillqvist <tml@iki.fi>
+1999-07-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32
+ * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without
+ the Wintab SDK.
+
+ * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work
+ OK, but getting closer. Guard against bogus tilt data from Wacom
+ ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to
+ enable easier building without Wintab.
+
+ * gdk/win32/gdkinput.h
+ * gdk/win32/gdkevents.c
+ * gdk/win32/gdkwindow.c: Minor changes related related to above.
+ * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11
+ code. As we have just one visual on Win32, no sense to have it in a
+ table, and no need for the hash table.
+
+1999-07-21 Tor Lillqvist <tml@iki.fi>
+
* README.win32: Update gcc build instructions. Mention gettext is
GPL.
* gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct
supported cursor size with GetSystemMetrics.
-
+
* gdk/win32/gdkfont.c
* gtk/gtkfontsel.c: Guard against some font weight and charset
symbols being undefined (in mingw32 headers).
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index ccb53c916..ae36e9286 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,11 +1,30 @@
-1999-07-21 Tor Lillqvist <tml@iki.fi>
+1999-07-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32
+ * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without
+ the Wintab SDK.
+
+ * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work
+ OK, but getting closer. Guard against bogus tilt data from Wacom
+ ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to
+ enable easier building without Wintab.
+
+ * gdk/win32/gdkinput.h
+ * gdk/win32/gdkevents.c
+ * gdk/win32/gdkwindow.c: Minor changes related related to above.
+ * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11
+ code. As we have just one visual on Win32, no sense to have it in a
+ table, and no need for the hash table.
+
+1999-07-21 Tor Lillqvist <tml@iki.fi>
+
* README.win32: Update gcc build instructions. Mention gettext is
GPL.
* gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct
supported cursor size with GetSystemMetrics.
-
+
* gdk/win32/gdkfont.c
* gtk/gtkfontsel.c: Guard against some font weight and charset
symbols being undefined (in mingw32 headers).
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index ccb53c916..ae36e9286 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,11 +1,30 @@
-1999-07-21 Tor Lillqvist <tml@iki.fi>
+1999-07-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32
+ * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without
+ the Wintab SDK.
+
+ * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work
+ OK, but getting closer. Guard against bogus tilt data from Wacom
+ ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to
+ enable easier building without Wintab.
+
+ * gdk/win32/gdkinput.h
+ * gdk/win32/gdkevents.c
+ * gdk/win32/gdkwindow.c: Minor changes related related to above.
+ * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11
+ code. As we have just one visual on Win32, no sense to have it in a
+ table, and no need for the hash table.
+
+1999-07-21 Tor Lillqvist <tml@iki.fi>
+
* README.win32: Update gcc build instructions. Mention gettext is
GPL.
* gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct
supported cursor size with GetSystemMetrics.
-
+
* gdk/win32/gdkfont.c
* gtk/gtkfontsel.c: Guard against some font weight and charset
symbols being undefined (in mingw32 headers).
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index ccb53c916..ae36e9286 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,11 +1,30 @@
-1999-07-21 Tor Lillqvist <tml@iki.fi>
+1999-07-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32
+ * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without
+ the Wintab SDK.
+
+ * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work
+ OK, but getting closer. Guard against bogus tilt data from Wacom
+ ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to
+ enable easier building without Wintab.
+
+ * gdk/win32/gdkinput.h
+ * gdk/win32/gdkevents.c
+ * gdk/win32/gdkwindow.c: Minor changes related related to above.
+ * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11
+ code. As we have just one visual on Win32, no sense to have it in a
+ table, and no need for the hash table.
+
+1999-07-21 Tor Lillqvist <tml@iki.fi>
+
* README.win32: Update gcc build instructions. Mention gettext is
GPL.
* gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct
supported cursor size with GetSystemMetrics.
-
+
* gdk/win32/gdkfont.c
* gtk/gtkfontsel.c: Guard against some font weight and charset
symbols being undefined (in mingw32 headers).
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index ccb53c916..ae36e9286 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,11 +1,30 @@
-1999-07-21 Tor Lillqvist <tml@iki.fi>
+1999-07-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32
+ * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without
+ the Wintab SDK.
+
+ * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work
+ OK, but getting closer. Guard against bogus tilt data from Wacom
+ ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to
+ enable easier building without Wintab.
+
+ * gdk/win32/gdkinput.h
+ * gdk/win32/gdkevents.c
+ * gdk/win32/gdkwindow.c: Minor changes related related to above.
+ * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11
+ code. As we have just one visual on Win32, no sense to have it in a
+ table, and no need for the hash table.
+
+1999-07-21 Tor Lillqvist <tml@iki.fi>
+
* README.win32: Update gcc build instructions. Mention gettext is
GPL.
* gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct
supported cursor size with GetSystemMetrics.
-
+
* gdk/win32/gdkfont.c
* gtk/gtkfontsel.c: Guard against some font weight and charset
symbols being undefined (in mingw32 headers).
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index ccb53c916..ae36e9286 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,11 +1,30 @@
-1999-07-21 Tor Lillqvist <tml@iki.fi>
+1999-07-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32
+ * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without
+ the Wintab SDK.
+
+ * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work
+ OK, but getting closer. Guard against bogus tilt data from Wacom
+ ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to
+ enable easier building without Wintab.
+
+ * gdk/win32/gdkinput.h
+ * gdk/win32/gdkevents.c
+ * gdk/win32/gdkwindow.c: Minor changes related related to above.
+ * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11
+ code. As we have just one visual on Win32, no sense to have it in a
+ table, and no need for the hash table.
+
+1999-07-21 Tor Lillqvist <tml@iki.fi>
+
* README.win32: Update gcc build instructions. Mention gettext is
GPL.
* gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct
supported cursor size with GetSystemMetrics.
-
+
* gdk/win32/gdkfont.c
* gtk/gtkfontsel.c: Guard against some font weight and charset
symbols being undefined (in mingw32 headers).
diff --git a/README.win32 b/README.win32
index 3c5b5b40f..fe7ac8a72 100644
--- a/README.win32
+++ b/README.win32
@@ -14,7 +14,8 @@ See the README.win32 file in the GLib distribution for instructions
how to build with gcc.
The tablet support uses the Wintab API. The Wintab development kit can
-be downloaded from http://www.pointing.com.
+be downloaded from http://www.pointing.com. If you don't care for
+that, undefine HAVE_WINTAB in config.h.win32 before building.
GTk+ wants to be built with the GNU gettext library for
internationalisation (i18n). Get the version ported to Win32 (not a
diff --git a/config.h.win32 b/config.h.win32
index cfb2380bf..eb6e053c4 100755
--- a/config.h.win32
+++ b/config.h.win32
@@ -182,3 +182,6 @@
/* define if compiled symbols have a leading underscore */
/* #undef WITH_SYMBOL_UNDERSCORE */
+
+/* Define if you have the Wintab programmer's kit */
+#define HAVE_WINTAB 1
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index d5b1dbfca..d4b5a4846 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -28,9 +28,13 @@
#include "config.h"
#include <stdio.h>
+
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include "gdkx.h"
+#ifdef HAVE_WINTAB
+#include <wintab.h>
+#endif
#include "gdkinput.h"
#define PING() printf("%s: %d\n",__FILE__,__LINE__),fflush(stdout)
@@ -2782,6 +2786,7 @@ gdk_event_translate (GdkEvent *event,
return_val = window_private && !window_private->destroyed;
break;
+#ifdef HAVE_WINTAB
/* Handle WINTAB events here, as we know that gdkinput.c will
* use the fixed WT_DEFBASE as lcMsgBase, and we thus can use the
* constants as case labels.
@@ -2801,9 +2806,11 @@ gdk_event_translate (GdkEvent *event,
g_print ("WT_PROXIMITY: %#x %d %d\n",
xevent->wParam,
LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
+ /* Fall through */
wintab:
return_val = gdk_input_vtable.other_event(event, xevent);
break;
+#endif
}
bypass_switch:
diff --git a/gdk/win32/gdkevents.c b/gdk/win32/gdkevents.c
index d5b1dbfca..d4b5a4846 100644
--- a/gdk/win32/gdkevents.c
+++ b/gdk/win32/gdkevents.c
@@ -28,9 +28,13 @@
#include "config.h"
#include <stdio.h>
+
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include "gdkx.h"
+#ifdef HAVE_WINTAB
+#include <wintab.h>
+#endif
#include "gdkinput.h"
#define PING() printf("%s: %d\n",__FILE__,__LINE__),fflush(stdout)
@@ -2782,6 +2786,7 @@ gdk_event_translate (GdkEvent *event,
return_val = window_private && !window_private->destroyed;
break;
+#ifdef HAVE_WINTAB
/* Handle WINTAB events here, as we know that gdkinput.c will
* use the fixed WT_DEFBASE as lcMsgBase, and we thus can use the
* constants as case labels.
@@ -2801,9 +2806,11 @@ gdk_event_translate (GdkEvent *event,
g_print ("WT_PROXIMITY: %#x %d %d\n",
xevent->wParam,
LOWORD (xevent->lParam), HIWORD (xevent->lParam)));
+ /* Fall through */
wintab:
return_val = gdk_input_vtable.other_event(event, xevent);
break;
+#endif
}
bypass_switch:
diff --git a/gdk/win32/gdkinput-win32.c b/gdk/win32/gdkinput-win32.c
index 70063a7a7..03ff326ea 100644
--- a/gdk/win32/gdkinput-win32.c
+++ b/gdk/win32/gdkinput-win32.c
@@ -33,8 +33,49 @@
#include <gdk/gdk.h>
#include "gdkx.h"
+
+#ifdef HAVE_WINTAB
+#include <wintab.h>
+#define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y | PK_NORMAL_PRESSURE | PK_ORIENTATION)
+#define PACKETMODE (PK_BUTTONS)
+#include <pktdef.h>
+#endif
+
#include "gdkinput.h"
+struct _GdkDevicePrivate {
+ GdkDeviceInfo info;
+
+ /* information about the axes */
+ GdkAxisInfo *axes;
+
+ /* reverse lookup on axis use type */
+ gint axis_for_use[GDK_AXIS_LAST];
+
+ /* true if we need to select a different set of events, but
+ * can't because this is the core pointer
+ */
+ gint needs_update;
+
+ /* State of buttons */
+ gint button_state;
+
+ gint *last_axis_data;
+ gint last_buttons;
+#ifdef HAVE_WINTAB
+ /* WINTAB stuff: */
+ HCTX hctx;
+ /* Cursor number */
+ UINT cursor;
+ /* The cursor's CSR_PKTDATA */
+ WTPKT pktdata;
+ /* CSR_NPBTNMARKS */
+ UINT npbtnmarks[2];
+ /* Azimuth and altitude axis */
+ AXIS orientation_axes[2];
+#endif
+};
+
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
@@ -47,12 +88,33 @@
* good at all.
*/
+#ifdef HAVE_WINTAB
+#define DEBUG_WINTAB 1
+#endif
+
#define TWOPI (2.*M_PI)
#define PING() g_print("%s: %d\n",__FILE__,__LINE__)
/* Forward declarations */
+static gint gdk_input_enable_window (GdkWindow *window,
+ GdkDevicePrivate *gdkdev);
+static gint gdk_input_disable_window (GdkWindow *window,
+ GdkDevicePrivate *gdkdev);
+static void gdk_input_none_get_pointer (GdkWindow *window,
+ guint32 deviceid,
+ gdouble *x,
+ gdouble *y,
+ gdouble *pressure,
+ gdouble *xtilt,
+ gdouble *ytilt,
+ GdkModifierType *mask);
+
+static GdkDevicePrivate *gdk_input_find_device (guint32 deviceid);
+
+#ifdef HAVE_WINTAB
+
static gint gdk_input_win32_set_mode (guint32 deviceid,
GdkInputMode mode);
static void gdk_input_win32_get_pointer (GdkWindow *window,
@@ -63,14 +125,6 @@ static void gdk_input_win32_get_pointer (GdkWindow *window,
gdouble *xtilt,
gdouble *ytilt,
GdkModifierType *mask);
-static void gdk_input_none_get_pointer (GdkWindow *window,
- guint32 deviceid,
- gdouble *x,
- gdouble *y,
- gdouble *pressure,
- gdouble *xtilt,
- gdouble *ytilt,
- GdkModifierType *mask);
static gint gdk_input_win32_grab_pointer (GdkWindow * window,
gint owner_events,
GdkEventMask event_mask,
@@ -89,10 +143,12 @@ static gint gdk_input_win32_disable_window (GdkWindow *window,
GdkDevicePrivate *gdkdev);
static GdkInputWindow *gdk_input_window_find (GdkWindow *window);
+#if !USE_SYSCONTEXT
static GdkInputWindow *gdk_input_window_find_within (GdkWindow *window);
-static GdkDevicePrivate *gdk_input_find_device (guint32 deviceid);
+#endif
static GdkDevicePrivate *gdk_input_find_dev_from_ctx (HCTX hctx,
UINT id);
+#endif /* HAVE_WINTAB */
/* Local variables */
@@ -126,7 +182,7 @@ GdkInputVTable gdk_input_vtable;
gint gdk_input_ignore_core;
gint gdk_input_ignore_wintab = FALSE;
-#if 0
+#if DEBUG_WINTAB
static void
print_lc(LOGCONTEXT *lc)
@@ -228,6 +284,8 @@ print_lc(LOGCONTEXT *lc)
void
gdk_input_init (void)
{
+ guint32 deviceid_counter = 0;
+#ifdef HAVE_WINTAB
GdkDevicePrivate *gdkdev;
GdkWindowPrivate *window_private;
GdkWindowAttr wa;
@@ -235,10 +293,11 @@ gdk_input_init (void)
LOGCONTEXT defcontext;
HCTX *hctx;
UINT ndevices, ncursors, ncsrtypes, firstcsr, hardware;
- AXIS axis_x, axis_y, axis_npressure, axis_orientation[3];
+ BOOL active;
+ AXIS axis_x, axis_y, axis_npressure, axis_or[3];
int i, j, k;
+ int devix, cursorix;
char devname[100], csrname[100];
- guint32 deviceid_counter = 0;
gdk_input_devices = NULL;
wintab_contexts = NULL;
@@ -247,18 +306,25 @@ gdk_input_init (void)
WTInfo (0, 0, NULL))
{
WTInfo (WTI_INTERFACE, IFC_SPECVERSION, &specversion);
-
+ GDK_NOTE (MISC, g_print ("Wintab interface version %d.%d\n",
+ HIBYTE (specversion), LOBYTE (specversion)));
#if USE_SYSCONTEXT
WTInfo (WTI_DEFSYSCTX, 0, &defcontext);
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, (g_print("DEFSYSCTX:\n"), print_lc(&defcontext)));
+#endif
#else
WTInfo (WTI_DEFCONTEXT, 0, &defcontext);
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, (g_print("DEFCONTEXT:\n"), print_lc(&defcontext)));
#endif
-#if 0
- g_print("DEFCONTEXT:\n"); print_lc(&defcontext);
#endif
WTInfo (WTI_INTERFACE, IFC_NDEVICES, &ndevices);
WTInfo (WTI_INTERFACE, IFC_NCURSORS, &ncursors);
-
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, g_print ("NDEVICES: %d, NCURSORS: %d\n",
+ ndevices, ncursors));
+#endif
/* Create a dummy window to receive wintab events */
wa.wclass = GDK_INPUT_OUTPUT;
wa.event_mask = GDK_ALL_EVENTS_MASK;
@@ -275,61 +341,64 @@ gdk_input_init (void)
gdk_window_ref (wintab_window);
window_private = (GdkWindowPrivate *) wintab_window;
- for (i = 0; i < ndevices; i++)
+ for (devix = 0; devix < ndevices; devix++)
{
LOGCONTEXT lc;
- WTInfo (WTI_DEVICES + i, DVC_NAME, devname);
+ WTInfo (WTI_DEVICES + devix, DVC_NAME, devname);
- WTInfo (WTI_DEVICES + i, DVC_NCSRTYPES, &ncsrtypes);
- WTInfo (WTI_DEVICES + i, DVC_FIRSTCSR, &firstcsr);
- WTInfo (WTI_DEVICES + i, DVC_HARDWARE, &hardware);
- WTInfo (WTI_DEVICES + i, DVC_X, &axis_x);
- WTInfo (WTI_DEVICES + i, DVC_Y, &axis_y);
- WTInfo (WTI_DEVICES + i, DVC_NPRESSURE, &axis_npressure);
- WTInfo (WTI_DEVICES + i, DVC_ORIENTATION, axis_orientation);
+ WTInfo (WTI_DEVICES + devix, DVC_NCSRTYPES, &ncsrtypes);
+ WTInfo (WTI_DEVICES + devix, DVC_FIRSTCSR, &firstcsr);
+ WTInfo (WTI_DEVICES + devix, DVC_HARDWARE, &hardware);
+ WTInfo (WTI_DEVICES + devix, DVC_X, &axis_x);
+ WTInfo (WTI_DEVICES + devix, DVC_Y, &axis_y);
+ WTInfo (WTI_DEVICES + devix, DVC_NPRESSURE, &axis_npressure);
+ WTInfo (WTI_DEVICES + devix, DVC_ORIENTATION, axis_or);
if (HIBYTE (specversion) > 1 || LOBYTE (specversion) >= 1)
{
- WTInfo (WTI_DDCTXS + i, CTX_NAME, lc.lcName);
- WTInfo (WTI_DDCTXS + i, CTX_OPTIONS, &lc.lcOptions);
+ WTInfo (WTI_DDCTXS + devix, CTX_NAME, lc.lcName);
+ WTInfo (WTI_DDCTXS + devix, CTX_OPTIONS, &lc.lcOptions);
lc.lcOptions |= CXO_MESSAGES;
+#if USE_SYSCONTEXT
+ lc.lcOptions |= CXO_SYSTEM;
+#endif
lc.lcStatus = 0;
- WTInfo (WTI_DDCTXS + i, CTX_LOCKS, &lc.lcLocks);
+ WTInfo (WTI_DDCTXS + devix, CTX_LOCKS, &lc.lcLocks);
lc.lcMsgBase = WT_DEFBASE;
- lc.lcDevice = i;
- lc.lcPktRate = 20;
+ lc.lcDevice = devix;
+ lc.lcPktRate = 50;
lc.lcPktData = PACKETDATA;
lc.lcPktMode = PK_BUTTONS; /* We want buttons in relative mode */
lc.lcMoveMask = PACKETDATA;
lc.lcBtnDnMask = lc.lcBtnUpMask = ~0;
- WTInfo (WTI_DDCTXS + i, CTX_INORGX, &lc.lcInOrgX);
- WTInfo (WTI_DDCTXS + i, CTX_INORGY, &lc.lcInOrgY);
- WTInfo (WTI_DDCTXS + i, CTX_INORGZ, &lc.lcInOrgZ);
- WTInfo (WTI_DDCTXS + i, CTX_INEXTX, &lc.lcInExtX);
- WTInfo (WTI_DDCTXS + i, CTX_INEXTY, &lc.lcInExtY);
- WTInfo (WTI_DDCTXS + i, CTX_INEXTZ, &lc.lcInExtZ);
+ WTInfo (WTI_DDCTXS + devix, CTX_INORGX, &lc.lcInOrgX);
+ WTInfo (WTI_DDCTXS + devix, CTX_INORGY, &lc.lcInOrgY);
+ WTInfo (WTI_DDCTXS + devix, CTX_INORGZ, &lc.lcInOrgZ);
+ WTInfo (WTI_DDCTXS + devix, CTX_INEXTX, &lc.lcInExtX);
+ WTInfo (WTI_DDCTXS + devix, CTX_INEXTY, &lc.lcInExtY);
+ WTInfo (WTI_DDCTXS + devix, CTX_INEXTZ, &lc.lcInExtZ);
lc.lcOutOrgX = axis_x.axMin;
lc.lcOutOrgY = axis_y.axMin;
lc.lcOutExtX = axis_x.axMax - axis_x.axMin;
lc.lcOutExtY = axis_y.axMax - axis_y.axMin;
lc.lcOutExtY = -lc.lcOutExtY; /* We want Y growing downward */
- WTInfo (WTI_DDCTXS + i, CTX_SENSX, &lc.lcSensX);
- WTInfo (WTI_DDCTXS + i, CTX_SENSY, &lc.lcSensY);
- WTInfo (WTI_DDCTXS + i, CTX_SENSZ, &lc.lcSensZ);
- WTInfo (WTI_DDCTXS + i, CTX_SYSMODE, &lc.lcSysMode);
+ WTInfo (WTI_DDCTXS + devix, CTX_SENSX, &lc.lcSensX);
+ WTInfo (WTI_DDCTXS + devix, CTX_SENSY, &lc.lcSensY);
+ WTInfo (WTI_DDCTXS + devix, CTX_SENSZ, &lc.lcSensZ);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSMODE, &lc.lcSysMode);
lc.lcSysOrgX = lc.lcSysOrgY = 0;
- WTInfo (WTI_DDCTXS + i, CTX_SYSEXTX, &lc.lcSysExtX);
- WTInfo (WTI_DDCTXS + i, CTX_SYSEXTY, &lc.lcSysExtY);
- WTInfo (WTI_DDCTXS + i, CTX_SYSSENSX, &lc.lcSysSensX);
- WTInfo (WTI_DDCTXS + i, CTX_SYSSENSY, &lc.lcSysSensY);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSEXTX, &lc.lcSysExtX);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSEXTY, &lc.lcSysExtY);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSSENSX, &lc.lcSysSensX);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSSENSY, &lc.lcSysSensY);
}
else
{
lc = defcontext;
lc.lcOptions |= CXO_MESSAGES;
lc.lcMsgBase = WT_DEFBASE;
- lc.lcPktRate = 20; /* Slow down the packets a bit */
+ lc.lcPktRate = 50;
lc.lcPktData = PACKETDATA;
lc.lcPktMode = PACKETMODE;
lc.lcMoveMask = PACKETDATA;
@@ -344,8 +413,9 @@ gdk_input_init (void)
lc.lcOutExtY = -lc.lcOutExtY; /* We want Y growing downward */
#endif
}
-#if 0
- g_print("context for device %d:\n", i); print_lc(&lc);
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, (g_print("context for device %d:\n", devix),
+ print_lc(&lc)));
#endif
hctx = g_new (HCTX, 1);
if ((*hctx = WTOpen (window_private->xwindow, &lc, TRUE)) == NULL)
@@ -353,8 +423,8 @@ gdk_input_init (void)
g_warning ("gdk_input_init: WTOpen failed");
return;
}
- GDK_NOTE (MISC, g_print ("gdk_input_init: opened Wintab device %d %#x\n",
- i, *hctx));
+ GDK_NOTE (MISC, g_print ("opened Wintab device %d %#x\n",
+ devix, *hctx));
wintab_contexts = g_list_append (wintab_contexts, hctx);
#if 0
@@ -362,13 +432,18 @@ gdk_input_init (void)
#endif
WTOverlap (*hctx, TRUE);
-#if 0
- g_print("context for device %d after WTOpen:\n", i); print_lc(&lc);
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, (g_print("context for device %d after WTOpen:\n", devix),
+ print_lc(&lc)));
#endif
- for (j = firstcsr; j < firstcsr + ncsrtypes; j++)
+ for (cursorix = firstcsr; cursorix < firstcsr + ncsrtypes; cursorix++)
{
+ active = FALSE;
+ WTInfo (WTI_CURSORS + cursorix, CSR_ACTIVE, &active);
+ if (!active)
+ continue;
gdkdev = g_new (GdkDevicePrivate, 1);
- WTInfo (WTI_CURSORS + j, CSR_NAME, csrname);
+ WTInfo (WTI_CURSORS + cursorix, CSR_NAME, csrname);
gdkdev->info.name = g_strconcat (devname, " ", csrname, NULL);
gdkdev->info.deviceid = deviceid_counter++;
gdkdev->info.source = GDK_SOURCE_PEN;
@@ -379,8 +454,8 @@ gdk_input_init (void)
gdkdev->info.has_cursor = FALSE;
#endif
gdkdev->hctx = *hctx;
- gdkdev->cursor = j;
- WTInfo (WTI_CURSORS + j, CSR_PKTDATA, &gdkdev->pktdata);
+ gdkdev->cursor = cursorix;
+ WTInfo (WTI_CURSORS + cursorix, CSR_PKTDATA, &gdkdev->pktdata);
gdkdev->info.num_axes = 0;
if (gdkdev->pktdata & PK_X)
gdkdev->info.num_axes++;
@@ -388,9 +463,18 @@ gdk_input_init (void)
gdkdev->info.num_axes++;
if (gdkdev->pktdata & PK_NORMAL_PRESSURE)
gdkdev->info.num_axes++;
+ /* The wintab driver for the Wacom ArtPad II reports
+ * PK_ORIENTATION in CSR_PKTDATA, but the tablet doesn't
+ * actually sense tilt. Catch this by noticing that the
+ * orientation axis's azimuth resolution is zero.
+ */
+ if ((gdkdev->pktdata & PK_ORIENTATION)
+ && axis_or[0].axResolution == 0)
+ gdkdev->pktdata &= ~PK_ORIENTATION;
+
if (gdkdev->pktdata & PK_ORIENTATION)
gdkdev->info.num_axes += 2; /* x and y tilt */
- WTInfo (WTI_CURSORS + j, CSR_NPBTNMARKS, &gdkdev->npbtnmarks);
+ WTInfo (WTI_CURSORS + cursorix, CSR_NPBTNMARKS, &gdkdev->npbtnmarks);
gdkdev->axes = g_new (GdkAxisInfo, gdkdev->info.num_axes);
gdkdev->info.axes = g_new (GdkAxisUse, gdkdev->info.num_axes);
gdkdev->last_axis_data = g_new (gint, gdkdev->info.num_axes);
@@ -439,10 +523,13 @@ gdk_input_init (void)
{
GdkAxisUse axis;
- gdkdev->orientation_axes[0] = axis_orientation[0];
- gdkdev->orientation_axes[1] = axis_orientation[1];
+ gdkdev->orientation_axes[0] = axis_or[0];
+ gdkdev->orientation_axes[1] = axis_or[1];
for (axis = GDK_AXIS_XTILT; axis <= GDK_AXIS_YTILT; axis++)
{
+ /* Wintab gives us aximuth and altitude, which
+ * we convert to x and y tilt in the -1000..1000 range
+ */
gdkdev->axes[k].xresolution =
gdkdev->axes[k].resolution = 1000;
gdkdev->axes[k].xmin_value =
@@ -457,13 +544,37 @@ gdk_input_init (void)
gdkdev->info.num_keys = 0;
gdkdev->info.keys = NULL;
GDK_NOTE (EVENTS,
- g_print ("gdk_input_init: device: %d axes: %d\n",
- gdkdev->info.deviceid,
- gdkdev->info.num_axes));
+ (g_print ("device: %d (%d) %s axes: %d\n",
+ gdkdev->info.deviceid, cursorix,
+ gdkdev->info.name,
+ gdkdev->info.num_axes),
+ g_print ("axes: X:%d, Y:%d, PRESSURE:%d, "
+ "XTILT:%d, YTILT:%d\n",
+ gdkdev->axis_for_use[GDK_AXIS_X],
+ gdkdev->axis_for_use[GDK_AXIS_Y],
+ gdkdev->axis_for_use[GDK_AXIS_PRESSURE],
+ gdkdev->axis_for_use[GDK_AXIS_XTILT],
+ gdkdev->axis_for_use[GDK_AXIS_YTILT])));
+ for (i = 0; i < gdkdev->info.num_axes; i++)
+ GDK_NOTE (EVENTS,
+ g_print ("...axis %d: %d--%d@%d (%d--%d@%d)\n",
+ i,
+ gdkdev->axes[i].xmin_value,
+ gdkdev->axes[i].xmax_value,
+ gdkdev->axes[i].xresolution,
+ gdkdev->axes[i].min_value,
+ gdkdev->axes[i].max_value,
+ gdkdev->axes[i].resolution));
gdk_input_devices = g_list_append (gdk_input_devices,
gdkdev);
}
}
+ }
+#endif /* HAVE_WINTAB */
+
+ if (deviceid_counter > 0)
+ {
+#ifdef HAVE_WINTAB
gdk_input_vtable.set_mode = gdk_input_win32_set_mode;
gdk_input_vtable.set_axes = NULL;
gdk_input_vtable.set_key = NULL;
@@ -480,6 +591,9 @@ gdk_input_init (void)
gdk_input_root_width = gdk_screen_width ();
gdk_input_root_height = gdk_screen_height ();
gdk_input_ignore_core = FALSE;
+#else
+ g_assert_not_reached ();
+#endif
}
else
{
@@ -501,21 +615,70 @@ gdk_input_init (void)
gdk_input_devices = g_list_append (gdk_input_devices, &gdk_input_core_info);
}
+gint
+gdk_input_set_mode (guint32 deviceid,
+ GdkInputMode mode)
+{
+ if (deviceid == GDK_CORE_POINTER)
+ return FALSE;
+
+ if (gdk_input_vtable.set_mode)
+ return gdk_input_vtable.set_mode (deviceid, mode);
+ else
+ return FALSE;
+}
+
+void
+gdk_input_set_axes (guint32 deviceid,
+ GdkAxisUse *axes)
+{
+ int i;
+ GdkDevicePrivate *gdkdev = gdk_input_find_device (deviceid);
+ g_return_if_fail (gdkdev != NULL);
+
+ if (deviceid == GDK_CORE_POINTER)
+ return;
+
+ for (i = GDK_AXIS_IGNORE; i < GDK_AXIS_LAST; i++)
+ {
+ gdkdev->axis_for_use[i] = -1;
+ }
+
+ for (i = 0; i < gdkdev->info.num_axes; i++)
+ {
+ gdkdev->info.axes[i] = axes[i];
+ gdkdev->axis_for_use[axes[i]] = i;
+ }
+}
+
static void
-gdk_input_get_root_relative_geometry (HWND w,
- int *x_ret,
- int *y_ret)
+gdk_input_none_get_pointer (GdkWindow *window,
+ guint32 deviceid,
+ gdouble *x,
+ gdouble *y,
+ gdouble *pressure,
+ gdouble *xtilt,
+ gdouble *ytilt,
+ GdkModifierType *mask)
{
- RECT rect;
+ gint x_int, y_int;
- GetWindowRect (w, &rect);
+ gdk_window_get_pointer (window, &x_int, &y_int, mask);
- if (x_ret)
- *x_ret = rect.left;
- if (y_ret)
- *y_ret = rect.top;
+ if (x)
+ *x = x_int;
+ if (y)
+ *y = y_int;
+ if (pressure)
+ *pressure = 0.5;
+ if (xtilt)
+ *xtilt = 0;
+ if (ytilt)
+ *ytilt = 0;
}
+#ifdef HAVE_WINTAB
+
static void
gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
GdkInputWindow *input_window,
@@ -625,42 +788,6 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
}
}
-gint
-gdk_input_set_mode (guint32 deviceid,
- GdkInputMode mode)
-{
- if (deviceid == GDK_CORE_POINTER)
- return FALSE;
-
- if (gdk_input_vtable.set_mode)
- return gdk_input_vtable.set_mode (deviceid, mode);
- else
- return FALSE;
-}
-
-void
-gdk_input_set_axes (guint32 deviceid,
- GdkAxisUse *axes)
-{
- int i;
- GdkDevicePrivate *gdkdev = gdk_input_find_device (deviceid);
- g_return_if_fail (gdkdev != NULL);
-
- if (deviceid == GDK_CORE_POINTER)
- return;
-
- for (i = GDK_AXIS_IGNORE; i < GDK_AXIS_LAST; i++)
- {
- gdkdev->axis_for_use[i] = -1;
- }
-
- for (i = 0; i < gdkdev->info.num_axes; i++)
- {
- gdkdev->info.axes[i] = axes[i];
- gdkdev->axis_for_use[axes[i]] = i;
- }
-}
-
static void
gdk_input_win32_get_pointer (GdkWindow *window,
guint32 deviceid,
@@ -714,29 +841,18 @@ gdk_input_win32_get_pointer (GdkWindow *window,
}
static void
-gdk_input_none_get_pointer (GdkWindow *window,
- guint32 deviceid,
- gdouble *x,
- gdouble *y,
- gdouble *pressure,
- gdouble *xtilt,
- gdouble *ytilt,
- GdkModifierType *mask)
+gdk_input_get_root_relative_geometry (HWND w,
+ int *x_ret,
+ int *y_ret)
{
- gint x_int, y_int;
+ RECT rect;
- gdk_window_get_pointer (window, &x_int, &y_int, mask);
+ GetWindowRect (w, &rect);
- if (x)
- *x = x_int;
- if (y)
- *y = y_int;
- if (pressure)
- *pressure = 0.5;
- if (xtilt)
- *xtilt = 0;
- if (ytilt)
- *ytilt = 0;
+ if (x_ret)
+ *x_ret = rect.left;
+ if (y_ret)
+ *y_ret = rect.top;
}
static gint
@@ -850,6 +966,22 @@ decode_tilt (gint *axis_data,
axis_data[1] = sin (az) * cos (el) * 1000;
}
+static GdkDevicePrivate *
+gdk_input_find_dev_from_ctx (HCTX hctx,
+ UINT cursor)
+{
+ GList *tmp_list = gdk_input_devices;
+ GdkDevicePrivate *gdkdev;
+
+ while (tmp_list)
+ {
+ gdkdev = (GdkDevicePrivate *) (tmp_list->data);
+ if (gdkdev->hctx == hctx && gdkdev->cursor == cursor)
+ return gdkdev;
+ tmp_list = tmp_list->next;
+ }
+ return NULL;
+}
static gint
gdk_input_win32_other_event (GdkEvent *event,
MSG *xevent)
@@ -1021,13 +1153,14 @@ gdk_input_win32_other_event (GdkEvent *event,
& (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
| GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
| GDK_BUTTON5_MASK));
- GDK_NOTE (EVENTS, g_print ("WINTAB button %s: %d %d %g,%g %g\n",
+ GDK_NOTE (EVENTS, g_print ("WINTAB button %s: %d %d %g,%g %g %g,%g\n",
(event->button.type == GDK_BUTTON_PRESS ?
"press" : "release"),
event->button.deviceid,
event->button.button,
event->button.x, event->button.y,
- event->button.pressure));
+ event->button.pressure,
+ event->button.xtilt, event->button.ytilt));
}
else
{
@@ -1049,10 +1182,11 @@ gdk_input_win32_other_event (GdkEvent *event,
| GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
| GDK_BUTTON5_MASK));
- GDK_NOTE (EVENTS, g_print ("WINTAB motion: %d %g,%g %g\n",
+ GDK_NOTE (EVENTS, g_print ("WINTAB motion: %d %g,%g %g %g,%g\n",
event->motion.deviceid,
event->motion.x, event->motion.y,
- event->motion.pressure));
+ event->motion.pressure,
+ event->motion.xtilt, event->motion.ytilt));
/* Check for missing release or press events for the normal
* pressure button. At least on my ArtPadII I sometimes miss a
@@ -1114,7 +1248,6 @@ gdk_input_win32_other_event (GdkEvent *event,
event->proximity.deviceid));
return TRUE;
}
-
return FALSE;
}
@@ -1188,6 +1321,7 @@ gdk_input_win32_grab_pointer (GdkWindow *window,
if (gdkdev->info.deviceid != GDK_CORE_POINTER)
{
#if 0
+ /* XXX */
gdk_input_find_events (window, gdkdev,
event_mask,
event_classes, &num_classes);
@@ -1215,6 +1349,7 @@ gdk_input_win32_grab_pointer (GdkWindow *window,
((gdkdev->button_state != 0) || need_ungrab))
{
#if 0
+ /* XXX */
XUngrabDevice (gdk_display, gdkdev->xdevice, time);
#endif
gdkdev->button_state = 0;
@@ -1255,6 +1390,7 @@ gdk_input_win32_ungrab_pointer (guint32 time)
{
gdkdev = (GdkDevicePrivate *)tmp_list->data;
#if 0
+ /* XXX */
if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice)
XUngrabDevice (gdk_display, gdkdev->xdevice, time);
#endif
@@ -1263,6 +1399,8 @@ gdk_input_win32_ungrab_pointer (guint32 time)
}
}
+#endif /* HAVE_WINTAB */
+
GList *
gdk_input_list_devices (void)
{
@@ -1308,6 +1446,25 @@ gdk_input_motion_events (GdkWindow *window,
return NULL; /* ??? */
}
+static 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;
+}
+
+static 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;
+}
+
+
static GdkInputWindow *
gdk_input_window_find (GdkWindow *window)
{
@@ -1320,6 +1477,8 @@ gdk_input_window_find (GdkWindow *window)
return NULL; /* Not found */
}
+#if !USE_SYSCONTEXT
+
static GdkInputWindow *
gdk_input_window_find_within (GdkWindow *window)
{
@@ -1346,6 +1505,8 @@ gdk_input_window_find_within (GdkWindow *window)
return candidate;
}
+#endif
+
/* 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
@@ -1406,9 +1567,9 @@ gdk_input_set_extension_events (GdkWindow *window,
{
if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED
&& (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL))
- gdk_input_win32_enable_window (window, gdkdev);
+ gdk_input_enable_window (window, gdkdev);
else
- gdk_input_win32_disable_window (window, gdkdev);
+ gdk_input_disable_window (window, gdkdev);
}
}
}
@@ -1428,6 +1589,7 @@ gdk_input_window_destroy (GdkWindow *window)
void
gdk_input_exit (void)
{
+#ifdef HAVE_WINTAB
GList *tmp_list;
GdkDevicePrivate *gdkdev;
@@ -1453,6 +1615,10 @@ gdk_input_exit (void)
g_free (tmp_list->data);
}
g_list_free (gdk_input_windows);
+ gdk_input_windows = NULL;
+
+ gdk_window_unref (wintab_window);
+ wintab_window = NULL;
#if 1
for (tmp_list = wintab_contexts; tmp_list; tmp_list = tmp_list->next)
@@ -1463,27 +1629,30 @@ gdk_input_exit (void)
#ifdef _MSC_VER
/* For some reason WTEnable and/or WTClose tend to crash here.
* Protect with __try/__except to avoid a message box.
+ * When compiling with gcc, we cannot use __try/__except, so
+ * don't call WTClose. I think this means that we'll
+ * eventually run out of Wintab contexts, sigh.
*/
__try {
-#endif /* _MSC_VER */
#if 0
WTEnable (*hctx, FALSE);
#endif
result = WTClose (*hctx);
-#ifdef _MSC_VER
}
__except (/* GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? */
EXCEPTION_EXECUTE_HANDLER /*:
EXCEPTION_CONTINUE_SEARCH */) {
result = FALSE;
}
-#endif /* _MSC_VER */
if (!result)
g_warning ("gdk_input_exit: Closing Wintab context %#x failed", *hctx);
+#endif /* _MSC_VER */
g_free (hctx);
}
#endif
g_list_free (wintab_contexts);
+ wintab_contexts = NULL;
+#endif
}
static GdkDevicePrivate *
@@ -1502,23 +1671,6 @@ gdk_input_find_device (guint32 id)
return NULL;
}
-static GdkDevicePrivate *
-gdk_input_find_dev_from_ctx (HCTX hctx,
- UINT cursor)
-{
- GList *tmp_list = gdk_input_devices;
- GdkDevicePrivate *gdkdev;
-
- while (tmp_list)
- {
- gdkdev = (GdkDevicePrivate *) (tmp_list->data);
- if (gdkdev->hctx == hctx && gdkdev->cursor == cursor)
- return gdkdev;
- tmp_list = tmp_list->next;
- }
- return NULL;
-}
-
void
gdk_input_window_get_pointer (GdkWindow *window,
guint32 deviceid,
diff --git a/gdk/win32/gdkinput.c b/gdk/win32/gdkinput.c
index 70063a7a7..03ff326ea 100644
--- a/gdk/win32/gdkinput.c
+++ b/gdk/win32/gdkinput.c
@@ -33,8 +33,49 @@
#include <gdk/gdk.h>
#include "gdkx.h"
+
+#ifdef HAVE_WINTAB
+#include <wintab.h>
+#define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y | PK_NORMAL_PRESSURE | PK_ORIENTATION)
+#define PACKETMODE (PK_BUTTONS)
+#include <pktdef.h>
+#endif
+
#include "gdkinput.h"
+struct _GdkDevicePrivate {
+ GdkDeviceInfo info;
+
+ /* information about the axes */
+ GdkAxisInfo *axes;
+
+ /* reverse lookup on axis use type */
+ gint axis_for_use[GDK_AXIS_LAST];
+
+ /* true if we need to select a different set of events, but
+ * can't because this is the core pointer
+ */
+ gint needs_update;
+
+ /* State of buttons */
+ gint button_state;
+
+ gint *last_axis_data;
+ gint last_buttons;
+#ifdef HAVE_WINTAB
+ /* WINTAB stuff: */
+ HCTX hctx;
+ /* Cursor number */
+ UINT cursor;
+ /* The cursor's CSR_PKTDATA */
+ WTPKT pktdata;
+ /* CSR_NPBTNMARKS */
+ UINT npbtnmarks[2];
+ /* Azimuth and altitude axis */
+ AXIS orientation_axes[2];
+#endif
+};
+
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
@@ -47,12 +88,33 @@
* good at all.
*/
+#ifdef HAVE_WINTAB
+#define DEBUG_WINTAB 1
+#endif
+
#define TWOPI (2.*M_PI)
#define PING() g_print("%s: %d\n",__FILE__,__LINE__)
/* Forward declarations */
+static gint gdk_input_enable_window (GdkWindow *window,
+ GdkDevicePrivate *gdkdev);
+static gint gdk_input_disable_window (GdkWindow *window,
+ GdkDevicePrivate *gdkdev);
+static void gdk_input_none_get_pointer (GdkWindow *window,
+ guint32 deviceid,
+ gdouble *x,
+ gdouble *y,
+ gdouble *pressure,
+ gdouble *xtilt,
+ gdouble *ytilt,
+ GdkModifierType *mask);
+
+static GdkDevicePrivate *gdk_input_find_device (guint32 deviceid);
+
+#ifdef HAVE_WINTAB
+
static gint gdk_input_win32_set_mode (guint32 deviceid,
GdkInputMode mode);
static void gdk_input_win32_get_pointer (GdkWindow *window,
@@ -63,14 +125,6 @@ static void gdk_input_win32_get_pointer (GdkWindow *window,
gdouble *xtilt,
gdouble *ytilt,
GdkModifierType *mask);
-static void gdk_input_none_get_pointer (GdkWindow *window,
- guint32 deviceid,
- gdouble *x,
- gdouble *y,
- gdouble *pressure,
- gdouble *xtilt,
- gdouble *ytilt,
- GdkModifierType *mask);
static gint gdk_input_win32_grab_pointer (GdkWindow * window,
gint owner_events,
GdkEventMask event_mask,
@@ -89,10 +143,12 @@ static gint gdk_input_win32_disable_window (GdkWindow *window,
GdkDevicePrivate *gdkdev);
static GdkInputWindow *gdk_input_window_find (GdkWindow *window);
+#if !USE_SYSCONTEXT
static GdkInputWindow *gdk_input_window_find_within (GdkWindow *window);
-static GdkDevicePrivate *gdk_input_find_device (guint32 deviceid);
+#endif
static GdkDevicePrivate *gdk_input_find_dev_from_ctx (HCTX hctx,
UINT id);
+#endif /* HAVE_WINTAB */
/* Local variables */
@@ -126,7 +182,7 @@ GdkInputVTable gdk_input_vtable;
gint gdk_input_ignore_core;
gint gdk_input_ignore_wintab = FALSE;
-#if 0
+#if DEBUG_WINTAB
static void
print_lc(LOGCONTEXT *lc)
@@ -228,6 +284,8 @@ print_lc(LOGCONTEXT *lc)
void
gdk_input_init (void)
{
+ guint32 deviceid_counter = 0;
+#ifdef HAVE_WINTAB
GdkDevicePrivate *gdkdev;
GdkWindowPrivate *window_private;
GdkWindowAttr wa;
@@ -235,10 +293,11 @@ gdk_input_init (void)
LOGCONTEXT defcontext;
HCTX *hctx;
UINT ndevices, ncursors, ncsrtypes, firstcsr, hardware;
- AXIS axis_x, axis_y, axis_npressure, axis_orientation[3];
+ BOOL active;
+ AXIS axis_x, axis_y, axis_npressure, axis_or[3];
int i, j, k;
+ int devix, cursorix;
char devname[100], csrname[100];
- guint32 deviceid_counter = 0;
gdk_input_devices = NULL;
wintab_contexts = NULL;
@@ -247,18 +306,25 @@ gdk_input_init (void)
WTInfo (0, 0, NULL))
{
WTInfo (WTI_INTERFACE, IFC_SPECVERSION, &specversion);
-
+ GDK_NOTE (MISC, g_print ("Wintab interface version %d.%d\n",
+ HIBYTE (specversion), LOBYTE (specversion)));
#if USE_SYSCONTEXT
WTInfo (WTI_DEFSYSCTX, 0, &defcontext);
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, (g_print("DEFSYSCTX:\n"), print_lc(&defcontext)));
+#endif
#else
WTInfo (WTI_DEFCONTEXT, 0, &defcontext);
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, (g_print("DEFCONTEXT:\n"), print_lc(&defcontext)));
#endif
-#if 0
- g_print("DEFCONTEXT:\n"); print_lc(&defcontext);
#endif
WTInfo (WTI_INTERFACE, IFC_NDEVICES, &ndevices);
WTInfo (WTI_INTERFACE, IFC_NCURSORS, &ncursors);
-
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, g_print ("NDEVICES: %d, NCURSORS: %d\n",
+ ndevices, ncursors));
+#endif
/* Create a dummy window to receive wintab events */
wa.wclass = GDK_INPUT_OUTPUT;
wa.event_mask = GDK_ALL_EVENTS_MASK;
@@ -275,61 +341,64 @@ gdk_input_init (void)
gdk_window_ref (wintab_window);
window_private = (GdkWindowPrivate *) wintab_window;
- for (i = 0; i < ndevices; i++)
+ for (devix = 0; devix < ndevices; devix++)
{
LOGCONTEXT lc;
- WTInfo (WTI_DEVICES + i, DVC_NAME, devname);
+ WTInfo (WTI_DEVICES + devix, DVC_NAME, devname);
- WTInfo (WTI_DEVICES + i, DVC_NCSRTYPES, &ncsrtypes);
- WTInfo (WTI_DEVICES + i, DVC_FIRSTCSR, &firstcsr);
- WTInfo (WTI_DEVICES + i, DVC_HARDWARE, &hardware);
- WTInfo (WTI_DEVICES + i, DVC_X, &axis_x);
- WTInfo (WTI_DEVICES + i, DVC_Y, &axis_y);
- WTInfo (WTI_DEVICES + i, DVC_NPRESSURE, &axis_npressure);
- WTInfo (WTI_DEVICES + i, DVC_ORIENTATION, axis_orientation);
+ WTInfo (WTI_DEVICES + devix, DVC_NCSRTYPES, &ncsrtypes);
+ WTInfo (WTI_DEVICES + devix, DVC_FIRSTCSR, &firstcsr);
+ WTInfo (WTI_DEVICES + devix, DVC_HARDWARE, &hardware);
+ WTInfo (WTI_DEVICES + devix, DVC_X, &axis_x);
+ WTInfo (WTI_DEVICES + devix, DVC_Y, &axis_y);
+ WTInfo (WTI_DEVICES + devix, DVC_NPRESSURE, &axis_npressure);
+ WTInfo (WTI_DEVICES + devix, DVC_ORIENTATION, axis_or);
if (HIBYTE (specversion) > 1 || LOBYTE (specversion) >= 1)
{
- WTInfo (WTI_DDCTXS + i, CTX_NAME, lc.lcName);
- WTInfo (WTI_DDCTXS + i, CTX_OPTIONS, &lc.lcOptions);
+ WTInfo (WTI_DDCTXS + devix, CTX_NAME, lc.lcName);
+ WTInfo (WTI_DDCTXS + devix, CTX_OPTIONS, &lc.lcOptions);
lc.lcOptions |= CXO_MESSAGES;
+#if USE_SYSCONTEXT
+ lc.lcOptions |= CXO_SYSTEM;
+#endif
lc.lcStatus = 0;
- WTInfo (WTI_DDCTXS + i, CTX_LOCKS, &lc.lcLocks);
+ WTInfo (WTI_DDCTXS + devix, CTX_LOCKS, &lc.lcLocks);
lc.lcMsgBase = WT_DEFBASE;
- lc.lcDevice = i;
- lc.lcPktRate = 20;
+ lc.lcDevice = devix;
+ lc.lcPktRate = 50;
lc.lcPktData = PACKETDATA;
lc.lcPktMode = PK_BUTTONS; /* We want buttons in relative mode */
lc.lcMoveMask = PACKETDATA;
lc.lcBtnDnMask = lc.lcBtnUpMask = ~0;
- WTInfo (WTI_DDCTXS + i, CTX_INORGX, &lc.lcInOrgX);
- WTInfo (WTI_DDCTXS + i, CTX_INORGY, &lc.lcInOrgY);
- WTInfo (WTI_DDCTXS + i, CTX_INORGZ, &lc.lcInOrgZ);
- WTInfo (WTI_DDCTXS + i, CTX_INEXTX, &lc.lcInExtX);
- WTInfo (WTI_DDCTXS + i, CTX_INEXTY, &lc.lcInExtY);
- WTInfo (WTI_DDCTXS + i, CTX_INEXTZ, &lc.lcInExtZ);
+ WTInfo (WTI_DDCTXS + devix, CTX_INORGX, &lc.lcInOrgX);
+ WTInfo (WTI_DDCTXS + devix, CTX_INORGY, &lc.lcInOrgY);
+ WTInfo (WTI_DDCTXS + devix, CTX_INORGZ, &lc.lcInOrgZ);
+ WTInfo (WTI_DDCTXS + devix, CTX_INEXTX, &lc.lcInExtX);
+ WTInfo (WTI_DDCTXS + devix, CTX_INEXTY, &lc.lcInExtY);
+ WTInfo (WTI_DDCTXS + devix, CTX_INEXTZ, &lc.lcInExtZ);
lc.lcOutOrgX = axis_x.axMin;
lc.lcOutOrgY = axis_y.axMin;
lc.lcOutExtX = axis_x.axMax - axis_x.axMin;
lc.lcOutExtY = axis_y.axMax - axis_y.axMin;
lc.lcOutExtY = -lc.lcOutExtY; /* We want Y growing downward */
- WTInfo (WTI_DDCTXS + i, CTX_SENSX, &lc.lcSensX);
- WTInfo (WTI_DDCTXS + i, CTX_SENSY, &lc.lcSensY);
- WTInfo (WTI_DDCTXS + i, CTX_SENSZ, &lc.lcSensZ);
- WTInfo (WTI_DDCTXS + i, CTX_SYSMODE, &lc.lcSysMode);
+ WTInfo (WTI_DDCTXS + devix, CTX_SENSX, &lc.lcSensX);
+ WTInfo (WTI_DDCTXS + devix, CTX_SENSY, &lc.lcSensY);
+ WTInfo (WTI_DDCTXS + devix, CTX_SENSZ, &lc.lcSensZ);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSMODE, &lc.lcSysMode);
lc.lcSysOrgX = lc.lcSysOrgY = 0;
- WTInfo (WTI_DDCTXS + i, CTX_SYSEXTX, &lc.lcSysExtX);
- WTInfo (WTI_DDCTXS + i, CTX_SYSEXTY, &lc.lcSysExtY);
- WTInfo (WTI_DDCTXS + i, CTX_SYSSENSX, &lc.lcSysSensX);
- WTInfo (WTI_DDCTXS + i, CTX_SYSSENSY, &lc.lcSysSensY);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSEXTX, &lc.lcSysExtX);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSEXTY, &lc.lcSysExtY);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSSENSX, &lc.lcSysSensX);
+ WTInfo (WTI_DDCTXS + devix, CTX_SYSSENSY, &lc.lcSysSensY);
}
else
{
lc = defcontext;
lc.lcOptions |= CXO_MESSAGES;
lc.lcMsgBase = WT_DEFBASE;
- lc.lcPktRate = 20; /* Slow down the packets a bit */
+ lc.lcPktRate = 50;
lc.lcPktData = PACKETDATA;
lc.lcPktMode = PACKETMODE;
lc.lcMoveMask = PACKETDATA;
@@ -344,8 +413,9 @@ gdk_input_init (void)
lc.lcOutExtY = -lc.lcOutExtY; /* We want Y growing downward */
#endif
}
-#if 0
- g_print("context for device %d:\n", i); print_lc(&lc);
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, (g_print("context for device %d:\n", devix),
+ print_lc(&lc)));
#endif
hctx = g_new (HCTX, 1);
if ((*hctx = WTOpen (window_private->xwindow, &lc, TRUE)) == NULL)
@@ -353,8 +423,8 @@ gdk_input_init (void)
g_warning ("gdk_input_init: WTOpen failed");
return;
}
- GDK_NOTE (MISC, g_print ("gdk_input_init: opened Wintab device %d %#x\n",
- i, *hctx));
+ GDK_NOTE (MISC, g_print ("opened Wintab device %d %#x\n",
+ devix, *hctx));
wintab_contexts = g_list_append (wintab_contexts, hctx);
#if 0
@@ -362,13 +432,18 @@ gdk_input_init (void)
#endif
WTOverlap (*hctx, TRUE);
-#if 0
- g_print("context for device %d after WTOpen:\n", i); print_lc(&lc);
+#if DEBUG_WINTAB
+ GDK_NOTE (MISC, (g_print("context for device %d after WTOpen:\n", devix),
+ print_lc(&lc)));
#endif
- for (j = firstcsr; j < firstcsr + ncsrtypes; j++)
+ for (cursorix = firstcsr; cursorix < firstcsr + ncsrtypes; cursorix++)
{
+ active = FALSE;
+ WTInfo (WTI_CURSORS + cursorix, CSR_ACTIVE, &active);
+ if (!active)
+ continue;
gdkdev = g_new (GdkDevicePrivate, 1);
- WTInfo (WTI_CURSORS + j, CSR_NAME, csrname);
+ WTInfo (WTI_CURSORS + cursorix, CSR_NAME, csrname);
gdkdev->info.name = g_strconcat (devname, " ", csrname, NULL);
gdkdev->info.deviceid = deviceid_counter++;
gdkdev->info.source = GDK_SOURCE_PEN;
@@ -379,8 +454,8 @@ gdk_input_init (void)
gdkdev->info.has_cursor = FALSE;
#endif
gdkdev->hctx = *hctx;
- gdkdev->cursor = j;
- WTInfo (WTI_CURSORS + j, CSR_PKTDATA, &gdkdev->pktdata);
+ gdkdev->cursor = cursorix;
+ WTInfo (WTI_CURSORS + cursorix, CSR_PKTDATA, &gdkdev->pktdata);
gdkdev->info.num_axes = 0;
if (gdkdev->pktdata & PK_X)
gdkdev->info.num_axes++;
@@ -388,9 +463,18 @@ gdk_input_init (void)
gdkdev->info.num_axes++;
if (gdkdev->pktdata & PK_NORMAL_PRESSURE)
gdkdev->info.num_axes++;
+ /* The wintab driver for the Wacom ArtPad II reports
+ * PK_ORIENTATION in CSR_PKTDATA, but the tablet doesn't
+ * actually sense tilt. Catch this by noticing that the
+ * orientation axis's azimuth resolution is zero.
+ */
+ if ((gdkdev->pktdata & PK_ORIENTATION)
+ && axis_or[0].axResolution == 0)
+ gdkdev->pktdata &= ~PK_ORIENTATION;
+
if (gdkdev->pktdata & PK_ORIENTATION)
gdkdev->info.num_axes += 2; /* x and y tilt */
- WTInfo (WTI_CURSORS + j, CSR_NPBTNMARKS, &gdkdev->npbtnmarks);
+ WTInfo (WTI_CURSORS + cursorix, CSR_NPBTNMARKS, &gdkdev->npbtnmarks);
gdkdev->axes = g_new (GdkAxisInfo, gdkdev->info.num_axes);
gdkdev->info.axes = g_new (GdkAxisUse, gdkdev->info.num_axes);
gdkdev->last_axis_data = g_new (gint, gdkdev->info.num_axes);
@@ -439,10 +523,13 @@ gdk_input_init (void)
{
GdkAxisUse axis;
- gdkdev->orientation_axes[0] = axis_orientation[0];
- gdkdev->orientation_axes[1] = axis_orientation[1];
+ gdkdev->orientation_axes[0] = axis_or[0];
+ gdkdev->orientation_axes[1] = axis_or[1];
for (axis = GDK_AXIS_XTILT; axis <= GDK_AXIS_YTILT; axis++)
{
+ /* Wintab gives us aximuth and altitude, which
+ * we convert to x and y tilt in the -1000..1000 range
+ */
gdkdev->axes[k].xresolution =
gdkdev->axes[k].resolution = 1000;
gdkdev->axes[k].xmin_value =
@@ -457,13 +544,37 @@ gdk_input_init (void)
gdkdev->info.num_keys = 0;
gdkdev->info.keys = NULL;
GDK_NOTE (EVENTS,
- g_print ("gdk_input_init: device: %d axes: %d\n",
- gdkdev->info.deviceid,
- gdkdev->info.num_axes));
+ (g_print ("device: %d (%d) %s axes: %d\n",
+ gdkdev->info.deviceid, cursorix,
+ gdkdev->info.name,
+ gdkdev->info.num_axes),
+ g_print ("axes: X:%d, Y:%d, PRESSURE:%d, "
+ "XTILT:%d, YTILT:%d\n",
+ gdkdev->axis_for_use[GDK_AXIS_X],
+ gdkdev->axis_for_use[GDK_AXIS_Y],
+ gdkdev->axis_for_use[GDK_AXIS_PRESSURE],
+ gdkdev->axis_for_use[GDK_AXIS_XTILT],
+ gdkdev->axis_for_use[GDK_AXIS_YTILT])));
+ for (i = 0; i < gdkdev->info.num_axes; i++)
+ GDK_NOTE (EVENTS,
+ g_print ("...axis %d: %d--%d@%d (%d--%d@%d)\n",
+ i,
+ gdkdev->axes[i].xmin_value,
+ gdkdev->axes[i].xmax_value,
+ gdkdev->axes[i].xresolution,
+ gdkdev->axes[i].min_value,
+ gdkdev->axes[i].max_value,
+ gdkdev->axes[i].resolution));
gdk_input_devices = g_list_append (gdk_input_devices,
gdkdev);
}
}
+ }
+#endif /* HAVE_WINTAB */
+
+ if (deviceid_counter > 0)
+ {
+#ifdef HAVE_WINTAB
gdk_input_vtable.set_mode = gdk_input_win32_set_mode;
gdk_input_vtable.set_axes = NULL;
gdk_input_vtable.set_key = NULL;
@@ -480,6 +591,9 @@ gdk_input_init (void)
gdk_input_root_width = gdk_screen_width ();
gdk_input_root_height = gdk_screen_height ();
gdk_input_ignore_core = FALSE;
+#else
+ g_assert_not_reached ();
+#endif
}
else
{
@@ -501,21 +615,70 @@ gdk_input_init (void)
gdk_input_devices = g_list_append (gdk_input_devices, &gdk_input_core_info);
}
+gint
+gdk_input_set_mode (guint32 deviceid,
+ GdkInputMode mode)
+{
+ if (deviceid == GDK_CORE_POINTER)
+ return FALSE;
+
+ if (gdk_input_vtable.set_mode)
+ return gdk_input_vtable.set_mode (deviceid, mode);
+ else
+ return FALSE;
+}
+
+void
+gdk_input_set_axes (guint32 deviceid,
+ GdkAxisUse *axes)
+{
+ int i;
+ GdkDevicePrivate *gdkdev = gdk_input_find_device (deviceid);
+ g_return_if_fail (gdkdev != NULL);
+
+ if (deviceid == GDK_CORE_POINTER)
+ return;
+
+ for (i = GDK_AXIS_IGNORE; i < GDK_AXIS_LAST; i++)
+ {
+ gdkdev->axis_for_use[i] = -1;
+ }
+
+ for (i = 0; i < gdkdev->info.num_axes; i++)
+ {
+ gdkdev->info.axes[i] = axes[i];
+ gdkdev->axis_for_use[axes[i]] = i;
+ }
+}
+
static void
-gdk_input_get_root_relative_geometry (HWND w,
- int *x_ret,
- int *y_ret)
+gdk_input_none_get_pointer (GdkWindow *window,
+ guint32 deviceid,
+ gdouble *x,
+ gdouble *y,
+ gdouble *pressure,
+ gdouble *xtilt,
+ gdouble *ytilt,
+ GdkModifierType *mask)
{
- RECT rect;
+ gint x_int, y_int;
- GetWindowRect (w, &rect);
+ gdk_window_get_pointer (window, &x_int, &y_int, mask);
- if (x_ret)
- *x_ret = rect.left;
- if (y_ret)
- *y_ret = rect.top;
+ if (x)
+ *x = x_int;
+ if (y)
+ *y = y_int;
+ if (pressure)
+ *pressure = 0.5;
+ if (xtilt)
+ *xtilt = 0;
+ if (ytilt)
+ *ytilt = 0;
}
+#ifdef HAVE_WINTAB
+
static void
gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
GdkInputWindow *input_window,
@@ -625,42 +788,6 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
}
}
-gint
-gdk_input_set_mode (guint32 deviceid,
- GdkInputMode mode)
-{
- if (deviceid == GDK_CORE_POINTER)
- return FALSE;
-
- if (gdk_input_vtable.set_mode)
- return gdk_input_vtable.set_mode (deviceid, mode);
- else
- return FALSE;
-}
-
-void
-gdk_input_set_axes (guint32 deviceid,
- GdkAxisUse *axes)
-{
- int i;
- GdkDevicePrivate *gdkdev = gdk_input_find_device (deviceid);
- g_return_if_fail (gdkdev != NULL);
-
- if (deviceid == GDK_CORE_POINTER)
- return;
-
- for (i = GDK_AXIS_IGNORE; i < GDK_AXIS_LAST; i++)
- {
- gdkdev->axis_for_use[i] = -1;
- }
-
- for (i = 0; i < gdkdev->info.num_axes; i++)
- {
- gdkdev->info.axes[i] = axes[i];
- gdkdev->axis_for_use[axes[i]] = i;
- }
-}
-
static void
gdk_input_win32_get_pointer (GdkWindow *window,
guint32 deviceid,
@@ -714,29 +841,18 @@ gdk_input_win32_get_pointer (GdkWindow *window,
}
static void
-gdk_input_none_get_pointer (GdkWindow *window,
- guint32 deviceid,
- gdouble *x,
- gdouble *y,
- gdouble *pressure,
- gdouble *xtilt,
- gdouble *ytilt,
- GdkModifierType *mask)
+gdk_input_get_root_relative_geometry (HWND w,
+ int *x_ret,
+ int *y_ret)
{
- gint x_int, y_int;
+ RECT rect;
- gdk_window_get_pointer (window, &x_int, &y_int, mask);
+ GetWindowRect (w, &rect);
- if (x)
- *x = x_int;
- if (y)
- *y = y_int;
- if (pressure)
- *pressure = 0.5;
- if (xtilt)
- *xtilt = 0;
- if (ytilt)
- *ytilt = 0;
+ if (x_ret)
+ *x_ret = rect.left;
+ if (y_ret)
+ *y_ret = rect.top;
}
static gint
@@ -850,6 +966,22 @@ decode_tilt (gint *axis_data,
axis_data[1] = sin (az) * cos (el) * 1000;
}
+static GdkDevicePrivate *
+gdk_input_find_dev_from_ctx (HCTX hctx,
+ UINT cursor)
+{
+ GList *tmp_list = gdk_input_devices;
+ GdkDevicePrivate *gdkdev;
+
+ while (tmp_list)
+ {
+ gdkdev = (GdkDevicePrivate *) (tmp_list->data);
+ if (gdkdev->hctx == hctx && gdkdev->cursor == cursor)
+ return gdkdev;
+ tmp_list = tmp_list->next;
+ }
+ return NULL;
+}
static gint
gdk_input_win32_other_event (GdkEvent *event,
MSG *xevent)
@@ -1021,13 +1153,14 @@ gdk_input_win32_other_event (GdkEvent *event,
& (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
| GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
| GDK_BUTTON5_MASK));
- GDK_NOTE (EVENTS, g_print ("WINTAB button %s: %d %d %g,%g %g\n",
+ GDK_NOTE (EVENTS, g_print ("WINTAB button %s: %d %d %g,%g %g %g,%g\n",
(event->button.type == GDK_BUTTON_PRESS ?
"press" : "release"),
event->button.deviceid,
event->button.button,
event->button.x, event->button.y,
- event->button.pressure));
+ event->button.pressure,
+ event->button.xtilt, event->button.ytilt));
}
else
{
@@ -1049,10 +1182,11 @@ gdk_input_win32_other_event (GdkEvent *event,
| GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
| GDK_BUTTON5_MASK));
- GDK_NOTE (EVENTS, g_print ("WINTAB motion: %d %g,%g %g\n",
+ GDK_NOTE (EVENTS, g_print ("WINTAB motion: %d %g,%g %g %g,%g\n",
event->motion.deviceid,
event->motion.x, event->motion.y,
- event->motion.pressure));
+ event->motion.pressure,
+ event->motion.xtilt, event->motion.ytilt));
/* Check for missing release or press events for the normal
* pressure button. At least on my ArtPadII I sometimes miss a
@@ -1114,7 +1248,6 @@ gdk_input_win32_other_event (GdkEvent *event,
event->proximity.deviceid));
return TRUE;
}
-
return FALSE;
}
@@ -1188,6 +1321,7 @@ gdk_input_win32_grab_pointer (GdkWindow *window,
if (gdkdev->info.deviceid != GDK_CORE_POINTER)
{
#if 0
+ /* XXX */
gdk_input_find_events (window, gdkdev,
event_mask,
event_classes, &num_classes);
@@ -1215,6 +1349,7 @@ gdk_input_win32_grab_pointer (GdkWindow *window,
((gdkdev->button_state != 0) || need_ungrab))
{
#if 0
+ /* XXX */
XUngrabDevice (gdk_display, gdkdev->xdevice, time);
#endif
gdkdev->button_state = 0;
@@ -1255,6 +1390,7 @@ gdk_input_win32_ungrab_pointer (guint32 time)
{
gdkdev = (GdkDevicePrivate *)tmp_list->data;
#if 0
+ /* XXX */
if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice)
XUngrabDevice (gdk_display, gdkdev->xdevice, time);
#endif
@@ -1263,6 +1399,8 @@ gdk_input_win32_ungrab_pointer (guint32 time)
}
}
+#endif /* HAVE_WINTAB */
+
GList *
gdk_input_list_devices (void)
{
@@ -1308,6 +1446,25 @@ gdk_input_motion_events (GdkWindow *window,
return NULL; /* ??? */
}
+static 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;
+}
+
+static 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;
+}
+
+
static GdkInputWindow *
gdk_input_window_find (GdkWindow *window)
{
@@ -1320,6 +1477,8 @@ gdk_input_window_find (GdkWindow *window)
return NULL; /* Not found */
}
+#if !USE_SYSCONTEXT
+
static GdkInputWindow *
gdk_input_window_find_within (GdkWindow *window)
{
@@ -1346,6 +1505,8 @@ gdk_input_window_find_within (GdkWindow *window)
return candidate;
}
+#endif
+
/* 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
@@ -1406,9 +1567,9 @@ gdk_input_set_extension_events (GdkWindow *window,
{
if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED
&& (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL))
- gdk_input_win32_enable_window (window, gdkdev);
+ gdk_input_enable_window (window, gdkdev);
else
- gdk_input_win32_disable_window (window, gdkdev);
+ gdk_input_disable_window (window, gdkdev);
}
}
}
@@ -1428,6 +1589,7 @@ gdk_input_window_destroy (GdkWindow *window)
void
gdk_input_exit (void)
{
+#ifdef HAVE_WINTAB
GList *tmp_list;
GdkDevicePrivate *gdkdev;
@@ -1453,6 +1615,10 @@ gdk_input_exit (void)
g_free (tmp_list->data);
}
g_list_free (gdk_input_windows);
+ gdk_input_windows = NULL;
+
+ gdk_window_unref (wintab_window);
+ wintab_window = NULL;
#if 1
for (tmp_list = wintab_contexts; tmp_list; tmp_list = tmp_list->next)
@@ -1463,27 +1629,30 @@ gdk_input_exit (void)
#ifdef _MSC_VER
/* For some reason WTEnable and/or WTClose tend to crash here.
* Protect with __try/__except to avoid a message box.
+ * When compiling with gcc, we cannot use __try/__except, so
+ * don't call WTClose. I think this means that we'll
+ * eventually run out of Wintab contexts, sigh.
*/
__try {
-#endif /* _MSC_VER */
#if 0
WTEnable (*hctx, FALSE);
#endif
result = WTClose (*hctx);
-#ifdef _MSC_VER
}
__except (/* GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? */
EXCEPTION_EXECUTE_HANDLER /*:
EXCEPTION_CONTINUE_SEARCH */) {
result = FALSE;
}
-#endif /* _MSC_VER */
if (!result)
g_warning ("gdk_input_exit: Closing Wintab context %#x failed", *hctx);
+#endif /* _MSC_VER */
g_free (hctx);
}
#endif
g_list_free (wintab_contexts);
+ wintab_contexts = NULL;
+#endif
}
static GdkDevicePrivate *
@@ -1502,23 +1671,6 @@ gdk_input_find_device (guint32 id)
return NULL;
}
-static GdkDevicePrivate *
-gdk_input_find_dev_from_ctx (HCTX hctx,
- UINT cursor)
-{
- GList *tmp_list = gdk_input_devices;
- GdkDevicePrivate *gdkdev;
-
- while (tmp_list)
- {
- gdkdev = (GdkDevicePrivate *) (tmp_list->data);
- if (gdkdev->hctx == hctx && gdkdev->cursor == cursor)
- return gdkdev;
- tmp_list = tmp_list->next;
- }
- return NULL;
-}
-
void
gdk_input_window_get_pointer (GdkWindow *window,
guint32 deviceid,
diff --git a/gdk/win32/gdkinput.h b/gdk/win32/gdkinput.h
index 46e6b1f64..aa4a02dc6 100644
--- a/gdk/win32/gdkinput.h
+++ b/gdk/win32/gdkinput.h
@@ -27,11 +27,6 @@
#ifndef __GDK_INPUT_H__
#define __GDK_INPUT_H__
-#include <wintab.h>
-#define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y | PK_NORMAL_PRESSURE | PK_ORIENTATION)
-#define PACKETMODE (PK_BUTTONS)
-#include <pktdef.h>
-
typedef struct _GdkAxisInfo GdkAxisInfo;
typedef struct _GdkInputVTable GdkInputVTable;
typedef struct _GdkDevicePrivate GdkDevicePrivate;
@@ -89,40 +84,6 @@ struct _GdkAxisInfo
gint min_value, max_value;
};
-#define GDK_INPUT_NUM_EVENTC 6
-
-struct _GdkDevicePrivate {
- GdkDeviceInfo info;
-
- /* information about the axes */
- GdkAxisInfo *axes;
-
- /* reverse lookup on axis use type */
- gint axis_for_use[GDK_AXIS_LAST];
-
- /* true if we need to select a different set of events, but
- * can't because this is the core pointer
- */
- gint needs_update;
-
- /* State of buttons */
- gint button_state;
-
- gint *last_axis_data;
- gint last_buttons;
-
- /* WINTAB stuff: */
- HCTX hctx;
- /* Cursor number */
- UINT cursor;
- /* The cursor's CSR_PKTDATA */
- WTPKT pktdata;
- /* CSR_NPBTNMARKS */
- UINT npbtnmarks[2];
- /* Azimuth and altitude axis */
- AXIS orientation_axes[2];
-};
-
struct _GdkInputWindow
{
/* gdk window */
diff --git a/gdk/win32/gdkvisual-win32.c b/gdk/win32/gdkvisual-win32.c
index 70f513c4e..f27411795 100644
--- a/gdk/win32/gdkvisual-win32.c
+++ b/gdk/win32/gdkvisual-win32.c
@@ -29,24 +29,15 @@
#include <gdk/gdk.h>
#include "gdkx.h"
-static void gdk_visual_add (GdkVisual *visual);
static void gdk_visual_decompose_mask (gulong mask,
gint *shift,
gint *prec);
-static guint gdk_visual_hash (Visual *key);
-static gint gdk_visual_compare (Visual *a,
- Visual *b);
-
static GdkVisualPrivate *system_visual;
-static GdkVisualPrivate *visuals;
-static gint nvisuals;
-static gint available_depths[7];
-static gint navailable_depths;
+static gint available_depths[1];
-static GdkVisualType available_types[6];
-static gint navailable_types;
+static GdkVisualType available_types[1];
#ifdef G_ENABLE_DEBUG
@@ -62,8 +53,6 @@ static const gchar* visual_names[] =
#endif /* G_ENABLE_DEBUG */
-static GHashTable *visual_hash = NULL;
-
void
gdk_visual_init (void)
{
@@ -94,242 +83,156 @@ gdk_visual_init (void)
int rastercaps, numcolors, sizepalette, colorres, bitspixel;
Visual *default_xvisual;
- GdkVisualPrivate temp_visual;
- int nxvisuals;
- int i, j;
- nxvisuals = 1;
- visuals = g_new (GdkVisualPrivate, nxvisuals);
+ system_visual = g_new (GdkVisualPrivate, 1);
+
+ bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL);
+ rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS);
+ default_xvisual = g_new (Visual, 1);
+ system_visual->xvisual = default_xvisual;
+ system_visual->xvisual->visualid = 0;
+ system_visual->xvisual->bitspixel = bitspixel;
- nvisuals = 0;
- for (i = 0; i < nxvisuals; i++)
+ if (rastercaps & RC_PALETTE)
+ {
+ system_visual->visual.type = GDK_VISUAL_PSEUDO_COLOR;
+ numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS);
+ sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE);
+ colorres = GetDeviceCaps (gdk_DC, COLORRES);
+ system_visual->xvisual->map_entries = sizepalette;
+ }
+ else if (bitspixel == 1)
+ {
+ system_visual->visual.type = GDK_VISUAL_STATIC_GRAY;
+ system_visual->xvisual->map_entries = 2;
+ }
+ else if (bitspixel == 4)
+ {
+ system_visual->visual.type = GDK_VISUAL_STATIC_COLOR;
+ system_visual->xvisual->map_entries = 16;
+ }
+ else if (bitspixel == 8)
+ {
+ system_visual->visual.type = GDK_VISUAL_STATIC_COLOR;
+ system_visual->xvisual->map_entries = 256;
+ }
+ else if (bitspixel == 16)
{
- if (1)
+ system_visual->visual.type = GDK_VISUAL_TRUE_COLOR;
+#if 1
+ /* This code by Mike Enright,
+ * see http://www.users.cts.com/sd/m/menright/display.html
+ */
+ memset (&bmi, 0, sizeof (bmi));
+ bmi.bi.biSize = sizeof (bmi.bi);
+
+ hbm = CreateCompatibleBitmap (gdk_DC, 1, 1);
+ GetDIBits (gdk_DC, hbm, 0, 1, NULL,
+ (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
+ GetDIBits (gdk_DC, hbm, 0, 1, NULL,
+ (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
+ DeleteObject (hbm);
+
+ if (bmi.bi.biCompression != BI_BITFIELDS)
{
- bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL);
- rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS);
- default_xvisual = g_new (Visual, 1);
- visuals[nvisuals].xvisual = default_xvisual;
- visuals[nvisuals].xvisual->visualid = nvisuals;
- visuals[nvisuals].xvisual->bitspixel = bitspixel;
-
- if (rastercaps & RC_PALETTE)
+ /* Either BI_RGB or BI_RLE_something
+ * .... or perhaps (!!) something else.
+ * Theoretically biCompression might be
+ * mmioFourCC('c','v','i','d') but I doubt it.
+ */
+ if (bmi.bi.biCompression == BI_RGB)
{
- visuals[nvisuals].visual.type = GDK_VISUAL_PSEUDO_COLOR;
- numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS);
- sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE);
- colorres = GetDeviceCaps (gdk_DC, COLORRES);
- visuals[nvisuals].xvisual->map_entries = sizepalette;
+ /* It's 555 */
+ bitspixel = 15;
+ system_visual->visual.red_mask = 0x00007C00;
+ system_visual->visual.green_mask = 0x000003E0;
+ system_visual->visual.blue_mask = 0x0000001F;
}
- else if (bitspixel == 1)
- {
- visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_GRAY;
- visuals[nvisuals].xvisual->map_entries = 2;
- }
- else if (bitspixel == 4)
+ else
{
- visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR;
- visuals[nvisuals].xvisual->map_entries = 16;
+ g_assert_not_reached ();
}
- else if (bitspixel == 8)
+ }
+ else
+ {
+ DWORD allmasks =
+ bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2];
+ int k = 0;
+ while (allmasks)
{
- visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR;
- visuals[nvisuals].xvisual->map_entries = 256;
+ if (allmasks&1)
+ k++;
+ allmasks/=2;
}
- else if (bitspixel == 16)
- {
- visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR;
-#if 1
- /* This code by Mike Enright,
- * see http://www.users.cts.com/sd/m/menright/display.html
- */
- memset (&bmi, 0, sizeof (bmi));
- bmi.bi.biSize = sizeof (bmi.bi);
-
- hbm = CreateCompatibleBitmap (gdk_DC, 1, 1);
- GetDIBits (gdk_DC, hbm, 0, 1, NULL,
- (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
- GetDIBits (gdk_DC, hbm, 0, 1, NULL,
- (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
- DeleteObject (hbm);
-
- if (bmi.bi.biCompression != BI_BITFIELDS)
- {
- /* Either BI_RGB or BI_RLE_something
- * .... or perhaps (!!) something else.
- * Theoretically biCompression might be
- * mmioFourCC('c','v','i','d') but I doubt it.
- */
- if (bmi.bi.biCompression == BI_RGB)
- {
- /* It's 555 */
- bitspixel = 15;
- visuals[nvisuals].visual.red_mask = 0x00007C00;
- visuals[nvisuals].visual.green_mask = 0x000003E0;
- visuals[nvisuals].visual.blue_mask = 0x0000001F;
- }
- else
- {
- g_assert_not_reached ();
- }
- }
- else
- {
- DWORD allmasks =
- bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2];
- int k = 0;
- while (allmasks)
- {
- if (allmasks&1)
- k++;
- allmasks/=2;
- }
- bitspixel = k;
- visuals[nvisuals].visual.red_mask = bmi.u.fields[0];
- visuals[nvisuals].visual.green_mask = bmi.u.fields[1];
- visuals[nvisuals].visual.blue_mask = bmi.u.fields[2];
- }
+ bitspixel = k;
+ system_visual->visual.red_mask = bmi.u.fields[0];
+ system_visual->visual.green_mask = bmi.u.fields[1];
+ system_visual->visual.blue_mask = bmi.u.fields[2];
+ }
#else
- /* Old, incorrect (but still working) code. */
+ /* Old, incorrect (but still working) code. */
#if 0
- visuals[nvisuals].visual.red_mask = 0x0000F800;
- visuals[nvisuals].visual.green_mask = 0x000007E0;
- visuals[nvisuals].visual.blue_mask = 0x0000001F;
+ system_visual->visual.red_mask = 0x0000F800;
+ system_visual->visual.green_mask = 0x000007E0;
+ system_visual->visual.blue_mask = 0x0000001F;
#else
- visuals[nvisuals].visual.red_mask = 0x00007C00;
- visuals[nvisuals].visual.green_mask = 0x000003E0;
- visuals[nvisuals].visual.blue_mask = 0x0000001F;
+ system_visual->visual.red_mask = 0x00007C00;
+ system_visual->visual.green_mask = 0x000003E0;
+ system_visual->visual.blue_mask = 0x0000001F;
#endif
#endif
- }
- else if (bitspixel == 24 || bitspixel == 32)
- {
- visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR;
- visuals[nvisuals].visual.red_mask = 0x00FF0000;
- visuals[nvisuals].visual.green_mask = 0x0000FF00;
- visuals[nvisuals].visual.blue_mask = 0x000000FF;
- }
- else
- g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel);
-
- visuals[nvisuals].visual.depth = bitspixel;
- visuals[nvisuals].visual.byte_order = GDK_LSB_FIRST;
- visuals[nvisuals].visual.bits_per_rgb = 42; /* Not used? */
-
- if ((visuals[nvisuals].visual.type == GDK_VISUAL_TRUE_COLOR) ||
- (visuals[nvisuals].visual.type == GDK_VISUAL_DIRECT_COLOR))
- {
- gdk_visual_decompose_mask (visuals[nvisuals].visual.red_mask,
- &visuals[nvisuals].visual.red_shift,
- &visuals[nvisuals].visual.red_prec);
-
- gdk_visual_decompose_mask (visuals[nvisuals].visual.green_mask,
- &visuals[nvisuals].visual.green_shift,
- &visuals[nvisuals].visual.green_prec);
-
- gdk_visual_decompose_mask (visuals[nvisuals].visual.blue_mask,
- &visuals[nvisuals].visual.blue_shift,
- &visuals[nvisuals].visual.blue_prec);
- visuals[nvisuals].xvisual->map_entries =
- 1 << (MAX (visuals[nvisuals].visual.red_prec,
- MAX (visuals[nvisuals].visual.green_prec,
- visuals[nvisuals].visual.blue_prec)));
- }
- else
- {
- visuals[nvisuals].visual.red_mask = 0;
- visuals[nvisuals].visual.red_shift = 0;
- visuals[nvisuals].visual.red_prec = 0;
-
- visuals[nvisuals].visual.green_mask = 0;
- visuals[nvisuals].visual.green_shift = 0;
- visuals[nvisuals].visual.green_prec = 0;
-
- visuals[nvisuals].visual.blue_mask = 0;
- visuals[nvisuals].visual.blue_shift = 0;
- visuals[nvisuals].visual.blue_prec = 0;
- }
- visuals[nvisuals].visual.colormap_size = visuals[nvisuals].xvisual->map_entries;
-
- nvisuals += 1;
- }
}
-
- for (i = 0; i < nvisuals; i++)
+ else if (bitspixel == 24 || bitspixel == 32)
{
- for (j = i+1; j < nvisuals; j++)
- {
- if (visuals[j].visual.depth >= visuals[i].visual.depth)
- {
- if ((visuals[j].visual.depth == 8) && (visuals[i].visual.depth == 8))
- {
- if (visuals[j].visual.type == GDK_VISUAL_PSEUDO_COLOR)
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- else if ((visuals[i].visual.type != GDK_VISUAL_PSEUDO_COLOR) &&
- visuals[j].visual.type > visuals[i].visual.type)
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- }
- else if ((visuals[j].visual.depth > visuals[i].visual.depth) ||
- ((visuals[j].visual.depth == visuals[i].visual.depth) &&
- (visuals[j].visual.type > visuals[i].visual.type)))
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- }
- }
+ system_visual->visual.type = GDK_VISUAL_TRUE_COLOR;
+ system_visual->visual.red_mask = 0x00FF0000;
+ system_visual->visual.green_mask = 0x0000FF00;
+ system_visual->visual.blue_mask = 0x000000FF;
}
+ else
+ g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel);
- for (i = 0; i < nvisuals; i++)
- if (default_xvisual->visualid == visuals[i].xvisual->visualid)
- {
- system_visual = &visuals[i];
- break;
- }
+ system_visual->visual.depth = bitspixel;
+ system_visual->visual.byte_order = GDK_LSB_FIRST;
+ system_visual->visual.bits_per_rgb = 42; /* Not used? */
- navailable_depths = 0;
- for (i = 0; i < npossible_depths; i++)
+ if ((system_visual->visual.type == GDK_VISUAL_TRUE_COLOR) ||
+ (system_visual->visual.type == GDK_VISUAL_DIRECT_COLOR))
{
- for (j = 0; j < nvisuals; j++)
- {
- if (visuals[j].visual.depth == possible_depths[i])
- {
- available_depths[navailable_depths++] = visuals[j].visual.depth;
- break;
- }
- }
+ gdk_visual_decompose_mask (system_visual->visual.red_mask,
+ &system_visual->visual.red_shift,
+ &system_visual->visual.red_prec);
+
+ gdk_visual_decompose_mask (system_visual->visual.green_mask,
+ &system_visual->visual.green_shift,
+ &system_visual->visual.green_prec);
+
+ gdk_visual_decompose_mask (system_visual->visual.blue_mask,
+ &system_visual->visual.blue_shift,
+ &system_visual->visual.blue_prec);
+ system_visual->xvisual->map_entries =
+ 1 << (MAX (system_visual->visual.red_prec,
+ MAX (system_visual->visual.green_prec,
+ system_visual->visual.blue_prec)));
}
+ else
+ {
+ system_visual->visual.red_mask = 0;
+ system_visual->visual.red_shift = 0;
+ system_visual->visual.red_prec = 0;
- if (navailable_depths == 0)
- g_error ("unable to find a usable depth");
+ system_visual->visual.green_mask = 0;
+ system_visual->visual.green_shift = 0;
+ system_visual->visual.green_prec = 0;
- navailable_types = 0;
- for (i = 0; i < npossible_types; i++)
- {
- for (j = 0; j < nvisuals; j++)
- {
- if (visuals[j].visual.type == possible_types[i])
- {
- available_types[navailable_types++] = visuals[j].visual.type;
- break;
- }
- }
+ system_visual->visual.blue_mask = 0;
+ system_visual->visual.blue_shift = 0;
+ system_visual->visual.blue_prec = 0;
}
+ system_visual->visual.colormap_size = system_visual->xvisual->map_entries;
- for (i = 0; i < nvisuals; i++)
- gdk_visual_add ((GdkVisual*) &visuals[i]);
-
- if (npossible_types == 0)
- g_error ("unable to find a usable visual type");
+ available_depths[0] = system_visual->visual.depth;
+ available_types[0] = system_visual->visual.type;
}
GdkVisual*
@@ -365,67 +268,43 @@ gdk_visual_get_system (void)
GdkVisual*
gdk_visual_get_best (void)
{
- return ((GdkVisual*) &(visuals[0]));
+ return ((GdkVisual*) system_visual);
}
GdkVisual*
gdk_visual_get_best_with_depth (gint depth)
{
- GdkVisual *return_val;
- int i;
-
- return_val = NULL;
- for (i = 0; i < nvisuals; i++)
- if (depth == visuals[i].visual.depth)
- {
- return_val = (GdkVisual*) &(visuals[i]);
- break;
- }
-
- return return_val;
+ if (depth == system_visual->visual.depth)
+ return (GdkVisual*) system_visual;
+ else
+ return NULL;
}
GdkVisual*
gdk_visual_get_best_with_type (GdkVisualType visual_type)
{
- GdkVisual *return_val;
- int i;
-
- return_val = NULL;
- for (i = 0; i < nvisuals; i++)
- if (visual_type == visuals[i].visual.type)
- {
- return_val = (GdkVisual*) &(visuals[i]);
- break;
- }
-
- return return_val;
+ if (visual_type == system_visual->visual.type)
+ return (GdkVisual*) system_visual;
+ else
+ return NULL;
}
GdkVisual*
gdk_visual_get_best_with_both (gint depth,
GdkVisualType visual_type)
{
- GdkVisual *return_val;
- int i;
-
- return_val = NULL;
- for (i = 0; i < nvisuals; i++)
- if ((depth == visuals[i].visual.depth) &&
- (visual_type == visuals[i].visual.type))
- {
- return_val = (GdkVisual*) &(visuals[i]);
- break;
- }
-
- return return_val;
+ if ((depth == system_visual->visual.depth) &&
+ (visual_type == system_visual->visual.type))
+ return (GdkVisual*) system_visual;
+ else
+ return NULL;
}
void
gdk_query_depths (gint **depths,
gint *count)
{
- *count = navailable_depths;
+ *count = 1;
*depths = available_depths;
}
@@ -433,59 +312,32 @@ void
gdk_query_visual_types (GdkVisualType **visual_types,
gint *count)
{
- *count = navailable_types;
+ *count = 1;
*visual_types = available_types;
}
GList*
gdk_list_visuals (void)
{
- GList *list;
- guint i;
-
- list = NULL;
- for (i = 0; i < nvisuals; ++i)
- list = g_list_append (list, (gpointer) &visuals[i]);
-
- return list;
+ return g_list_append (NULL, (gpointer) system_visual);
}
GdkVisual*
gdk_visual_lookup (Visual *xvisual)
{
- GdkVisual *visual;
-
- if (!visual_hash)
+ if (system_visual->xvisual == xvisual)
+ return (GdkVisual *) system_visual;
+ else
return NULL;
-
- visual = g_hash_table_lookup (visual_hash, xvisual);
- return visual;
}
GdkVisual*
gdkx_visual_get (VisualID xvisualid)
{
- int i;
-
- for (i = 0; i < nvisuals; i++)
- if (xvisualid == visuals[i].xvisual->visualid)
- return (GdkVisual*) &visuals[i];
-
- return NULL;
-}
-
-static void
-gdk_visual_add (GdkVisual *visual)
-{
- GdkVisualPrivate *private;
-
- if (!visual_hash)
- visual_hash = g_hash_table_new ((GHashFunc) gdk_visual_hash,
- (GCompareFunc) gdk_visual_compare);
-
- private = (GdkVisualPrivate*) visual;
-
- g_hash_table_insert (visual_hash, private->xvisual, visual);
+ if (xvisualid == system_visual->xvisual->visualid)
+ return (GdkVisual*) system_visual;
+ else
+ return NULL;
}
static void
@@ -508,19 +360,3 @@ gdk_visual_decompose_mask (gulong mask,
mask >>= 1;
}
}
-
-/* This hash stuff is pretty useless on Windows, as there is only
- one visual... */
-
-static guint
-gdk_visual_hash (Visual *key)
-{
- return key->visualid;
-}
-
-static gint
-gdk_visual_compare (Visual *a,
- Visual *b)
-{
- return (a->visualid == b->visualid);
-}
diff --git a/gdk/win32/gdkvisual.c b/gdk/win32/gdkvisual.c
index 70f513c4e..f27411795 100644
--- a/gdk/win32/gdkvisual.c
+++ b/gdk/win32/gdkvisual.c
@@ -29,24 +29,15 @@
#include <gdk/gdk.h>
#include "gdkx.h"
-static void gdk_visual_add (GdkVisual *visual);
static void gdk_visual_decompose_mask (gulong mask,
gint *shift,
gint *prec);
-static guint gdk_visual_hash (Visual *key);
-static gint gdk_visual_compare (Visual *a,
- Visual *b);
-
static GdkVisualPrivate *system_visual;
-static GdkVisualPrivate *visuals;
-static gint nvisuals;
-static gint available_depths[7];
-static gint navailable_depths;
+static gint available_depths[1];
-static GdkVisualType available_types[6];
-static gint navailable_types;
+static GdkVisualType available_types[1];
#ifdef G_ENABLE_DEBUG
@@ -62,8 +53,6 @@ static const gchar* visual_names[] =
#endif /* G_ENABLE_DEBUG */
-static GHashTable *visual_hash = NULL;
-
void
gdk_visual_init (void)
{
@@ -94,242 +83,156 @@ gdk_visual_init (void)
int rastercaps, numcolors, sizepalette, colorres, bitspixel;
Visual *default_xvisual;
- GdkVisualPrivate temp_visual;
- int nxvisuals;
- int i, j;
- nxvisuals = 1;
- visuals = g_new (GdkVisualPrivate, nxvisuals);
+ system_visual = g_new (GdkVisualPrivate, 1);
+
+ bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL);
+ rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS);
+ default_xvisual = g_new (Visual, 1);
+ system_visual->xvisual = default_xvisual;
+ system_visual->xvisual->visualid = 0;
+ system_visual->xvisual->bitspixel = bitspixel;
- nvisuals = 0;
- for (i = 0; i < nxvisuals; i++)
+ if (rastercaps & RC_PALETTE)
+ {
+ system_visual->visual.type = GDK_VISUAL_PSEUDO_COLOR;
+ numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS);
+ sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE);
+ colorres = GetDeviceCaps (gdk_DC, COLORRES);
+ system_visual->xvisual->map_entries = sizepalette;
+ }
+ else if (bitspixel == 1)
+ {
+ system_visual->visual.type = GDK_VISUAL_STATIC_GRAY;
+ system_visual->xvisual->map_entries = 2;
+ }
+ else if (bitspixel == 4)
+ {
+ system_visual->visual.type = GDK_VISUAL_STATIC_COLOR;
+ system_visual->xvisual->map_entries = 16;
+ }
+ else if (bitspixel == 8)
+ {
+ system_visual->visual.type = GDK_VISUAL_STATIC_COLOR;
+ system_visual->xvisual->map_entries = 256;
+ }
+ else if (bitspixel == 16)
{
- if (1)
+ system_visual->visual.type = GDK_VISUAL_TRUE_COLOR;
+#if 1
+ /* This code by Mike Enright,
+ * see http://www.users.cts.com/sd/m/menright/display.html
+ */
+ memset (&bmi, 0, sizeof (bmi));
+ bmi.bi.biSize = sizeof (bmi.bi);
+
+ hbm = CreateCompatibleBitmap (gdk_DC, 1, 1);
+ GetDIBits (gdk_DC, hbm, 0, 1, NULL,
+ (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
+ GetDIBits (gdk_DC, hbm, 0, 1, NULL,
+ (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
+ DeleteObject (hbm);
+
+ if (bmi.bi.biCompression != BI_BITFIELDS)
{
- bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL);
- rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS);
- default_xvisual = g_new (Visual, 1);
- visuals[nvisuals].xvisual = default_xvisual;
- visuals[nvisuals].xvisual->visualid = nvisuals;
- visuals[nvisuals].xvisual->bitspixel = bitspixel;
-
- if (rastercaps & RC_PALETTE)
+ /* Either BI_RGB or BI_RLE_something
+ * .... or perhaps (!!) something else.
+ * Theoretically biCompression might be
+ * mmioFourCC('c','v','i','d') but I doubt it.
+ */
+ if (bmi.bi.biCompression == BI_RGB)
{
- visuals[nvisuals].visual.type = GDK_VISUAL_PSEUDO_COLOR;
- numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS);
- sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE);
- colorres = GetDeviceCaps (gdk_DC, COLORRES);
- visuals[nvisuals].xvisual->map_entries = sizepalette;
+ /* It's 555 */
+ bitspixel = 15;
+ system_visual->visual.red_mask = 0x00007C00;
+ system_visual->visual.green_mask = 0x000003E0;
+ system_visual->visual.blue_mask = 0x0000001F;
}
- else if (bitspixel == 1)
- {
- visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_GRAY;
- visuals[nvisuals].xvisual->map_entries = 2;
- }
- else if (bitspixel == 4)
+ else
{
- visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR;
- visuals[nvisuals].xvisual->map_entries = 16;
+ g_assert_not_reached ();
}
- else if (bitspixel == 8)
+ }
+ else
+ {
+ DWORD allmasks =
+ bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2];
+ int k = 0;
+ while (allmasks)
{
- visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR;
- visuals[nvisuals].xvisual->map_entries = 256;
+ if (allmasks&1)
+ k++;
+ allmasks/=2;
}
- else if (bitspixel == 16)
- {
- visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR;
-#if 1
- /* This code by Mike Enright,
- * see http://www.users.cts.com/sd/m/menright/display.html
- */
- memset (&bmi, 0, sizeof (bmi));
- bmi.bi.biSize = sizeof (bmi.bi);
-
- hbm = CreateCompatibleBitmap (gdk_DC, 1, 1);
- GetDIBits (gdk_DC, hbm, 0, 1, NULL,
- (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
- GetDIBits (gdk_DC, hbm, 0, 1, NULL,
- (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
- DeleteObject (hbm);
-
- if (bmi.bi.biCompression != BI_BITFIELDS)
- {
- /* Either BI_RGB or BI_RLE_something
- * .... or perhaps (!!) something else.
- * Theoretically biCompression might be
- * mmioFourCC('c','v','i','d') but I doubt it.
- */
- if (bmi.bi.biCompression == BI_RGB)
- {
- /* It's 555 */
- bitspixel = 15;
- visuals[nvisuals].visual.red_mask = 0x00007C00;
- visuals[nvisuals].visual.green_mask = 0x000003E0;
- visuals[nvisuals].visual.blue_mask = 0x0000001F;
- }
- else
- {
- g_assert_not_reached ();
- }
- }
- else
- {
- DWORD allmasks =
- bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2];
- int k = 0;
- while (allmasks)
- {
- if (allmasks&1)
- k++;
- allmasks/=2;
- }
- bitspixel = k;
- visuals[nvisuals].visual.red_mask = bmi.u.fields[0];
- visuals[nvisuals].visual.green_mask = bmi.u.fields[1];
- visuals[nvisuals].visual.blue_mask = bmi.u.fields[2];
- }
+ bitspixel = k;
+ system_visual->visual.red_mask = bmi.u.fields[0];
+ system_visual->visual.green_mask = bmi.u.fields[1];
+ system_visual->visual.blue_mask = bmi.u.fields[2];
+ }
#else
- /* Old, incorrect (but still working) code. */
+ /* Old, incorrect (but still working) code. */
#if 0
- visuals[nvisuals].visual.red_mask = 0x0000F800;
- visuals[nvisuals].visual.green_mask = 0x000007E0;
- visuals[nvisuals].visual.blue_mask = 0x0000001F;
+ system_visual->visual.red_mask = 0x0000F800;
+ system_visual->visual.green_mask = 0x000007E0;
+ system_visual->visual.blue_mask = 0x0000001F;
#else
- visuals[nvisuals].visual.red_mask = 0x00007C00;
- visuals[nvisuals].visual.green_mask = 0x000003E0;
- visuals[nvisuals].visual.blue_mask = 0x0000001F;
+ system_visual->visual.red_mask = 0x00007C00;
+ system_visual->visual.green_mask = 0x000003E0;
+ system_visual->visual.blue_mask = 0x0000001F;
#endif
#endif
- }
- else if (bitspixel == 24 || bitspixel == 32)
- {
- visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR;
- visuals[nvisuals].visual.red_mask = 0x00FF0000;
- visuals[nvisuals].visual.green_mask = 0x0000FF00;
- visuals[nvisuals].visual.blue_mask = 0x000000FF;
- }
- else
- g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel);
-
- visuals[nvisuals].visual.depth = bitspixel;
- visuals[nvisuals].visual.byte_order = GDK_LSB_FIRST;
- visuals[nvisuals].visual.bits_per_rgb = 42; /* Not used? */
-
- if ((visuals[nvisuals].visual.type == GDK_VISUAL_TRUE_COLOR) ||
- (visuals[nvisuals].visual.type == GDK_VISUAL_DIRECT_COLOR))
- {
- gdk_visual_decompose_mask (visuals[nvisuals].visual.red_mask,
- &visuals[nvisuals].visual.red_shift,
- &visuals[nvisuals].visual.red_prec);
-
- gdk_visual_decompose_mask (visuals[nvisuals].visual.green_mask,
- &visuals[nvisuals].visual.green_shift,
- &visuals[nvisuals].visual.green_prec);
-
- gdk_visual_decompose_mask (visuals[nvisuals].visual.blue_mask,
- &visuals[nvisuals].visual.blue_shift,
- &visuals[nvisuals].visual.blue_prec);
- visuals[nvisuals].xvisual->map_entries =
- 1 << (MAX (visuals[nvisuals].visual.red_prec,
- MAX (visuals[nvisuals].visual.green_prec,
- visuals[nvisuals].visual.blue_prec)));
- }
- else
- {
- visuals[nvisuals].visual.red_mask = 0;
- visuals[nvisuals].visual.red_shift = 0;
- visuals[nvisuals].visual.red_prec = 0;
-
- visuals[nvisuals].visual.green_mask = 0;
- visuals[nvisuals].visual.green_shift = 0;
- visuals[nvisuals].visual.green_prec = 0;
-
- visuals[nvisuals].visual.blue_mask = 0;
- visuals[nvisuals].visual.blue_shift = 0;
- visuals[nvisuals].visual.blue_prec = 0;
- }
- visuals[nvisuals].visual.colormap_size = visuals[nvisuals].xvisual->map_entries;
-
- nvisuals += 1;
- }
}
-
- for (i = 0; i < nvisuals; i++)
+ else if (bitspixel == 24 || bitspixel == 32)
{
- for (j = i+1; j < nvisuals; j++)
- {
- if (visuals[j].visual.depth >= visuals[i].visual.depth)
- {
- if ((visuals[j].visual.depth == 8) && (visuals[i].visual.depth == 8))
- {
- if (visuals[j].visual.type == GDK_VISUAL_PSEUDO_COLOR)
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- else if ((visuals[i].visual.type != GDK_VISUAL_PSEUDO_COLOR) &&
- visuals[j].visual.type > visuals[i].visual.type)
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- }
- else if ((visuals[j].visual.depth > visuals[i].visual.depth) ||
- ((visuals[j].visual.depth == visuals[i].visual.depth) &&
- (visuals[j].visual.type > visuals[i].visual.type)))
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- }
- }
+ system_visual->visual.type = GDK_VISUAL_TRUE_COLOR;
+ system_visual->visual.red_mask = 0x00FF0000;
+ system_visual->visual.green_mask = 0x0000FF00;
+ system_visual->visual.blue_mask = 0x000000FF;
}
+ else
+ g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel);
- for (i = 0; i < nvisuals; i++)
- if (default_xvisual->visualid == visuals[i].xvisual->visualid)
- {
- system_visual = &visuals[i];
- break;
- }
+ system_visual->visual.depth = bitspixel;
+ system_visual->visual.byte_order = GDK_LSB_FIRST;
+ system_visual->visual.bits_per_rgb = 42; /* Not used? */
- navailable_depths = 0;
- for (i = 0; i < npossible_depths; i++)
+ if ((system_visual->visual.type == GDK_VISUAL_TRUE_COLOR) ||
+ (system_visual->visual.type == GDK_VISUAL_DIRECT_COLOR))
{
- for (j = 0; j < nvisuals; j++)
- {
- if (visuals[j].visual.depth == possible_depths[i])
- {
- available_depths[navailable_depths++] = visuals[j].visual.depth;
- break;
- }
- }
+ gdk_visual_decompose_mask (system_visual->visual.red_mask,
+ &system_visual->visual.red_shift,
+ &system_visual->visual.red_prec);
+
+ gdk_visual_decompose_mask (system_visual->visual.green_mask,
+ &system_visual->visual.green_shift,
+ &system_visual->visual.green_prec);
+
+ gdk_visual_decompose_mask (system_visual->visual.blue_mask,
+ &system_visual->visual.blue_shift,
+ &system_visual->visual.blue_prec);
+ system_visual->xvisual->map_entries =
+ 1 << (MAX (system_visual->visual.red_prec,
+ MAX (system_visual->visual.green_prec,
+ system_visual->visual.blue_prec)));
}
+ else
+ {
+ system_visual->visual.red_mask = 0;
+ system_visual->visual.red_shift = 0;
+ system_visual->visual.red_prec = 0;
- if (navailable_depths == 0)
- g_error ("unable to find a usable depth");
+ system_visual->visual.green_mask = 0;
+ system_visual->visual.green_shift = 0;
+ system_visual->visual.green_prec = 0;
- navailable_types = 0;
- for (i = 0; i < npossible_types; i++)
- {
- for (j = 0; j < nvisuals; j++)
- {
- if (visuals[j].visual.type == possible_types[i])
- {
- available_types[navailable_types++] = visuals[j].visual.type;
- break;
- }
- }
+ system_visual->visual.blue_mask = 0;
+ system_visual->visual.blue_shift = 0;
+ system_visual->visual.blue_prec = 0;
}
+ system_visual->visual.colormap_size = system_visual->xvisual->map_entries;
- for (i = 0; i < nvisuals; i++)
- gdk_visual_add ((GdkVisual*) &visuals[i]);
-
- if (npossible_types == 0)
- g_error ("unable to find a usable visual type");
+ available_depths[0] = system_visual->visual.depth;
+ available_types[0] = system_visual->visual.type;
}
GdkVisual*
@@ -365,67 +268,43 @@ gdk_visual_get_system (void)
GdkVisual*
gdk_visual_get_best (void)
{
- return ((GdkVisual*) &(visuals[0]));
+ return ((GdkVisual*) system_visual);
}
GdkVisual*
gdk_visual_get_best_with_depth (gint depth)
{
- GdkVisual *return_val;
- int i;
-
- return_val = NULL;
- for (i = 0; i < nvisuals; i++)
- if (depth == visuals[i].visual.depth)
- {
- return_val = (GdkVisual*) &(visuals[i]);
- break;
- }
-
- return return_val;
+ if (depth == system_visual->visual.depth)
+ return (GdkVisual*) system_visual;
+ else
+ return NULL;
}
GdkVisual*
gdk_visual_get_best_with_type (GdkVisualType visual_type)
{
- GdkVisual *return_val;
- int i;
-
- return_val = NULL;
- for (i = 0; i < nvisuals; i++)
- if (visual_type == visuals[i].visual.type)
- {
- return_val = (GdkVisual*) &(visuals[i]);
- break;
- }
-
- return return_val;
+ if (visual_type == system_visual->visual.type)
+ return (GdkVisual*) system_visual;
+ else
+ return NULL;
}
GdkVisual*
gdk_visual_get_best_with_both (gint depth,
GdkVisualType visual_type)
{
- GdkVisual *return_val;
- int i;
-
- return_val = NULL;
- for (i = 0; i < nvisuals; i++)
- if ((depth == visuals[i].visual.depth) &&
- (visual_type == visuals[i].visual.type))
- {
- return_val = (GdkVisual*) &(visuals[i]);
- break;
- }
-
- return return_val;
+ if ((depth == system_visual->visual.depth) &&
+ (visual_type == system_visual->visual.type))
+ return (GdkVisual*) system_visual;
+ else
+ return NULL;
}
void
gdk_query_depths (gint **depths,
gint *count)
{
- *count = navailable_depths;
+ *count = 1;
*depths = available_depths;
}
@@ -433,59 +312,32 @@ void
gdk_query_visual_types (GdkVisualType **visual_types,
gint *count)
{
- *count = navailable_types;
+ *count = 1;
*visual_types = available_types;
}
GList*
gdk_list_visuals (void)
{
- GList *list;
- guint i;
-
- list = NULL;
- for (i = 0; i < nvisuals; ++i)
- list = g_list_append (list, (gpointer) &visuals[i]);
-
- return list;
+ return g_list_append (NULL, (gpointer) system_visual);
}
GdkVisual*
gdk_visual_lookup (Visual *xvisual)
{
- GdkVisual *visual;
-
- if (!visual_hash)
+ if (system_visual->xvisual == xvisual)
+ return (GdkVisual *) system_visual;
+ else
return NULL;
-
- visual = g_hash_table_lookup (visual_hash, xvisual);
- return visual;
}
GdkVisual*
gdkx_visual_get (VisualID xvisualid)
{
- int i;
-
- for (i = 0; i < nvisuals; i++)
- if (xvisualid == visuals[i].xvisual->visualid)
- return (GdkVisual*) &visuals[i];
-
- return NULL;
-}
-
-static void
-gdk_visual_add (GdkVisual *visual)
-{
- GdkVisualPrivate *private;
-
- if (!visual_hash)
- visual_hash = g_hash_table_new ((GHashFunc) gdk_visual_hash,
- (GCompareFunc) gdk_visual_compare);
-
- private = (GdkVisualPrivate*) visual;
-
- g_hash_table_insert (visual_hash, private->xvisual, visual);
+ if (xvisualid == system_visual->xvisual->visualid)
+ return (GdkVisual*) system_visual;
+ else
+ return NULL;
}
static void
@@ -508,19 +360,3 @@ gdk_visual_decompose_mask (gulong mask,
mask >>= 1;
}
}
-
-/* This hash stuff is pretty useless on Windows, as there is only
- one visual... */
-
-static guint
-gdk_visual_hash (Visual *key)
-{
- return key->visualid;
-}
-
-static gint
-gdk_visual_compare (Visual *a,
- Visual *b)
-{
- return (a->visualid == b->visualid);
-}
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index 2a306987b..c2ac52124 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -31,7 +31,6 @@
#include <stdio.h>
#include <gdk/gdk.h>
#include "gdkprivate.h"
-#include "gdkinput.h"
/* The Win API function AdjustWindowRect may return negative values
* resulting in obscured title bars. This helper function is coreccting it.
diff --git a/gdk/win32/gdkwindow.c b/gdk/win32/gdkwindow.c
index 2a306987b..c2ac52124 100644
--- a/gdk/win32/gdkwindow.c
+++ b/gdk/win32/gdkwindow.c
@@ -31,7 +31,6 @@
#include <stdio.h>
#include <gdk/gdk.h>
#include "gdkprivate.h"
-#include "gdkinput.h"
/* The Win API function AdjustWindowRect may return negative values
* resulting in obscured title bars. This helper function is coreccting it.