Module: wine Branch: master Commit: 4d9340eb41b0bbca1c801e032d0440a2257678aa URL: http://source.winehq.org/git/wine.git/?a=commit;h=4d9340eb41b0bbca1c801e032d...
Author: Ken Thomases ken@codeweavers.com Date: Tue Oct 8 02:21:29 2013 -0500
winemac: Update the window min/max size info and enforce it when zooming.
---
dlls/winemac.drv/cocoa_window.m | 41 +++++++++++++++++++++++++++++++++++++++ dlls/winemac.drv/event.c | 4 +++ dlls/winemac.drv/macdrv.h | 1 + dlls/winemac.drv/macdrv_cocoa.h | 1 + dlls/winemac.drv/window.c | 13 ++++++++++++ 5 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 9b3fa9d..380469c 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -1616,6 +1616,47 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) forMode:NSRunLoopCommonModes]; }
+ - (NSRect) windowWillUseStandardFrame:(NSWindow*)window defaultFrame:(NSRect)proposedFrame + { + macdrv_query* query; + NSRect currentContentRect, proposedContentRect, newContentRect, screenRect; + NSSize maxSize; + + query = macdrv_create_query(); + query->type = QUERY_MIN_MAX_INFO; + query->window = (macdrv_window)[self retain]; + [self.queue query:query timeout:0.5]; + macdrv_release_query(query); + + currentContentRect = [self contentRectForFrameRect:[self frame]]; + proposedContentRect = [self contentRectForFrameRect:proposedFrame]; + + maxSize = [self contentMaxSize]; + newContentRect.size.width = MIN(NSWidth(proposedContentRect), maxSize.width); + newContentRect.size.height = MIN(NSHeight(proposedContentRect), maxSize.height); + + // Try to keep the top-left corner where it is. + newContentRect.origin.x = NSMinX(currentContentRect); + newContentRect.origin.y = NSMaxY(currentContentRect) - NSHeight(newContentRect); + + // If that pushes the bottom or right off the screen, pull it up and to the left. + screenRect = [self contentRectForFrameRect:[[self screen] visibleFrame]]; + if (NSMaxX(newContentRect) > NSMaxX(screenRect)) + newContentRect.origin.x = NSMaxX(screenRect) - NSWidth(newContentRect); + if (NSMinY(newContentRect) < NSMinY(screenRect)) + newContentRect.origin.y = NSMinY(screenRect); + + // If that pushes the top or left off the screen, push it down and the right + // again. Do this last because the top-left corner is more important than the + // bottom-right. + if (NSMinX(newContentRect) < NSMinX(screenRect)) + newContentRect.origin.x = NSMinX(screenRect); + if (NSMaxY(newContentRect) > NSMaxY(screenRect)) + newContentRect.origin.y = NSMaxY(screenRect) - NSHeight(newContentRect); + + return [self frameRectForContentRect:newContentRect]; + } +
/* * ---------- NSPasteboardOwner methods ---------- diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c index 515671e..b9b9778 100644 --- a/dlls/winemac.drv/event.c +++ b/dlls/winemac.drv/event.c @@ -158,6 +158,10 @@ static void macdrv_query_event(HWND hwnd, const macdrv_event *event) TRACE("QUERY_RESIZE_START\n"); success = query_resize_start(hwnd); break; + case QUERY_MIN_MAX_INFO: + TRACE("QUERY_MIN_MAX_INFO\n"); + success = query_min_max_info(hwnd); + break; default: FIXME("unrecognized query type %d\n", query->type); break; diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index e2a54cc..4a7e259 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -164,6 +164,7 @@ extern void macdrv_window_minimize_requested(HWND hwnd) DECLSPEC_HIDDEN; extern void macdrv_window_did_unminimize(HWND hwnd) DECLSPEC_HIDDEN; extern BOOL query_resize_end(HWND hwnd) DECLSPEC_HIDDEN; extern BOOL query_resize_start(HWND hwnd) DECLSPEC_HIDDEN; +extern BOOL query_min_max_info(HWND hwnd) DECLSPEC_HIDDEN;
extern void macdrv_mouse_button(HWND hwnd, const macdrv_event *event) DECLSPEC_HIDDEN; extern void macdrv_mouse_moved(HWND hwnd, const macdrv_event *event) DECLSPEC_HIDDEN; diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 63f537e..d99a5ec 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -287,6 +287,7 @@ enum { QUERY_PASTEBOARD_DATA, QUERY_RESIZE_END, QUERY_RESIZE_START, + QUERY_MIN_MAX_INFO, NUM_QUERY_TYPES };
diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index efd63d1..1afe294 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -2048,3 +2048,16 @@ BOOL query_resize_end(HWND hwnd) SendMessageW(hwnd, WM_EXITSIZEMOVE, 0, 0); return TRUE; } + + +/*********************************************************************** + * query_min_max_info + * + * Handler for QUERY_MIN_MAX_INFO query. + */ +BOOL query_min_max_info(HWND hwnd) +{ + TRACE("hwnd %p\n", hwnd); + sync_window_min_max_info(hwnd); + return TRUE; +}