summaryrefslogtreecommitdiff
path: root/redo/uitask_darwin.m
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-08-19 13:25:52 -0400
committerPietro Gagliardi <[email protected]>2014-08-19 13:25:52 -0400
commita3ff63490b80c9f744978f3cf6e096a066c626e3 (patch)
tree309b82732f09d858beaa7c79fd34410fb3411417 /redo/uitask_darwin.m
parente5759d80de62958b24d5fe18c7e8b2d4a8241cc0 (diff)
Split the modal queue stuff into its own files.
Diffstat (limited to 'redo/uitask_darwin.m')
-rw-r--r--redo/uitask_darwin.m40
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);
});