From 1b976c4464ea6f3aacbe0f516b6c8d9d7055737b Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Wed, 2 Feb 2005 18:13:41 +0000 Subject: [PATCH] =?UTF-8?q?Implement=20lazy=20extended=20input=20initializ?= =?UTF-8?q?ation=20on=20Win32,=20by=20Robert=20=C3=96gren.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2005-02-02 Tor Lillqvist Implement lazy extended input initialization on Win32, by Robert Ögren. Fixes #163163, possibly #162334. Lazy initialization would be a good idea in any case even if it didn't fix any visible problems, though. The Wacom tablet driver seems to get confused if Wintab is initialized but no window is shown before the process exits. This is the case for some GIMP plug-ins, for instance. * gdk/win32/gdkinput-win32.c (_gdk_input_wintab_init_check): Made non-static (and renamed). (_gdk_input_init): Don't call _gdk_input_wintab_init_check(). * gdk/win32/gdkinput-win32.h: Declare _gdk_input_wintab_init_check(). * gdk/win32/gdkinput.c (gdk_devices_list, gdk_display_list_devices, gdk_input_set_extension_events): Call _gdk_input_wintab_init_check() here instead. --- ChangeLog | 21 +++++++++++++++++++++ ChangeLog.pre-2-10 | 21 +++++++++++++++++++++ ChangeLog.pre-2-8 | 21 +++++++++++++++++++++ gdk/win32/gdkinput-win32.c | 23 +++++++++++++++++------ gdk/win32/gdkinput-win32.h | 4 ++++ gdk/win32/gdkinput.c | 9 +++++++++ 6 files changed, 93 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2af69a79da..fcfa535014 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2005-02-02 Tor Lillqvist + + Implement lazy extended input initialization on Win32, by Robert + Ögren. Fixes #163163, possibly #162334. Lazy initialization would + be a good idea in any case even if it didn't fix any visible + problems, though. + + The Wacom tablet driver seems to get confused if Wintab is + initialized but no window is shown before the process exits. This + is the case for some GIMP plug-ins, for instance. + + * gdk/win32/gdkinput-win32.c (_gdk_input_wintab_init_check): Made + non-static (and renamed). + (_gdk_input_init): Don't call _gdk_input_wintab_init_check(). + + * gdk/win32/gdkinput-win32.h: Declare _gdk_input_wintab_init_check(). + + * gdk/win32/gdkinput.c (gdk_devices_list, + gdk_display_list_devices, gdk_input_set_extension_events): Call + _gdk_input_wintab_init_check() here instead. + 2005-02-02 Ivan, Wong Yat Cheung * gdk/win32/gdkselection.c: Use a FIFO list for storing GdkSelProp diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 2af69a79da..fcfa535014 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,24 @@ +2005-02-02 Tor Lillqvist + + Implement lazy extended input initialization on Win32, by Robert + Ögren. Fixes #163163, possibly #162334. Lazy initialization would + be a good idea in any case even if it didn't fix any visible + problems, though. + + The Wacom tablet driver seems to get confused if Wintab is + initialized but no window is shown before the process exits. This + is the case for some GIMP plug-ins, for instance. + + * gdk/win32/gdkinput-win32.c (_gdk_input_wintab_init_check): Made + non-static (and renamed). + (_gdk_input_init): Don't call _gdk_input_wintab_init_check(). + + * gdk/win32/gdkinput-win32.h: Declare _gdk_input_wintab_init_check(). + + * gdk/win32/gdkinput.c (gdk_devices_list, + gdk_display_list_devices, gdk_input_set_extension_events): Call + _gdk_input_wintab_init_check() here instead. + 2005-02-02 Ivan, Wong Yat Cheung * gdk/win32/gdkselection.c: Use a FIFO list for storing GdkSelProp diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 2af69a79da..fcfa535014 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,24 @@ +2005-02-02 Tor Lillqvist + + Implement lazy extended input initialization on Win32, by Robert + Ögren. Fixes #163163, possibly #162334. Lazy initialization would + be a good idea in any case even if it didn't fix any visible + problems, though. + + The Wacom tablet driver seems to get confused if Wintab is + initialized but no window is shown before the process exits. This + is the case for some GIMP plug-ins, for instance. + + * gdk/win32/gdkinput-win32.c (_gdk_input_wintab_init_check): Made + non-static (and renamed). + (_gdk_input_init): Don't call _gdk_input_wintab_init_check(). + + * gdk/win32/gdkinput-win32.h: Declare _gdk_input_wintab_init_check(). + + * gdk/win32/gdkinput.c (gdk_devices_list, + gdk_display_list_devices, gdk_input_set_extension_events): Call + _gdk_input_wintab_init_check() here instead. + 2005-02-02 Ivan, Wong Yat Cheung * gdk/win32/gdkselection.c: Use a FIFO list for storing GdkSelProp diff --git a/gdk/win32/gdkinput-win32.c b/gdk/win32/gdkinput-win32.c index a03c1024df..366979f2d4 100644 --- a/gdk/win32/gdkinput-win32.c +++ b/gdk/win32/gdkinput-win32.c @@ -71,9 +71,9 @@ static GdkInputWindow *gdk_input_window_find_within (GdkWindow *window); static GdkDevicePrivate *gdk_input_find_dev_from_ctx (HCTX hctx, UINT id); -static GList *wintab_contexts; +static GList *wintab_contexts = NULL; -static GdkWindow *wintab_window; +static GdkWindow *wintab_window = NULL; #endif /* HAVE_WINTAB */ @@ -204,9 +204,10 @@ print_lc(LOGCONTEXT *lc) #endif -static void -gdk_input_wintab_init (void) +void +_gdk_input_wintab_init_check (void) { + static gboolean wintab_initialized = FALSE; GdkDevicePrivate *gdkdev; GdkWindowAttr wa; WORD specversion; @@ -219,7 +220,11 @@ gdk_input_wintab_init (void) int devix, cursorix; char devname[100], csrname[100]; - _gdk_input_devices = NULL; + if (wintab_initialized) + return; + + wintab_initialized = TRUE; + wintab_contexts = NULL; if (!_gdk_input_ignore_wintab && @@ -1276,7 +1281,13 @@ _gdk_input_init (GdkDisplay *display) _gdk_init_input_core (display); #ifdef HAVE_WINTAB - gdk_input_wintab_init (); +#ifdef WINTAB_NO_LAZY_INIT + /* Normally, Wintab is only initialized when the application performs + * an action that requires it, such as enabling extended input events + * for a window or enumerating the devices. + */ + _gdk_input_wintab_init_check (); +#endif /* WINTAB_NO_LAZY_INIT */ #endif /* HAVE_WINTAB */ _gdk_input_devices = g_list_append (_gdk_input_devices, display->core_pointer); diff --git a/gdk/win32/gdkinput-win32.h b/gdk/win32/gdkinput-win32.h index 0e79d23a27..12da3e87be 100644 --- a/gdk/win32/gdkinput-win32.h +++ b/gdk/win32/gdkinput-win32.h @@ -166,4 +166,8 @@ gboolean _gdk_device_get_history (GdkDevice *device, GdkTimeCoord ***events, gint *n_events); +#ifdef HAVE_WINTAB +void _gdk_input_wintab_init_check (void); +#endif /* HAVE_WINTAB */ + #endif /* __GDK_INPUT_WIN32_H__ */ diff --git a/gdk/win32/gdkinput.c b/gdk/win32/gdkinput.c index 68d215ffca..a2c71bb85c 100644 --- a/gdk/win32/gdkinput.c +++ b/gdk/win32/gdkinput.c @@ -119,12 +119,18 @@ gdk_device_get_type (void) GList * gdk_devices_list (void) { +#ifdef HAVE_WINTAB + _gdk_input_wintab_init_check (); +#endif /* HAVE_WINTAB */ return _gdk_input_devices; } GList * gdk_display_list_devices (GdkDisplay *dpy) { +#ifdef HAVE_WINTAB + _gdk_input_wintab_init_check (); +#endif /* HAVE_WINTAB */ return _gdk_input_devices; } @@ -270,6 +276,9 @@ gdk_input_set_extension_events (GdkWindow *window, gint mask, if (mask != 0) { +#ifdef HAVE_WINTAB + _gdk_input_wintab_init_check (); +#endif /* HAVE_WINTAB */ iw = g_new(GdkInputWindow,1); iw->window = window;