Module: wine
Branch: master
Commit: 94dc91a45dcbfcee93d7b60c253eb1885dc8ee6c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=94dc91a45dcbfcee93d7b60c2…
Author: Ken Thomases <ken(a)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 ----------