GDK W32: Add/subtract shadow when drag-resizing
authorРуслан Ижбулатов <lrn1986@gmail.com>
Tue, 15 Mar 2016 10:15:14 +0000 (10:15 +0000)
committerРуслан Ижбулатов <lrn1986@gmail.com>
Wed, 30 Mar 2016 09:03:56 +0000 (09:03 +0000)
Implements gdk_win32_window_set_shadow_width().
Uses shadow width/height to adjust max tracking size, allowing
windows to be drag-resized to cover the whole desktop.

Also uses SM_C*VIRTUALSCREEN instead of SM_C*MAXTRACK.

https://bugzilla.gnome.org/show_bug.cgi?id=763013

gdk/win32/gdkevents-win32.c
gdk/win32/gdkwindow-win32.c
gdk/win32/gdkwindow-win32.h

index 0ee314e52ae2d0eb2d35ec92ad31779c7dcb5f05..c6f6a243cd67b6ca3bc91417796f68acaff6ca79 100644 (file)
@@ -2044,8 +2044,8 @@ _gdk_win32_window_fill_min_max_info (GdkWindow  *window,
           mmi->ptMaxSize.y = nearest_info.rcWork.bottom - nearest_info.rcWork.top;
         }
 
-      mmi->ptMaxTrackSize.x = GetSystemMetrics (SM_CXMAXTRACK);
-      mmi->ptMaxTrackSize.y = GetSystemMetrics (SM_CYMAXTRACK);
+      mmi->ptMaxTrackSize.x = GetSystemMetrics (SM_CXVIRTUALSCREEN) + impl->margins_x;
+      mmi->ptMaxTrackSize.y = GetSystemMetrics (SM_CYVIRTUALSCREEN) + impl->margins_y;
     }
 
   return TRUE;
index 1446da9aa8dc3510a7212582c6dbc8eb6fc400d6..061192410acf25c123ff937c71d43660ecb5710c 100644 (file)
@@ -5764,6 +5764,26 @@ GtkShowWindow (HWND hwnd,
   return ShowWindow (hwnd, cmd_show);
 }
 
+static void
+gdk_win32_window_set_shadow_width (GdkWindow *window,
+                                   gint       left,
+                                   gint       right,
+                                   gint       top,
+                                   gint       bottom)
+{
+  GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
+
+  if (GDK_WINDOW_DESTROYED (window))
+    return;
+
+  impl->margins.left = left;
+  impl->margins.right = right;
+  impl->margins.top = top;
+  impl->margins.bottom = bottom;
+  impl->margins_x = left + right;
+  impl->margins_y = top + bottom;
+}
+
 static void
 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
 {
@@ -5840,6 +5860,7 @@ gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
   impl_class->get_decorations = gdk_win32_window_get_decorations;
   impl_class->set_functions = gdk_win32_window_set_functions;
 
+  impl_class->set_shadow_width = gdk_win32_window_set_shadow_width;
   impl_class->begin_resize_drag = gdk_win32_window_begin_resize_drag;
   impl_class->begin_move_drag = gdk_win32_window_begin_move_drag;
   impl_class->set_opacity = gdk_win32_window_set_opacity;
index 7eca54f6985200045a861c3f7d2d72382601faf7..a4ab10a0e8e2703610578f5a1b43d073775a2f2a 100644 (file)
@@ -244,6 +244,13 @@ struct _GdkWindowImplWin32
   gint initial_x;
   gint initial_y;
 
+  /* left/right/top/bottom width of the shadow/resize-grip around the window */
+  RECT margins;
+
+  /* left+right and top+bottom from @margins */
+  gint margins_x;
+  gint margins_y;
+
   guint no_bg : 1;
   guint inhibit_configure : 1;
   guint override_redirect : 1;