[gtk+/gtk-2-24-win32] win32: Handle all window changes in WINDOWPOSCHANGED



commit 2dfd498fd80dbfcc86c20dc452b1cf799ee11a68
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Oct 25 14:38:16 2011 +0200

    win32: Handle all window changes in WINDOWPOSCHANGED
    
    This moves all the code from WM_SIZE, WM_MOVE, and WM_SHOWWINDOW into
    one place, cleans up the code and makes sure we only send a single
    configure event even if both size and position changes.

 gdk/win32/gdkevents-win32.c |  308 +++++++++++++++++++-----------------------
 1 files changed, 139 insertions(+), 169 deletions(-)
---
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index 36b4ff7..fad9d70 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -76,6 +76,10 @@
 #define MK_XBUTTON2 64
 #endif
 
+/* Undefined flags: */
+#define SWP_NOCLIENTSIZE 0x0800
+#define SWP_NOCLIENTMOVE 0x1000
+#define SWP_STATECHANGED 0x8000
 /* 
  * Private function declarations
  */
@@ -2101,19 +2105,6 @@ gdk_event_translate (MSG  *msg,
 	  GDK_NOTE (EVENTS, g_print (" %d", (int) msg->wParam));
 	  exit (msg->wParam);
 	}
-      else if (msg->message == WM_MOVE ||
-	       msg->message == WM_SIZE)
-	{
-	  /* It's quite normal to get these messages before we have
-	   * had time to register the window in our lookup table, or
-	   * when the window is being destroyed and we already have
-	   * removed it. Repost the same message to our queue so that
-	   * we will get it later when we are prepared.
-	   */
-	  GDK_NOTE (EVENTS, g_print (" (posted)"));
-	
-	  PostMessageW (msg->hwnd, msg->message, msg->wParam, msg->lParam);
-	}
       else if (msg->message == WM_CREATE)
 	{
 	  window = (UNALIGNED GdkWindow*) (((LPCREATESTRUCTW) msg->lParam)->lpCreateParams);
@@ -2849,54 +2840,6 @@ gdk_event_translate (MSG  *msg,
 	}
       break;
 
-    case WM_SHOWWINDOW:
-      GDK_NOTE (EVENTS, g_print (" %s %s",
-				 (msg->wParam ? "YES" : "NO"),
-				 (msg->lParam == 0 ? "ShowWindow" :
-				  (msg->lParam == SW_OTHERUNZOOM ? "OTHERUNZOOM" :
-				   (msg->lParam == SW_OTHERZOOM ? "OTHERZOOM" :
-				    (msg->lParam == SW_PARENTCLOSING ? "PARENTCLOSING" :
-				     (msg->lParam == SW_PARENTOPENING ? "PARENTOPENING" :
-				      "???")))))));
-
-      if (!(((GdkWindowObject *) window)->event_mask & GDK_STRUCTURE_MASK))
-	break;
-
-      if (msg->lParam == SW_OTHERUNZOOM ||
-	  msg->lParam == SW_OTHERZOOM)
-	break;
-
-      if (GDK_WINDOW_DESTROYED (window))
-	break;
-
-      event = gdk_event_new (msg->wParam ? GDK_MAP : GDK_UNMAP);
-      event->any.window = window;
-
-      _gdk_win32_append_event (event);
-
-      if (event->any.type == GDK_UNMAP)
-	{
-	  impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
-
-	  if (impl->transient_owner && GetForegroundWindow () == GDK_WINDOW_HWND (window))
-	    {
-	      SetForegroundWindow (GDK_WINDOW_HWND (impl->transient_owner));
-	    }
-
-	  grab = _gdk_display_get_last_pointer_grab (_gdk_display);
-	  if (grab != NULL)
-	    {
-	      if (grab->window == window)
-		gdk_pointer_ungrab (msg->time);
-	    }
-
-	  if (_gdk_display->keyboard_grab.window == window)
-	    gdk_keyboard_ungrab (msg->time);
-	}
-
-      return_val = TRUE;
-      break;
-
     case WM_SYSCOMMAND:
       switch (msg->wParam)
 	{
@@ -2908,77 +2851,6 @@ gdk_event_translate (MSG  *msg,
 
       break;
 
-    case WM_SIZE:
-      GDK_NOTE (EVENTS,
-		g_print (" %s %dx%d",
-			 (msg->wParam == SIZE_MAXHIDE ? "MAXHIDE" :
-			  (msg->wParam == SIZE_MAXIMIZED ? "MAXIMIZED" :
-			   (msg->wParam == SIZE_MAXSHOW ? "MAXSHOW" :
-			    (msg->wParam == SIZE_MINIMIZED ? "MINIMIZED" :
-			     (msg->wParam == SIZE_RESTORED ? "RESTORED" : "?"))))),
-			 LOWORD (msg->lParam), HIWORD (msg->lParam)));
-
-      if (msg->wParam == SIZE_MINIMIZED)
-	{
-	  /* Don't generate any GDK event. This is *not* an UNMAP. */
-	  grab = _gdk_display_get_last_pointer_grab (_gdk_display);
-	  if (grab != NULL)
-	    {
-	      if (grab->window == window)
-		gdk_pointer_ungrab (msg->time);
-	    }
-	  if (_gdk_display->keyboard_grab.window == window)
-	    gdk_keyboard_ungrab (msg->time);
-
-	  gdk_synthesize_window_state (window,
-				       GDK_WINDOW_STATE_WITHDRAWN,
-				       GDK_WINDOW_STATE_ICONIFIED);
-	  do_show_window (window, TRUE);
-	}
-      else if ((msg->wParam == SIZE_RESTORED ||
-		msg->wParam == SIZE_MAXIMIZED) &&
-	       GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD)
-	{
-	  GdkWindowState withdrawn_bit =
-	    IsWindowVisible (msg->hwnd) ? GDK_WINDOW_STATE_WITHDRAWN : 0;
-
-	  if (((GdkWindowObject *) window)->state & GDK_WINDOW_STATE_ICONIFIED)
-	    ensure_stacking_on_unminimize (msg);
-
-	  if (!GDK_WINDOW_DESTROYED (window))
-	    handle_configure_event (msg, window);
-	  
-	  if (msg->wParam == SIZE_RESTORED)
-	    {
-	      gdk_synthesize_window_state (window,
-					   GDK_WINDOW_STATE_ICONIFIED |
-					   GDK_WINDOW_STATE_MAXIMIZED |
-					   withdrawn_bit,
-					   0);
-
-	      if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_TEMP && !GDK_WINDOW_IS_MAPPED (window))
-		{
-		  do_show_window (window, FALSE);
-		}
-	    }
-	  else if (msg->wParam == SIZE_MAXIMIZED)
-	    {
-	      gdk_synthesize_window_state (window,
-					   GDK_WINDOW_STATE_ICONIFIED |
-					   withdrawn_bit,
-					   GDK_WINDOW_STATE_MAXIMIZED);
-	    }
-
-	  if (((GdkWindowObject *) window)->resize_count > 1)
-	    ((GdkWindowObject *) window)->resize_count -= 1;
-	  
-	  if (((GdkWindowObject *) window)->extension_events != 0)
-	    _gdk_input_configure_event (window);
-
-	  return_val = TRUE;
-	}
-      break;
-
     case WM_ENTERSIZEMOVE:
     case WM_ENTERMENULOOP:
       _gdk_win32_begin_modal_call ();
@@ -3018,36 +2890,148 @@ gdk_event_translate (MSG  *msg,
 				      buf))))),
 				 windowpos->cx, windowpos->cy, windowpos->x, windowpos->y));
 
