Module: wine Branch: master Commit: dd59ab26fe83176f71979f624490a682bb22cb16 URL: http://source.winehq.org/git/wine.git/?a=commit;h=dd59ab26fe83176f71979f6244...
Author: Ken Thomases ken@codeweavers.com Date: Tue Oct 8 02:21:24 2013 -0500
winemac: Only update window minimized state when it has changed from what processed events told us it was.
This fixes a problem where windows could spontaneously re-minimize after being unminimized. Cocoa would see the window unminimize. It would queue a WINDOW_DID_UNMINIMIZE event. While that event was pending, Wine might do something which caused set_cocoa_window_properties() to be called and tell Cocoa to conform itself to the current Win32 state. The current Win32 state still had the window minimized, so Cocoa would re-minimize the window. It would even discard the WINDOW_DID_UNMINIMIZE event.
---
dlls/winemac.drv/cocoa_window.m | 33 ++++++++++++++++++--------------- dlls/winemac.drv/macdrv_cocoa.h | 1 + dlls/winemac.drv/window.c | 4 +++- 3 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 0726964..ede86d5 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -685,23 +685,26 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) } [self setCollectionBehavior:behavior];
- pendingMinimize = FALSE; - if (state->minimized && ![self isMiniaturized]) + if (state->minimized_valid) { - if ([self isVisible]) - [super miniaturize:nil]; - else - pendingMinimize = TRUE; - } - else if (!state->minimized && [self isMiniaturized]) - { - ignore_windowDeminiaturize = TRUE; - [self deminiaturize:nil]; - } + pendingMinimize = FALSE; + if (state->minimized && ![self isMiniaturized]) + { + if ([self isVisible]) + [super miniaturize:nil]; + else + pendingMinimize = TRUE; + } + else if (!state->minimized && [self isMiniaturized]) + { + ignore_windowDeminiaturize = TRUE; + [self deminiaturize:nil]; + }
- /* Whatever events regarding minimization might have been in the queue are now stale. */ - [queue discardEventsMatchingMask:event_mask_for_type(WINDOW_DID_UNMINIMIZE) - forWindow:self]; + /* Whatever events regarding minimization might have been in the queue are now stale. */ + [queue discardEventsMatchingMask:event_mask_for_type(WINDOW_DID_UNMINIMIZE) + forWindow:self]; + } }
- (BOOL) addChildWineWindow:(WineWindow*)child assumeVisible:(BOOL)assumeVisible diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 789e46d..63f537e 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -362,6 +362,7 @@ struct macdrv_window_state { unsigned int excluded_by_expose:1; unsigned int excluded_by_cycle:1; unsigned int minimized:1; + unsigned int minimized_valid:1; };
extern macdrv_window macdrv_create_cocoa_window(const struct macdrv_window_features* wf, diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index 2c71a1e..efd63d1 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -115,6 +115,7 @@ static void get_cocoa_window_state(struct macdrv_win_data *data, if (IsRectEmpty(&data->window_rect)) state->excluded_by_expose = TRUE; state->minimized = (style & WS_MINIMIZE) != 0; + state->minimized_valid = state->minimized != data->minimized; }
@@ -312,7 +313,8 @@ static void set_cocoa_window_properties(struct macdrv_win_data *data)
get_cocoa_window_state(data, style, ex_style, &state); macdrv_set_cocoa_window_state(data->cocoa_window, &state); - data->minimized = state.minimized; + if (state.minimized_valid) + data->minimized = state.minimized; }