]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkevents-win32.c
Implement it. Obscure bit manipulation needed.
[~andy/gtk] / gdk / win32 / gdkevents-win32.c
index fa839fe898b18c70d2b7fa5b62ffe0f4ff6e749d..d5b1dbfca348281c2e637ef07aa12d3a229823ed 100644 (file)
@@ -523,6 +523,7 @@ GdkEvent*
 gdk_event_copy (GdkEvent *event)
 {
   GdkEvent *new_event;
+  gchar *s;
   
   g_return_val_if_fail (event != NULL, NULL);
   
@@ -535,7 +536,12 @@ gdk_event_copy (GdkEvent *event)
     {
     case GDK_KEY_PRESS:
     case GDK_KEY_RELEASE:
-      new_event->key.string = g_strdup (event->key.string);
+      if (event->key.length > 0)
+       {
+         s = event->key.string;
+         new_event->key.string = g_malloc (event->key.length + 1);
+         memcpy (new_event->key.string, s, event->key.length + 1);
+       }
       break;
       
     case GDK_ENTER_NOTIFY:
@@ -1347,7 +1353,7 @@ gdk_event_translate (GdkEvent *event,
        {
          /* Keyboard is grabbed with owner_events FALSE */
          GDK_NOTE (EVENTS,
-                   g_print ("grabbed, owner_events FALSE, "
+                   g_print ("...grabbed, owner_events FALSE, "
                             "sending to %#x\n", k_grab_window->xwindow));
          event->key.window = (GdkWindow *) k_grab_window;
        }
@@ -1365,7 +1371,7 @@ gdk_event_translate (GdkEvent *event,
            {
              /* Keyboard is grabbed with owner_events TRUE */
              GDK_NOTE (EVENTS,
-                       g_print ("grabbed, owner_events TRUE, doesn't want it, "
+                       g_print ("...grabbed, owner_events TRUE, doesn't want it, "
                                 "sending to %#x\n", k_grab_window->xwindow));
              event->key.window = (GdkWindow *) k_grab_window;
            }
@@ -1380,9 +1386,8 @@ gdk_event_translate (GdkEvent *event,
              window = window_private->parent;
              gdk_window_ref (window);
              window_private = (GdkWindowPrivate *) window;
-             GDK_NOTE (EVENTS,
-                       g_print ("not wanted, not grabbed, "
-                                "sending to %#x\n", window_private->xwindow));
+             GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
+                                        window_private->xwindow));
              goto keyup_or_down;
            }
        }
@@ -1529,6 +1534,25 @@ gdk_event_translate (GdkEvent *event,
          event->key.keyval = GDK_F15; break;
        case VK_F16:
          event->key.keyval = GDK_F16; break;
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (GetKeyState (VK_CONTROL) < 0)
+           /* Control-digits won't come in as a WM_CHAR */
+           event->key.keyval = GDK_0 + (xevent->wParam - '0');
+         else
+           {
+             ignore_WM_CHAR = FALSE;
+             event->key.keyval = GDK_VoidSymbol;
+           }
+         break;
        default:
          if (xevent->message == WM_SYSKEYDOWN || xevent->message == WM_SYSKEYUP)
            {
@@ -1560,9 +1584,9 @@ gdk_event_translate (GdkEvent *event,
        event->key.state |= GDK_CONTROL_MASK;
       if (xevent->wParam != VK_MENU && GetKeyState (VK_MENU) < 0)
        event->key.state |= GDK_MOD1_MASK;
-      event->key.length = 0;
       return_val = window_private && !window_private->destroyed;
       event->key.string = NULL;
+      event->key.length = 0;
       break;
 
     case WM_CHAR:
@@ -1589,7 +1613,7 @@ gdk_event_translate (GdkEvent *event,
        {
          /* Keyboard is grabbed with owner_events FALSE */
          GDK_NOTE (EVENTS,
-                   g_print ("grabbed, owner_events FALSE, "
+                   g_print ("...grabbed, owner_events FALSE, "
                             "sending to %#x\n", k_grab_window->xwindow));
          event->key.window = (GdkWindow *) k_grab_window;
        }
@@ -1602,7 +1626,7 @@ gdk_event_translate (GdkEvent *event,
            {
              /* Keyboard is grabbed with owner_events TRUE */
              GDK_NOTE (EVENTS,
-                       g_print ("grabbed, owner_events TRUE, doesn't want it, "
+                       g_print ("...grabbed, owner_events TRUE, doesn't want it, "
                                 "sending to %#x\n", k_grab_window->xwindow));
              event->key.window = (GdkWindow *) k_grab_window;
            }
@@ -1618,9 +1642,8 @@ gdk_event_translate (GdkEvent *event,
              window = window_private->parent;
              gdk_window_ref (window);
              window_private = (GdkWindowPrivate *) window;
-             GDK_NOTE (EVENTS,
-                       g_print ("not wanted, not grabbed, sending to %#x\n",
-                                window_private->xwindow));
+             GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
+                                        window_private->xwindow));
              goto wm_char;
            }
        }
@@ -1656,9 +1679,10 @@ gdk_event_translate (GdkEvent *event,
            }
          if (!is_AltGr_key && GetKeyState (VK_MENU) < 0)
            event->key.state |= GDK_MOD1_MASK;
-         event->key.string = g_strdup (" ");
+         event->key.string = g_malloc (2);
          event->key.length = 1;
          event->key.string[0] = xevent->wParam; /* ??? */
+         event->key.string[1] = 0;
 
          if (window_private->event_mask & GDK_KEY_PRESS_MASK)
            {
@@ -1669,9 +1693,10 @@ gdk_event_translate (GdkEvent *event,
              if (charcount > sizeof (buf)- 1)
                charcount = sizeof (buf) - 1;
              g_free (event2->key.string);
-             event2->key.string = g_malloc (charcount);
+             event2->key.string = g_malloc (charcount + 1);
              for (i = 0; i < charcount; i++)
                event2->key.string[i] = event->key.keyval;
+             event2->key.string[charcount] = 0;
              event2->key.length = charcount;
 
              gdk_event_queue_append (event2);
@@ -1707,9 +1732,10 @@ gdk_event_translate (GdkEvent *event,
            }
          if (!is_AltGr_key && GetKeyState (VK_MENU) < 0)
            event->key.state |= GDK_MOD1_MASK;
-         event->key.string = g_malloc (charcount);
+         event->key.string = g_malloc (charcount + 1);
          for (i = 0; i < charcount; i++)
            event->key.string[i] = event->key.keyval;
+         event->key.string[charcount] = 0;
          event->key.length = charcount;
        }
       else
@@ -1726,8 +1752,6 @@ gdk_event_translate (GdkEvent *event,
     case WM_RBUTTONDOWN:
       button = 3;
 
-      /* Print debugging info.
-       */
     buttondown0:
       GDK_NOTE (EVENTS, 
                g_print ("WM_%cBUTTONDOWN: %#x  x,y: %d %d  button: %d\n",
@@ -1740,12 +1764,15 @@ gdk_event_translate (GdkEvent *event,
          && (window_private->extension_events != 0)
          && gdk_input_ignore_core)
        {
-         GDK_NOTE (EVENTS, g_print ("... ignored\n"));
+         GDK_NOTE (EVENTS, g_print ("...ignored\n"));
          break;
        }
 
-    buttondown:
+      if (window != curWnd)
+       synthesize_crossing_events (window, xevent);
+
       event->button.type = GDK_BUTTON_PRESS;
+    buttondown:
       event->button.window = window;
       if (window_private)
        mask = window_private->event_mask;
@@ -1756,14 +1783,14 @@ gdk_event_translate (GdkEvent *event,
           && !p_grab_owner_events)
        {
          /* Pointer is grabbed with owner_events FALSE */
-         GDK_NOTE (EVENTS, g_print ("grabbed, owner_events FALSE\n"));
+         GDK_NOTE (EVENTS, g_print ("...grabbed, owner_events FALSE\n"));
          mask = p_grab_event_mask;
          if (!(mask & GDK_BUTTON_PRESS_MASK))
            /* Grabber doesn't want it */
            break;
          else
            event->button.window = (GdkWindow *) p_grab_window;
-         GDK_NOTE (EVENTS, g_print ("sending to %#x\n",
+         GDK_NOTE (EVENTS, g_print ("...sending to %#x\n",
                                     p_grab_window->xwindow));
        }
       else if (window_private
@@ -1774,14 +1801,14 @@ gdk_event_translate (GdkEvent *event,
              && p_grab_owner_events)
            {
              /* Pointer is grabbed wíth owner_events TRUE */ 
-             GDK_NOTE (EVENTS, g_print ("grabbed, owner_events TRUE, doesn't want it\n"));
+             GDK_NOTE (EVENTS, g_print ("...grabbed, owner_events TRUE, doesn't want it\n"));
              mask = p_grab_event_mask;
              if (!(mask & GDK_BUTTON_PRESS_MASK))
                /* Grabber doesn't want it either */
                break;
              else
                event->button.window = (GdkWindow *) p_grab_window;
-             GDK_NOTE (EVENTS, g_print ("sending to %#x\n",
+             GDK_NOTE (EVENTS, g_print ("...sending to %#x\n",
                                         p_grab_window->xwindow));
            }
          else
@@ -1801,6 +1828,8 @@ gdk_event_translate (GdkEvent *event,
              window_private = (GdkWindowPrivate *) window;
              ScreenToClient (window_private->xwindow, &pt);
              xevent->lParam = MAKELPARAM (pt.x, pt.y);
+             GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
+                                        window_private->xwindow));
              goto buttondown; /* What did Dijkstra say? */
            }
        }
@@ -1809,15 +1838,12 @@ gdk_event_translate (GdkEvent *event,
       if (!p_grab_window)
        {
          /* No explicit active grab, let's start one automatically */
-         GDK_NOTE (EVENTS, g_print ("automatic grab started\n"));
+         GDK_NOTE (EVENTS, g_print ("...automatic grab started\n"));
          gdk_pointer_grab (window, TRUE, window_private->event_mask,
                            NULL, NULL, 0);
          p_grab_automatic = TRUE;
        }
 
-      if (window != curWnd)
-       synthesize_crossing_events (window, xevent);
-
       event->button.time = xevent->time;
       event->button.x = LOWORD (xevent->lParam);
       event->button.y = HIWORD (xevent->lParam);
@@ -1893,7 +1919,7 @@ gdk_event_translate (GdkEvent *event,
          ScreenToClient (p_grab_window->xwindow, &pt);
          event->button.x = pt.x;
          event->button.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("New coords are +%d+%d\n", pt.x, pt.y));
+         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
        }
       break;
 
@@ -1906,8 +1932,6 @@ gdk_event_translate (GdkEvent *event,
     case WM_RBUTTONUP:
       button = 3;
 
-      /* Print debugging info.
-       */
     buttonup0:
       GDK_NOTE (EVENTS, 
                g_print ("WM_%cBUTTONUP: %#x  x,y: %d %d  button: %d\n",
@@ -1920,12 +1944,15 @@ gdk_event_translate (GdkEvent *event,
          && (window_private->extension_events != 0)
          && gdk_input_ignore_core)
        {
-         GDK_NOTE (EVENTS, g_print ("... ignored\n"));
+         GDK_NOTE (EVENTS, g_print ("...ignored\n"));
          break;
        }
 
-    buttonup:
+      if (window != curWnd)
+       synthesize_crossing_events (window, xevent);
+
       event->button.type = GDK_BUTTON_RELEASE;
+    buttonup:
       event->button.window = window;
       if (window_private)
        mask = window_private->event_mask;
@@ -1936,14 +1963,14 @@ gdk_event_translate (GdkEvent *event,
           && !p_grab_owner_events)
        {
          /* Pointer is grabbed with owner_events FALSE */
-         GDK_NOTE (EVENTS, g_print ("grabbed, owner_events FALSE\n"));
+         GDK_NOTE (EVENTS, g_print ("...grabbed, owner_events FALSE\n"));
          mask = p_grab_event_mask;
          if (!(mask & GDK_BUTTON_RELEASE_MASK))
            /* Grabber doesn't want it */
            break;
          else
            event->button.window = (GdkWindow *) p_grab_window;
-         GDK_NOTE (EVENTS, g_print ("sending to %#x\n",
+         GDK_NOTE (EVENTS, g_print ("...sending to %#x\n",
                                     p_grab_window->xwindow));
        }
       else if (window_private
@@ -1954,14 +1981,14 @@ gdk_event_translate (GdkEvent *event,
              && p_grab_owner_events)
            {
              /* Pointer is grabbed wíth owner_events TRUE */
-             GDK_NOTE (EVENTS, g_print ("grabbed, owner_events TRUE, doesn't want it\n"));
+             GDK_NOTE (EVENTS, g_print ("...grabbed, owner_events TRUE, doesn't want it\n"));
              mask = p_grab_event_mask;
              if (!(mask & GDK_BUTTON_RELEASE_MASK))
                /* Grabber doesn't want it */
                break;
              else
                event->button.window = (GdkWindow *) p_grab_window;
-             GDK_NOTE (EVENTS, g_print ("sending to %#x\n",
+             GDK_NOTE (EVENTS, g_print ("...sending to %#x\n",
                                         p_grab_window->xwindow));
            }
          else
@@ -1980,13 +2007,12 @@ gdk_event_translate (GdkEvent *event,
              window_private = (GdkWindowPrivate *) window;
              ScreenToClient (window_private->xwindow, &pt);
              xevent->lParam = MAKELPARAM (pt.x, pt.y);
+             GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
+                                        window_private->xwindow));
              goto buttonup;
            }
        }
 
-      if (window != curWnd)
-       synthesize_crossing_events (window, xevent);
-
       event->button.time = xevent->time;
       event->button.x = LOWORD (xevent->lParam);
       event->button.y = HIWORD (xevent->lParam);
@@ -2022,7 +2048,7 @@ gdk_event_translate (GdkEvent *event,
          ScreenToClient (p_grab_window->xwindow, &pt);
          event->button.x = pt.x;
          event->button.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("New coords are +%d+%d\n", pt.x, pt.y));
+         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
        }
       if (p_grab_window != NULL
          && p_grab_automatic
@@ -2031,8 +2057,6 @@ gdk_event_translate (GdkEvent *event,
       break;
 
     case WM_MOUSEMOVE:
-      /* Print debugging info.
-       */
       GDK_NOTE (EVENTS,
                g_print ("WM_MOUSEMOVE: %#x  %#x +%d+%d\n",
                         xevent->hwnd, xevent->wParam,
@@ -2072,7 +2096,7 @@ gdk_event_translate (GdkEvent *event,
          && (window_private->extension_events != 0)
          && gdk_input_ignore_core)
        {
-         GDK_NOTE (EVENTS, g_print ("... ignored\n"));
+         GDK_NOTE (EVENTS, g_print ("...ignored\n"));
          break;
        }
 
@@ -2089,7 +2113,7 @@ gdk_event_translate (GdkEvent *event,
        {
          /* Pointer is grabbed with owner_events FALSE */
          GDK_NOTE (EVENTS,
-                   g_print ("grabbed, owner_events FALSE\n"));
+                   g_print ("...grabbed, owner_events FALSE\n"));
          mask = p_grab_event_mask;
          if (!((mask & GDK_POINTER_MOTION_MASK)
                || ((xevent->wParam & (MK_LBUTTON|MK_MBUTTON|MK_RBUTTON))
@@ -2103,7 +2127,7 @@ gdk_event_translate (GdkEvent *event,
            break;
          else
            event->motion.window = (GdkWindow *) p_grab_window;
-         GDK_NOTE (EVENTS, g_print ("sending to %#x\n",
+         GDK_NOTE (EVENTS, g_print ("...sending to %#x\n",
                                     p_grab_window->xwindow));
        }
       else if (window_private
@@ -2122,7 +2146,7 @@ gdk_event_translate (GdkEvent *event,
              && p_grab_owner_events)
            {
              /* Pointer is grabbed wíth owner_events TRUE */
-             GDK_NOTE (EVENTS, g_print ("grabbed, owner_events TRUE, doesn't want it\n"));
+             GDK_NOTE (EVENTS, g_print ("...grabbed, owner_events TRUE, doesn't want it\n"));
              mask = p_grab_event_mask;
              if (!((p_grab_event_mask & GDK_POINTER_MOTION_MASK)
                    || ((xevent->wParam & (MK_LBUTTON|MK_MBUTTON|MK_RBUTTON))
@@ -2137,7 +2161,7 @@ gdk_event_translate (GdkEvent *event,
                break;
              else
                event->motion.window = (GdkWindow *) p_grab_window;
-             GDK_NOTE (EVENTS, g_print ("sending to %#x\n",
+             GDK_NOTE (EVENTS, g_print ("...sending to %#x\n",
                                         p_grab_window->xwindow));
            }
          else
@@ -2156,7 +2180,7 @@ gdk_event_translate (GdkEvent *event,
              window_private = (GdkWindowPrivate *) window;
              ScreenToClient (window_private->xwindow, &pt);
              xevent->lParam = MAKELPARAM (pt.x, pt.y);
-             GDK_NOTE (EVENTS, g_print ("propagating to %#x\n",
+             GDK_NOTE (EVENTS, g_print ("...propagating to %#x\n",
                                         window_private->xwindow));
              goto mousemotion;
            }
@@ -2203,12 +2227,11 @@ gdk_event_translate (GdkEvent *event,
          ScreenToClient (p_grab_window->xwindow, &pt);
          event->motion.x = pt.x;
          event->motion.y = pt.y;
-         GDK_NOTE (EVENTS, g_print ("New coords are +%d+%d\n", pt.x, pt.y));
+         GDK_NOTE (EVENTS, g_print ("...new coords are +%d+%d\n", pt.x, pt.y));
        }
       break;
 
     case WM_NCMOUSEMOVE:
-      /* Print debugging info.  */
       GDK_NOTE (EVENTS,
                g_print ("WM_NCMOUSEMOVE: %#x  x,y: %d %d\n",
                         xevent->hwnd,
@@ -2221,7 +2244,7 @@ gdk_event_translate (GdkEvent *event,
       if (curWnd != NULL
          && (curWnd_private->event_mask & GDK_LEAVE_NOTIFY_MASK))
        {
-         GDK_NOTE (EVENTS, g_print ("synthesizing LEAVE_NOTIFY event\n"));
+         GDK_NOTE (EVENTS, g_print ("...synthesizing LEAVE_NOTIFY event\n"));
 
          event->crossing.type = GDK_LEAVE_NOTIFY;
          event->crossing.window = curWnd;
@@ -2311,9 +2334,12 @@ gdk_event_translate (GdkEvent *event,
       if (window_private->bg_type == GDK_WIN32_BG_PIXEL)
        {
          COLORREF bg;
-         GDK_NOTE (EVENTS, g_print ("... BG_PIXEL %s\n",
-                                    gdk_color_to_string (&window_private->bg_pixel)));
          GetClipBox (hdc, &rect);
+         GDK_NOTE (EVENTS, g_print ("...%dx%d@+%d+%d BG_PIXEL %s\n",
+                                    rect.right - rect.left,
+                                    rect.bottom - rect.top,
+                                    rect.left, rect.top,
+                                    gdk_color_to_string (&window_private->bg_pixel)));
 #ifdef MULTIPLE_WINDOW_CLASSES
          bg = PALETTEINDEX (window_private->bg_pixel.pixel);
 #else
@@ -2323,7 +2349,7 @@ gdk_event_translate (GdkEvent *event,
 #endif
          hbr = CreateSolidBrush (bg);
 #if 0
-         g_print ("... CreateSolidBrush (%.08x) = %.08x\n", bg, hbr);
+         g_print ("...CreateSolidBrush (%.08x) = %.08x\n", bg, hbr);
 #endif
          if (!FillRect (hdc, &rect, hbr))
            g_warning ("WM_ERASEBKGND: FillRect failed");
@@ -2397,7 +2423,7 @@ gdk_event_translate (GdkEvent *event,
        }
       else
        {
-         GDK_NOTE (EVENTS, g_print ("... BLACK_BRUSH (?)\n"));
+         GDK_NOTE (EVENTS, g_print ("...BLACK_BRUSH (?)\n"));
 #ifdef MULTIPLE_WINDOW_CLASSES
          hbr = (HBRUSH) GetClassLong (window_private->xwindow,
                                       GCL_HBRBACKGROUND);
@@ -2411,13 +2437,10 @@ gdk_event_translate (GdkEvent *event,
       break;
 
     case WM_PAINT:
-      GDK_NOTE (EVENTS, g_print ("WM_PAINT: %#x\n", xevent->hwnd));
       hdc = BeginPaint (xevent->hwnd, &paintstruct);
 
-      /* Print debugging info.
-       */
       GDK_NOTE (EVENTS,
-               g_print ("...WM_PAINT: %#x  %dx%d@+%d+%d %s dc %#x\n",
+               g_print ("WM_PAINT: %#x  %dx%d@+%d+%d %s dc %#x\n",
                         xevent->hwnd,
                         paintstruct.rcPaint.right - paintstruct.rcPaint.left,
                         paintstruct.rcPaint.bottom - paintstruct.rcPaint.top,
@@ -2452,11 +2475,18 @@ gdk_event_translate (GdkEvent *event,
       if (LOWORD (xevent->lParam) != HTCLIENT)
        break;
       if (p_grab_window != NULL && p_grab_cursor != NULL)
-       SetCursor (p_grab_cursor);
+       {
+         GDK_NOTE (EVENTS, g_print ("...SetCursor(%#x)\n", p_grab_cursor));
+         SetCursor (p_grab_cursor);
+       }
       else if (window_private
               && !window_private->destroyed
               && window_private->xcursor)
-       SetCursor (window_private->xcursor);
+       {
+         GDK_NOTE (EVENTS, g_print ("...SetCursor(%#x)\n",
+                                    window_private->xcursor));
+         SetCursor (window_private->xcursor);
+       }
       *ret_val_flagp = TRUE;
       *ret_valp = FALSE;
       break;
@@ -2482,8 +2512,6 @@ gdk_event_translate (GdkEvent *event,
 
 #if 1
     case WM_SHOWWINDOW:
-      /* Print debugging info.
-       */
       GDK_NOTE (EVENTS, g_print ("WM_SHOWWINDOW: %#x  %d\n",
                                 xevent->hwnd,
                                 xevent->wParam));
@@ -2507,8 +2535,6 @@ gdk_event_translate (GdkEvent *event,
       break;
 #endif
     case WM_SIZE:
-      /* Print debugging info.
-       */
       GDK_NOTE (EVENTS,
                g_print ("WM_SIZE: %#x  %s %dx%d\n",
                         xevent->hwnd,