Ken Thomases : winemac: Allow for processing Cocoa events while waiting for query results.

Alexandre Julliard julliard at winehq.org
Thu Mar 14 14:55:05 CDT 2013


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

Author: Ken Thomases <ken at codeweavers.com>
Date:   Wed Mar 13 16:52:57 2013 -0500

winemac: Allow for processing Cocoa events while waiting for query results.

---

 dlls/winemac.drv/cocoa_app.h   |    7 ++++++-
 dlls/winemac.drv/cocoa_app.m   |   16 ++++++++++++++--
 dlls/winemac.drv/cocoa_event.h |    1 +
 dlls/winemac.drv/cocoa_event.m |   22 ++++++++++++++++++++--
 dlls/winemac.drv/event.c       |    3 ++-
 5 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_app.h b/dlls/winemac.drv/cocoa_app.h
index 67f75e1..e15d734 100644
--- a/dlls/winemac.drv/cocoa_app.h
+++ b/dlls/winemac.drv/cocoa_app.h
@@ -26,6 +26,11 @@
 #define ERR(...) do { if (macdrv_err_on) LogError(__func__, __VA_ARGS__); } while (false)
 
 
+enum {
+    WineApplicationEventWakeQuery,
+};
+
+
 @class WineEventQueue;
 @class WineWindow;
 
@@ -87,7 +92,7 @@
 
     - (void) windowGotFocus:(WineWindow*)window;
 
-    - (BOOL) waitUntilQueryDone:(int*)done timeout:(NSDate*)timeout;
+    - (BOOL) waitUntilQueryDone:(int*)done timeout:(NSDate*)timeout processEvents:(BOOL)processEvents;
 
     - (void) keyboardSelectionDidChange;
 
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m
index 5dc3008..7ee009d 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -172,13 +172,25 @@ int macdrv_err_on;
         }
     }
 
-    - (BOOL) waitUntilQueryDone:(int*)done timeout:(NSDate*)timeout
+    - (BOOL) waitUntilQueryDone:(int*)done timeout:(NSDate*)timeout processEvents:(BOOL)processEvents
     {
         PerformRequest(NULL);
 
         do
         {
-            [[NSRunLoop currentRunLoop] runMode:WineAppWaitQueryResponseMode beforeDate:timeout];
+            if (processEvents)
+            {
+                NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+                NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask
+                                                    untilDate:timeout
+                                                       inMode:NSDefaultRunLoopMode
+                                                      dequeue:YES];
+                if (event)
+                    [NSApp sendEvent:event];
+                [pool release];
+            }
+            else
+                [[NSRunLoop currentRunLoop] runMode:WineAppWaitQueryResponseMode beforeDate:timeout];
         } while (!*done && [timeout timeIntervalSinceNow] >= 0);
 
         return *done;
diff --git a/dlls/winemac.drv/cocoa_event.h b/dlls/winemac.drv/cocoa_event.h
index 56964da..e74875e 100644
--- a/dlls/winemac.drv/cocoa_event.h
+++ b/dlls/winemac.drv/cocoa_event.h
@@ -36,6 +36,7 @@
     - (void) postEvent:(const macdrv_event*)inEvent;
     - (void) discardEventsMatchingMask:(macdrv_event_mask)mask forWindow:(NSWindow*)window;
 
+    - (BOOL) query:(macdrv_query*)query timeout:(NSTimeInterval)timeout processEvents:(BOOL)processEvents;
     - (BOOL) query:(macdrv_query*)query timeout:(NSTimeInterval)timeout;
 
 @end
diff --git a/dlls/winemac.drv/cocoa_event.m b/dlls/winemac.drv/cocoa_event.m
index a5f1c1b..c95fac6 100644
--- a/dlls/winemac.drv/cocoa_event.m
+++ b/dlls/winemac.drv/cocoa_event.m
@@ -252,7 +252,7 @@ static NSString* const WineEventQueueThreadDictionaryKey = @"WineEventQueueThrea
         [eventsLock unlock];
     }
 
-    - (BOOL) query:(macdrv_query*)query timeout:(NSTimeInterval)timeout
+    - (BOOL) query:(macdrv_query*)query timeout:(NSTimeInterval)timeout processEvents:(BOOL)processEvents
     {
         macdrv_event event;
         NSDate* timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeout];
@@ -264,10 +264,15 @@ static NSString* const WineEventQueueThreadDictionaryKey = @"WineEventQueueThrea
         query->done = FALSE;
 
         [self postEvent:&event];
-        timedout = ![NSApp waitUntilQueryDone:&query->done timeout:timeoutDate];
+        timedout = ![NSApp waitUntilQueryDone:&query->done timeout:timeoutDate processEvents:processEvents];
         return !timedout && query->status;
     }
 
+    - (BOOL) query:(macdrv_query*)query timeout:(NSTimeInterval)timeout
+    {
+        return [self query:query timeout:timeout processEvents:FALSE];
+    }
+
 
 /***********************************************************************
  *              OnMainThread
@@ -470,8 +475,21 @@ void macdrv_set_query_done(macdrv_query *query)
     macdrv_retain_query(query);
 
     OnMainThreadAsync(^{
+        NSEvent* event;
+
         query->done = TRUE;
         macdrv_release_query(query);
+
+        event = [NSEvent otherEventWithType:NSApplicationDefined
+                                   location:NSZeroPoint
+                              modifierFlags:0
+                                  timestamp:[[NSProcessInfo processInfo] systemUptime]
+                               windowNumber:0
+                                    context:nil
+                                    subtype:WineApplicationEventWakeQuery
+                                      data1:0
+                                      data2:0];
+        [NSApp postEvent:event atStart:TRUE];
     });
 }
 
diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c
index 512d99e..1fba681 100644
--- a/dlls/winemac.drv/event.c
+++ b/dlls/winemac.drv/event.c
@@ -240,7 +240,8 @@ DWORD CDECL macdrv_MsgWaitForMultipleObjectsEx(DWORD count, const HANDLE *handle
                                         timeout, flags & MWMO_ALERTABLE);
     }
 
-    if (data->current_event) event_mask = 0;  /* don't process nested events */
+    if (data->current_event && data->current_event->type != QUERY_EVENT)
+        event_mask = 0;  /* don't process nested events */
 
     if (process_events(data->queue, event_mask)) ret = count - 1;
     else if (count || timeout)




More information about the wine-cvs mailing list