-      /* If position and size haven't changed, don't do anything */
-      if (_modal_operation_in_progress &&
-	  (windowpos->flags & SWP_NOMOVE) &&
-	  (windowpos->flags & SWP_NOSIZE))
-	break;
-
-      /* Once we've entered the moving or sizing modal loop, we won't
-       * return to the main loop until we're done sizing or moving.
-       */
-      if (_modal_operation_in_progress &&
-	 GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
-	 !GDK_WINDOW_DESTROYED (window))
+      if (_modal_operation_in_progress)
 	{
-	  if (((GdkWindowObject *) window)->event_mask & GDK_STRUCTURE_MASK)
+	  /* If position and size haven't changed, don't do anything */
+	  if ((windowpos->flags & SWP_NOMOVE) &&
+	      (windowpos->flags & SWP_NOSIZE))
+	    break;
+
+	  /* Once we've entered the moving or sizing modal loop, we won't
+	   * return to the main loop until we're done sizing or moving.
+	   */
+	  if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
+	      !GDK_WINDOW_DESTROYED (window))
 	    {
-	      GDK_NOTE (EVENTS, g_print (" do magic"));
-	      if (((GdkWindowObject *) window)->resize_count > 1)
-		((GdkWindowObject *) window)->resize_count -= 1;
+	      if (((GdkWindowObject *) window)->event_mask & GDK_STRUCTURE_MASK)
+		{
+		  GDK_NOTE (EVENTS, g_print (" do magic"));
+		  if (((GdkWindowObject *) window)->resize_count > 1)
+		    ((GdkWindowObject *) window)->resize_count -= 1;
 
-	      handle_configure_event (msg, window);
-	      g_main_context_iteration (NULL, FALSE);
+		  handle_configure_event (msg, window);
+		  g_main_context_iteration (NULL, FALSE);
 #if 0
-	      /* Dispatch main loop - to realize resizes... */
-	      modal_timer_proc (msg->hwnd, msg->message, 0, msg->time);
+		  /* Dispatch main loop - to realize resizes... */
+		  modal_timer_proc (msg->hwnd, msg->message, 0, msg->time);
 #endif
-	      /* Claim as handled, so that WM_SIZE and WM_MOVE are avoided */
-	      return_val = TRUE;
-	      *ret_valp = 1;
+		  /* Claim as handled, so that WM_SIZE and WM_MOVE are avoided */
+		  return_val = TRUE;
+		  *ret_valp = 1;
+		}
 	    }
 	}
