DockShow workaround
authorJeff Rehbein <jeff.rehbein@code42.com>
Thu, 17 Dec 2015 20:00:04 +0000 (14:00 -0600)
committerJeff Rehbein <jeff.rehbein@code42.com>
Thu, 17 Dec 2015 20:00:04 +0000 (14:00 -0600)
Implemented workaround in DockShow for TransformProcessType bugginess
based on discussion at http://stackoverflow.com/questions/7596643/

atom/browser/browser_mac.mm

index 6a3481c..48050d6 100644 (file)
@@ -70,8 +70,21 @@ void Browser::DockHide() {
 }
 
 void Browser::DockShow() {
+  BOOL active = [[NSRunningApplication currentApplication] isActive];
   ProcessSerialNumber psn = { 0, kCurrentProcess };
-  TransformProcessType(&psn, kProcessTransformToForegroundApplication);
+  if (active) {
+    // Workaround buggy behavior of TransformProcessType
+    for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.dock"]) {
+      [app activateWithOptions:NSApplicationActivateIgnoringOtherApps];
+      break;
+    }
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
+      TransformProcessType(&psn, kProcessTransformToForegroundApplication);
+      [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps];
+    });
+  } else {
+    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
+  }
 }
 
 void Browser::DockSetMenu(ui::MenuModel* model) {