diff options
| author | Pietro Gagliardi <[email protected]> | 2014-08-19 13:25:52 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2014-08-19 13:25:52 -0400 |
| commit | a3ff63490b80c9f744978f3cf6e096a066c626e3 (patch) | |
| tree | 309b82732f09d858beaa7c79fd34410fb3411417 /redo/uitask_darwin.m | |
| parent | e5759d80de62958b24d5fe18c7e8b2d4a8241cc0 (diff) | |
Split the modal queue stuff into its own files.
Diffstat (limited to 'redo/uitask_darwin.m')
| -rw-r--r-- | redo/uitask_darwin.m | 40 |
1 files changed, 3 insertions, 37 deletions
diff --git a/redo/uitask_darwin.m b/redo/uitask_darwin.m index 9d25a61..86de4ce 100644 --- a/redo/uitask_darwin.m +++ b/redo/uitask_darwin.m @@ -2,6 +2,7 @@ #import "objc_darwin.h" #import "_cgo_export.h" +#import "modalqueue.h" #import <Cocoa/Cocoa.h> #define toNSWindow(x) ((NSWindow *) (x)) @@ -129,48 +130,13 @@ void uistop(void) [NSApp postEvent:e atStart:NO]; // let pending events take priority } -// because dispatch_suspend()/dispatch_resume() can't be used with the main queue -static BOOL inmodal = NO; -static void **modalqueue = NULL; -static size_t mqlen = 0; -static size_t mqcap = 0; - -void beginModal(void) -{ - inmodal = YES; - if (modalqueue == NULL) { - mqcap = 128; - modalqueue = (void **) malloc(mqcap * sizeof (void *)); - if (modalqueue == NULL) - abort();//TODO - mqlen = 0; - } -} - -void endModal(void) -{ - size_t i; - - inmodal = NO; - for (i = 0; i < mqlen; i++) - doissue(modalqueue[i]); - mqlen = 0; -} +// we use the modal queue because dispatch_suspend()/dispatch_resume() can't be used with the main queue // thanks to mikeash in irc.freenode.net/#macdev for suggesting the use of Grand Central Dispatch and blocks for this void issue(void *what) { - if (inmodal) { - modalqueue[mqlen] = what; - mqlen++; - if (mqlen >= mqcap) { - mqcap *= 2; - modalqueue = (void **) realloc(modalqueue, mqcap * sizeof (void *)); - if (modalqueue == NULL) - abort();//TODO - } + if (queueIfModal(what)) return; - } dispatch_async(dispatch_get_main_queue(), ^{ doissue(what); }); |
