Module: wine Branch: master Commit: 49bb11fef2ddc8c6c70bf28aefad0818eefca576 URL: http://source.winehq.org/git/wine.git/?a=commit;h=49bb11fef2ddc8c6c70bf28aef...
Author: Ken Thomases ken@codeweavers.com Date: Mon Apr 24 13:07:10 2017 -0500
winemac: Move a window to the front when its Mac title bar is clicked.
Cocoa does this automatically for non-owned windows and informs the back end via a different mechanism (WINDOW_BROUGHT_FORWARD). However, for owned windows (child windows in Cocoa parlance), Cocoa does not change their z-order relative to the owner (parent) or sibling owned windows when clicked. So, we have to move the window in user32's z-order so that it gets moved appropriately on screen in response.
Signed-off-by: Ken Thomases ken@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winemac.drv/cocoa_app.m | 2 ++ dlls/winemac.drv/cocoa_window.m | 7 ++++--- dlls/winemac.drv/event.c | 2 +- dlls/winemac.drv/macdrv.h | 2 +- dlls/winemac.drv/macdrv_cocoa.h | 3 +++ dlls/winemac.drv/window.c | 14 +++++++++++++- 6 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index f13e496..0caca9e 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -2023,6 +2023,8 @@ static NSString* WineLocalizedString(unsigned int stringID) [self updateCursorClippingState];
event = macdrv_create_event(eventType, window); + if (eventType == WINDOW_DRAG_BEGIN) + event->window_drag_begin.no_activate = [NSEvent wine_commandKeyDown]; [window.queue postEvent:event]; macdrv_release_event(event); } diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index c67dd07..6257169 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -2236,9 +2236,10 @@ static CVReturn WineDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTi
if (draggingPhase == 2) { - macdrv_event* event = macdrv_create_event(WINDOW_DRAG_BEGIN, self); - [queue postEvent:event]; - macdrv_release_event(event); + macdrv_event* mevent = macdrv_create_event(WINDOW_DRAG_BEGIN, self); + mevent->window_drag_begin.no_activate = [event wine_commandKeyDown]; + [queue postEvent:mevent]; + macdrv_release_event(mevent);
draggingPhase = 3; } diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c index 26d2b64..7ec59c0 100644 --- a/dlls/winemac.drv/event.c +++ b/dlls/winemac.drv/event.c @@ -279,7 +279,7 @@ void macdrv_handle_event(const macdrv_event *event) macdrv_window_did_unminimize(hwnd); break; case WINDOW_DRAG_BEGIN: - macdrv_window_drag_begin(hwnd); + macdrv_window_drag_begin(hwnd, event); break; case WINDOW_DRAG_END: macdrv_window_drag_end(hwnd); diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index bffd555..53dcd87 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -174,7 +174,7 @@ extern void macdrv_window_did_unminimize(HWND hwnd) DECLSPEC_HIDDEN; extern void macdrv_window_brought_forward(HWND hwnd) DECLSPEC_HIDDEN; extern void macdrv_window_resize_ended(HWND hwnd) DECLSPEC_HIDDEN; extern void macdrv_window_restore_requested(HWND hwnd, const macdrv_event *event) DECLSPEC_HIDDEN; -extern void macdrv_window_drag_begin(HWND hwnd) DECLSPEC_HIDDEN; +extern void macdrv_window_drag_begin(HWND hwnd, const macdrv_event *event) DECLSPEC_HIDDEN; extern void macdrv_window_drag_end(HWND hwnd) DECLSPEC_HIDDEN; extern void macdrv_reassert_window_position(HWND hwnd) DECLSPEC_HIDDEN; extern BOOL query_resize_size(HWND hwnd, macdrv_query *query) DECLSPEC_HIDDEN; diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index e016b3e..3ffeb01 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -376,6 +376,9 @@ typedef struct macdrv_event { macdrv_status_item item; } status_item_mouse_move; struct { + int no_activate; + } window_drag_begin; + struct { CGRect frame; int fullscreen; int in_resize; diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index 83c77a9..e2de40d 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -2482,7 +2482,7 @@ void macdrv_window_restore_requested(HWND hwnd, const macdrv_event *event) * * Handler for WINDOW_DRAG_BEGIN events. */ -void macdrv_window_drag_begin(HWND hwnd) +void macdrv_window_drag_begin(HWND hwnd, const macdrv_event *event) { DWORD style = GetWindowLongW(hwnd, GWL_STYLE); struct macdrv_win_data *data; @@ -2499,6 +2499,18 @@ void macdrv_window_drag_begin(HWND hwnd) data->being_dragged = TRUE; release_win_data(data);
+ if (!event->window_drag_begin.no_activate && can_activate_window(hwnd) && GetForegroundWindow() != hwnd) + { + /* ask whether the window wants to be activated */ + LRESULT ma = SendMessageW(hwnd, WM_MOUSEACTIVATE, (WPARAM)GetAncestor(hwnd, GA_ROOT), + MAKELONG(HTCAPTION, WM_LBUTTONDOWN)); + if (ma != MA_NOACTIVATEANDEAT && ma != MA_NOACTIVATE) + { + TRACE("setting foreground window to %p\n", hwnd); + SetForegroundWindow(hwnd); + } + } + ClipCursor(NULL); SendMessageW(hwnd, WM_ENTERSIZEMOVE, 0, 0); ReleaseCapture();