diff -ru gtk+.prev/ChangeLog gtk+/ChangeLog
--- gtk+.prev/ChangeLog	2004-05-26 23:42:02.000000000 +0100
+++ gtk+/ChangeLog	2004-05-26 23:37:45.468750000 +0100
@@ -1,5 +1,11 @@
 2004-05-26  Robert Ögren  <gtk@roboros.com>
 
+	* gdk/win32/gdkinput-win32.c (_gdk_input_other_event): Send key
+	modifiers (shift, ctrl etc) in button and motion events from the
+	tablet. (#143240)
+
+2004-05-26  Robert Ögren  <gtk@roboros.com>
+
 	* gdk/win32/gdkinput-win32.c (gdk_device_get_state): Simple
 	implementation for extended input devices using last known 
 	device state (#143237)
diff -ru gtk+.prev/gdk/win32/gdkinput-win32.c gtk+/gdk/win32/gdkinput-win32.c
--- gtk+.prev/gdk/win32/gdkinput-win32.c	2004-05-26 22:59:00.000000000 +0100
+++ gtk+/gdk/win32/gdkinput-win32.c	2004-05-26 23:15:54.359375000 +0100
@@ -694,6 +694,31 @@
   input_window->root_y = root_y;
 }
 
+/**
+ * Get the currently active keyboard modifiers (ignoring the mouse buttons)
+ * We could use gdk_window_get_pointer but that function does a lot of other
+ * expensive things besides getting the modifiers. This code is somewhat based
+ * on build_pointer_event_state from gdkevents-win32.c
+ */
+static guint
+get_modifier_key_state (void)
+{
+  guint state;
+  
+  state = 0;
+  /* High-order bit is up/down, low order bit is toggled/untoggled */
+  if (GetKeyState (VK_CONTROL) < 0)
+    state |= GDK_CONTROL_MASK;
+  if (GetKeyState (VK_SHIFT) < 0)
+    state |= GDK_SHIFT_MASK;
+  if (GetKeyState (VK_MENU) < 0)
+    state |= GDK_MOD1_MASK;
+  if (GetKeyState (VK_CAPITAL) & 0x1)
+    state |= GDK_LOCK_MASK;
+
+  return state;
+}
+
 gboolean 
 _gdk_input_other_event (GdkEvent  *event,
 			MSG       *msg,
@@ -708,6 +733,7 @@
   GdkInputWindow *input_window;
   GdkDevicePrivate *gdkdev = NULL;
   GdkEventMask masktest;
+  guint key_state;
   POINT pt;
 
   PACKET packet;
@@ -878,7 +904,7 @@
 	return FALSE;
 
       event->any.window = window;
-
+      key_state = get_modifier_key_state ();
       if (event->any.type == GDK_BUTTON_PRESS
 	  || event->any.type == GDK_BUTTON_RELEASE)
 	{
@@ -903,7 +929,8 @@
 	  event->button.state = ((gdkdev->button_state << 8)
 				 & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
 				    | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
-				    | GDK_BUTTON5_MASK));
+				    | GDK_BUTTON5_MASK))
+				| key_state;
 	  GDK_NOTE (EVENTS_OR_INPUT,
 		    g_print ("WINTAB button %s:%d %g,%g\n",
 			     (event->button.type == GDK_BUTTON_PRESS ?
@@ -928,7 +955,8 @@
 	  event->motion.state = ((gdkdev->button_state << 8)
 				 & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
 				    | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
-				    | GDK_BUTTON5_MASK));
+				    | GDK_BUTTON5_MASK))
+				| key_state;
 
 	  GDK_NOTE (EVENTS_OR_INPUT,
 		    g_print ("WINTAB motion: %g,%g\n",
@@ -959,7 +987,8 @@
 	      event2->button.state = ((gdkdev->button_state << 8)
 				      & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
 					 | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
-					 | GDK_BUTTON5_MASK));
+					 | GDK_BUTTON5_MASK))
+				     | key_state;
 	      event2->button.button = 1;
 	      GDK_NOTE (EVENTS_OR_INPUT,
 			g_print ("WINTAB synthesized button %s: %d %g,%gg\n",