+      else /* !_modal_operation_in_progress */
+	{
+	  /* Break grabs on unmap or minimize */
+	  if (windowpos->flags & SWP_HIDEWINDOW || 
+	      ((windowpos->flags & SWP_STATECHANGED) && IsIconic (msg->hwnd)))
+	    {
+	      grab = _gdk_display_get_last_pointer_grab (_gdk_display);
+	      if (grab != NULL)
+		{
+		  if (grab->window == window)
+		    gdk_pointer_ungrab (msg->time);
+		}
+
+	      if (_gdk_display->keyboard_grab.window == window)
+		gdk_keyboard_ungrab (msg->time);
+	    }
+
+	  /* Send MAP events  */
+	  if ((windowpos->flags & SWP_SHOWWINDOW) &&
+	      !GDK_WINDOW_DESTROYED (window))
+	    {
+	      event = gdk_event_new (GDK_MAP);
+	      event->any.window = window;
+	      _gdk_win32_append_event (event);
+	    }
+
+	  /* New size or position => configure event */
+	  if (!(windowpos->flags & SWP_NOCLIENTMOVE) ||
+	      !(windowpos->flags & SWP_NOCLIENTSIZE))
+	    {
+	      if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
+		  !IsIconic (msg->hwnd) &&
+		  !GDK_WINDOW_DESTROYED (window))
+		handle_configure_event (msg, window);
+
+	      if (((GdkWindowObject *) window)->extension_events != 0)
+		_gdk_input_configure_event (window);
+	    }
+
+	  if ((windowpos->flags & SWP_HIDEWINDOW) &&
+	      !GDK_WINDOW_DESTROYED (window))
+	    {
+	      /* Send UNMAP events  */
+	      event = gdk_event_new (GDK_UNMAP);
+	      event->any.window = window;
+	      _gdk_win32_append_event (event);
+
+	      /* Make transient parent the forground window when window unmaps */
+	      impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
+
+	      if (impl->transient_owner && 
+		  GetForegroundWindow () == GDK_WINDOW_HWND (window))
+		SetForegroundWindow (GDK_WINDOW_HWND (impl->transient_owner));
+	    }
+
+	  /* Update window state */
+	  if (windowpos->flags & (SWP_STATECHANGED | SWP_SHOWWINDOW | SWP_HIDEWINDOW))
+	    {
+	      GdkWindowState set_bits, unset_bits, old_state, new_state;
+
+	      old_state = GDK_WINDOW_OBJECT (window)->state;
+
+	      set_bits = 0;
+	      unset_bits = 0;
+
+	      if (IsWindowVisible (msg->hwnd))
+		unset_bits |= GDK_WINDOW_STATE_WITHDRAWN;
+	      else
+		set_bits |= GDK_WINDOW_STATE_WITHDRAWN;
+
+	      if (IsIconic (msg->hwnd))
+		set_bits |= GDK_WINDOW_STATE_ICONIFIED;
+	      else
+		unset_bits |= GDK_WINDOW_STATE_ICONIFIED;
+
+	      if (IsZoomed (msg->hwnd))
+		set_bits |= GDK_WINDOW_STATE_MAXIMIZED;
+	      else
+		unset_bits |= GDK_WINDOW_STATE_MAXIMIZED;
+
+
+	      gdk_synthesize_window_state (window, unset_bits, set_bits);
+
+	      new_state = GDK_WINDOW_OBJECT (window)->state;
+
+	      /* Whenever one window changes iconified state we need to also
+	       * change the iconified state in all transient related windows,
+	       * as windows doesn't give icons for transient childrens. 
+	       */
+	      if ((old_state & GDK_WINDOW_STATE_ICONIFIED) != 
+		  (new_state & GDK_WINDOW_STATE_ICONIFIED))
+		do_show_window (window, (new_state & GDK_WINDOW_STATE_ICONIFIED));
+
+
+	      /* When un-minimizing, make sure we're stacked under any 
+		 transient-type windows. */
+	      if (!(old_state & GDK_WINDOW_STATE_ICONIFIED) &&
+		  (new_state & GDK_WINDOW_STATE_ICONIFIED))
+		ensure_stacking_on_unminimize (msg);
+	    }
+
+	  if (!(windowpos->flags & SWP_NOCLIENTSIZE))
+	    {
+	      if (((GdkWindowObject *) window)->resize_count > 1)
+		((GdkWindowObject *) window)->resize_count -= 1;
+	    }
+
+	  /* Claim as handled, so that WM_SIZE and WM_MOVE are avoided */
+	  return_val = TRUE;
+	  *ret_valp = 0;
+	}
       break;
 
     case WM_SIZING:
@@ -3321,20 +3305,6 @@ gdk_event_translate (MSG  *msg,
 	}
       break;
 
-    case WM_MOVE:
-      GDK_NOTE (EVENTS, g_print (" (%d,%d)",
-				 GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
-
-      if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
-	  !IsIconic (msg->hwnd))
-	{
-	  if (!GDK_WINDOW_DESTROYED (window))
-	    handle_configure_event (msg, window);
-
-	  return_val = TRUE;
-	}
-      break;
-
     case WM_CLOSE:
       if (GDK_WINDOW_DESTROYED (window))
 	break;



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