[gtk+] win32: Ensure we always send a configure event when changing size/pos



commit 2dbc05f756c9cb28ed2a966489e136bb5746c089
Author: Alexander Larsson <alexl redhat com>
Date:   Wed Oct 26 21:46:19 2011 +0200

    win32: Ensure we always send a configure event when changing size/pos
    
    There are some cases where we don't get a WINDOWPOSCHANGE such that
    we generate a configure event, even if we called gdk_window_move_resize()
    or similar. For instance:
    * The window is fullscreen
    * The window is maximized
    * The specified pos/size is the same as the current one
    
    However, as per X11 ConfigureNotify semantics we *always* want one, or
    we could run into issue like e.g. bug #537296 where we're waiting for
    the CONFIGURE to call gdk_window_thaw_toplevel_updates_libgtk_only().

 gdk/win32/gdkevents-win32.c  |   14 +++++++-----
 gdk/win32/gdkprivate-win32.h |    1 +
 gdk/win32/gdkwindow-win32.c  |   44 +++++++++++++++++++++++++++++++++++++++--
 3 files changed, 50 insertions(+), 9 deletions(-)
---
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index 0182895..ebb36c0 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -1475,21 +1475,23 @@ doesnt_want_char (gint mask,
   return !(mask & (GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK));
 }
 
-static void
-handle_configure_event (MSG       *msg,
-			GdkWindow *window)
+void
+_gdk_win32_emit_configure_event (GdkWindow *window)
 {
   RECT client_rect;
   POINT point;
+  HWND hwnd;
+
+  hwnd = GDK_WINDOW_HWND (window);
 
-  GetClientRect (msg->hwnd, &client_rect);
+  GetClientRect (hwnd, &client_rect);
   point.x = client_rect.left; /* always 0 */
   point.y = client_rect.top;
 
   /* top level windows need screen coords */
   if (gdk_window_get_parent (window) == _gdk_root)
     {
-      ClientToScreen (msg->hwnd, &point);
+      ClientToScreen (hwnd, &point);
       point.x += _gdk_offset_x;
       point.y += _gdk_offset_y;
     }
@@ -2791,7 +2793,7 @@ gdk_event_translate (MSG  *msg,
 	  if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
 	      !IsIconic (msg->hwnd) &&
 	      !GDK_WINDOW_DESTROYED (window))
-	    handle_configure_event (msg, window);
+	    _gdk_win32_emit_configure_event (window);
 
 	  if (window->extension_events != 0)
 	    _gdk_device_wintab_update_window_coords (window);
diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h
index 9ecfc6e..cdba1eb 100644
--- a/gdk/win32/gdkprivate-win32.h
+++ b/gdk/win32/gdkprivate-win32.h
@@ -496,6 +496,7 @@ GdkAtom _gdk_win32_display_manager_atom_intern (GdkDisplayManager *manager,
 gchar *_gdk_win32_display_manager_get_atom_name (GdkDisplayManager *manager, 
 					         GdkAtom            atom);
 void _gdk_win32_append_event (GdkEvent *event);
+void _gdk_win32_emit_configure_event (GdkWindow *window);
 
 /* Initialization */
 void _gdk_win32_windowing_init (void);
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index de66ac9..c1a7858 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -1066,7 +1066,10 @@ gdk_win32_window_move (GdkWindow *window,
   impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
 
   if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
-    return;
+    {
+      _gdk_win32_emit_configure_event (window);
+      return;
+    }
 
   /* Don't check GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD.
    * Foreign windows (another app's windows) might be children of our
@@ -1079,6 +1082,7 @@ gdk_win32_window_move (GdkWindow *window,
   else
     {
       RECT outer_rect;
+      RECT current_rect;
 
       get_outer_rect (window, window->width, window->height, &outer_rect);
 
@@ -1092,6 +1096,14 @@ gdk_win32_window_move (GdkWindow *window,
       API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
                                x - _gdk_offset_x, y - _gdk_offset_y, 0, 0,
                                SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER));
+
+      /* Ensure we always send a configure event, and SetWindowPos doesn't if the window
+	 is maximized, or the position/size doesn't change */
+      GetWindowRect (GDK_WINDOW_HWND (window), &current_rect);
+      if (IsZoomed (GDK_WINDOW_HWND (window)) ||
+	  (current_rect.left == x - _gdk_offset_x &&
+	   current_rect.top == y - _gdk_offset_y))
+	_gdk_win32_emit_configure_event (window);
     }
 }
 
@@ -1117,7 +1129,10 @@ gdk_win32_window_resize (GdkWindow *window,
   impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
 
   if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
-    return;
+    {
+      _gdk_win32_emit_configure_event (window);
+      return;
+    }
 
   if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
     {
@@ -1126,6 +1141,7 @@ gdk_win32_window_resize (GdkWindow *window,
   else
     {
       RECT outer_rect;
+      RECT current_rect;
 
       get_outer_rect (window, width, height, &outer_rect);
 
@@ -1141,6 +1157,14 @@ gdk_win32_window_resize (GdkWindow *window,
                                outer_rect.bottom - outer_rect.top,
                                SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
       window->resize_count += 1;
+
+      /* Ensure we always send a configure event, and SetWindowPos doesn't if the window
+	 is maximized, or the position/size doesn't change */
+      GetWindowRect (GDK_WINDOW_HWND (window), &current_rect);
+      if (IsZoomed (GDK_WINDOW_HWND (window)) ||
+	  (current_rect.right - current_rect.left == outer_rect.right - outer_rect.left &&
+	   current_rect.bottom - current_rect.top == outer_rect.bottom - outer_rect.top))
+	_gdk_win32_emit_configure_event (window);
     }
 }
 
@@ -1166,7 +1190,10 @@ gdk_win32_window_move_resize_internal (GdkWindow *window,
   impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
 
   if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
-    return;
+    {
+      _gdk_win32_emit_configure_event (window);
+      return;
+    }
 
   GDK_NOTE (MISC, g_print ("gdk_win32_window_move_resize: %p: %dx%d %+d%+d\n",
                            GDK_WINDOW_HWND (window),
@@ -1179,6 +1206,7 @@ gdk_win32_window_move_resize_internal (GdkWindow *window,
   else
     {
       RECT outer_rect;
+      RECT current_rect;
 
       get_outer_rect (window, width, height, &outer_rect);
 
@@ -1196,6 +1224,16 @@ gdk_win32_window_move_resize_internal (GdkWindow *window,
                                outer_rect.right - outer_rect.left,
                                outer_rect.bottom - outer_rect.top,
                                SWP_NOACTIVATE | SWP_NOZORDER));
+
+      /* Ensure we always send a configure event, and SetWindowPos doesn't if the window
+	 is maximized, or the position/size doesn't change */
+      GetWindowRect (GDK_WINDOW_HWND (window), &current_rect);
+      if (IsZoomed (GDK_WINDOW_HWND (window)) ||
+	  (current_rect.left == x - _gdk_offset_x &&
+	   current_rect.top == y - _gdk_offset_y &&
+	   current_rect.right - current_rect.left == outer_rect.right - outer_rect.left &&
+	   current_rect.bottom - current_rect.top == outer_rect.bottom - outer_rect.top))
+	_gdk_win32_emit_configure_event (window);
     }
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]