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
This commit is contained in:
Руслан Ижбулатов 2016-03-15 10:15:14 +00:00
parent b0131616b2
commit f853283d7b
3 changed files with 30 additions and 2 deletions

View 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;

View 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;

View 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;