[gtk+] GDK W32: Add/subtract shadow when drag-resizing



commit f853283d7b9f173d429aa49e2e976f0d23ef5c40
Author: Руслан Ижбулатов <lrn1986 gmail com>
Date:   Tue Mar 15 10:15:14 2016 +0000

    GDK W32: Add/subtract shadow when drag-resizing
    
    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 |    4 ++--
 gdk/win32/gdkwindow-win32.c |   21 +++++++++++++++++++++
 gdk/win32/gdkwindow-win32.h |    7 +++++++
 3 files changed, 30 insertions(+), 2 deletions(-)
---
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index 0ee314e..c6f6a24 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -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;
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index 1446da9..0611924 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -5765,6 +5765,26 @@ GtkShowWindow (HWND hwnd,
 }
 
 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)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (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;
diff --git a/gdk/win32/gdkwindow-win32.h b/gdk/win32/gdkwindow-win32.h
index 7eca54f..a4ab10a 100644
--- a/gdk/win32/gdkwindow-win32.h
+++ b/gdk/win32/gdkwindow-win32.h
@@ -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;


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