Module: wine Branch: master Commit: 94dc91a45dcbfcee93d7b60c253eb1885dc8ee6c URL: http://source.winehq.org/git/wine.git/?a=commit;h=94dc91a45dcbfcee93d7b60c25...
Author: Ken Thomases ken@codeweavers.com Date: Tue Apr 2 03:17:48 2013 -0500
winemac: During live resize, force occasional redisplay due to spontaneous redrawing.
---
dlls/winemac.drv/cocoa_window.h | 2 ++ dlls/winemac.drv/cocoa_window.m | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h index ea7988d..c76f735 100644 --- a/dlls/winemac.drv/cocoa_window.h +++ b/dlls/winemac.drv/cocoa_window.h @@ -52,6 +52,8 @@
NSInteger levelWhenActive;
+ NSTimer* liveResizeDisplayTimer; + BOOL causing_becomeKeyWindow; BOOL ignore_windowMiniaturize; BOOL ignore_windowDeminiaturize; diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 1d5c551..68644fa 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -350,6 +350,8 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
- (void) dealloc { + [liveResizeDisplayTimer invalidate]; + [liveResizeDisplayTimer release]; [queue release]; [latentParentWindow release]; [shape release]; @@ -1115,6 +1117,13 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) [NSApp wineWindow:self ordered:NSWindowAbove relativeTo:nil]; }
+ - (void) windowDidEndLiveResize:(NSNotification *)notification + { + [liveResizeDisplayTimer invalidate]; + [liveResizeDisplayTimer release]; + liveResizeDisplayTimer = nil; + } + - (void)windowDidMove:(NSNotification *)notification { [self windowDidResize:notification]; @@ -1176,6 +1185,34 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) ignore_windowMiniaturize = FALSE; }
+ - (void) windowWillStartLiveResize:(NSNotification *)notification + { + // There's a strange restriction in window redrawing during Cocoa- + // managed window resizing. Only calls to -[NSView setNeedsDisplay...] + // that happen synchronously when Cocoa tells us that our window size + // has changed or asynchronously in a short interval thereafter provoke + // the window to redraw. Calls to those methods that happen asynchronously + // a half second or more after the last change of the window size aren't + // heeded until the next resize-related user event (e.g. mouse movement). + // + // Wine often has a significant delay between when it's been told that + // the window has changed size and when it can flush completed drawing. + // So, our windows would get stuck with incomplete drawing for as long + // as the user holds the mouse button down and doesn't move it. + // + // We address this by "manually" asking our windows to check if they need + // redrawing every so often (during live resize only). + [self windowDidEndLiveResize:nil]; + liveResizeDisplayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 + target:self + selector:@selector(displayIfNeeded) + userInfo:nil + repeats:YES]; + [liveResizeDisplayTimer retain]; + [[NSRunLoop currentRunLoop] addTimer:liveResizeDisplayTimer + forMode:NSRunLoopCommonModes]; + } +
/* * ---------- NSPasteboardOwner methods ----------