Module: wine Branch: master Commit: 761ad810d978168edf3fce62dd8aa12f9e945292 URL: http://source.winehq.org/git/wine.git/?a=commit;h=761ad810d978168edf3fce62dd...
Author: Ken Thomases ken@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)