Ken Thomases : winemac: During live resize, force occasional redisplay due to spontaneous redrawing.

Alexandre Julliard julliard at winehq.org
Tue Apr 2 13:38:36 CDT 2013


Module: wine
Branch: master
Commit: 94dc91a45dcbfcee93d7b60c253eb1885dc8ee6c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=94dc91a45dcbfcee93d7b60c253eb1885dc8ee6c

Author: Ken Thomases <ken at 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 ----------




More information about the wine-cvs mailing list