Skip to content

Commit c8774a6

Browse files
committed
Fix dock menu injection
Brand new dock menu injection logic. Is compatible with all apps (including Electron) and dock menu configurations.
1 parent d9eff11 commit c8774a6

File tree

2 files changed

+17
-49
lines changed

2 files changed

+17
-49
lines changed

AfloatX.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@
307307
CLANG_ENABLE_OBJC_ARC = YES;
308308
CODE_SIGN_STYLE = Automatic;
309309
COMBINE_HIDPI_IMAGES = YES;
310-
CURRENT_PROJECT_VERSION = 1.3.4;
310+
CURRENT_PROJECT_VERSION = 1.3.5;
311311
DEPLOYMENT_LOCATION = YES;
312312
DEVELOPMENT_TEAM = 6LAE5ASX7M;
313313
DSTROOT = /;
@@ -318,7 +318,7 @@
318318
INSTALL_PATH = "/Library/Application Support/MacEnhance/Plugins";
319319
MACH_O_TYPE = mh_dylib;
320320
MACOSX_DEPLOYMENT_TARGET = 10.12;
321-
MARKETING_VERSION = 1.3.4;
321+
MARKETING_VERSION = 1.3.5;
322322
PRODUCT_BUNDLE_IDENTIFIER = com.github.jslegendre.AfloatX;
323323
PRODUCT_NAME = "$(TARGET_NAME)";
324324
WRAPPER_EXTENSION = bundle;
@@ -331,7 +331,7 @@
331331
CLANG_ENABLE_OBJC_ARC = YES;
332332
CODE_SIGN_STYLE = Automatic;
333333
COMBINE_HIDPI_IMAGES = YES;
334-
CURRENT_PROJECT_VERSION = 1.3.4;
334+
CURRENT_PROJECT_VERSION = 1.3.5;
335335
DEPLOYMENT_LOCATION = YES;
336336
DEVELOPMENT_TEAM = 6LAE5ASX7M;
337337
DSTROOT = /;
@@ -342,7 +342,7 @@
342342
INSTALL_PATH = "/Library/Application Support/MacEnhance/Plugins";
343343
MACH_O_TYPE = mh_dylib;
344344
MACOSX_DEPLOYMENT_TARGET = 10.12;
345-
MARKETING_VERSION = 1.3.4;
345+
MARKETING_VERSION = 1.3.5;
346346
PRODUCT_BUNDLE_IDENTIFIER = com.github.jslegendre.AfloatX;
347347
PRODUCT_NAME = "$(TARGET_NAME)";
348348
WRAPPER_EXTENSION = bundle;

AfloatX/AfloatX.m

Lines changed: 13 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -211,59 +211,22 @@ + (void)load {
211211
transparencyItem,
212212
nil];
213213
[AfloatXSubmenu setItemArray:afloatXItems];
214-
215-
// Are we in an Electron app?
216-
if(objc_lookUpClass("AtomApplicationDelegate")) {
217-
dispatch_once(&injectMenuOnceToken, ^{ /* Use up token */ });
218-
[AfloatXMenu addItem:AfloatXItem];
219-
}
214+
215+
[AfloatXMenu addItem:[NSMenuItem separatorItem]];
216+
[AfloatXMenu addItem:AfloatXItem];
220217
}
221218

222219
@end
223220

224-
/*
225-
AtomApplicationDelegate is the application delegate class
226-
for all Electron apps. In order for AfloatX to work we must
227-
explicitly swizzle this class because the application delegate
228-
class gets subclassed/swizzled to this one after injection.
229-
*/
230-
ZKSwizzleInterface(AXAppDelegate, AtomApplicationDelegate, NSObject)
231-
@implementation AXAppDelegate
232-
- (NSMenu *)applicationDockMenu:(NSApplication *)sender {
233-
NSMenu *originalMenu = ZKOrig(NSMenu*, sender);
234-
if(originalMenu) {
235-
[AfloatXMenu removeItem:AfloatXItem];
236-
AfloatXMenu = originalMenu;
237-
// Only add a separator if last item isn't already a separator
238-
if (!AfloatXMenu.itemArray.lastObject.isSeparatorItem)
239-
[AfloatXMenu addItem:[NSMenuItem separatorItem]];
240-
[AfloatXMenu addItem:AfloatXItem];
241-
}
242-
243-
return AfloatXMenu;
244-
}
245-
@end
246-
247221
ZKSwizzleInterface(AXApplication, NSApplication, NSResponder)
248222
@implementation AXApplication
249-
- (CFArrayRef)_flattenMenu:(NSMenu *)dockMenu flatList:(NSArray *)flatList {
250-
251-
// Add AfloatX to the dock menu
252-
dispatch_once(&injectMenuOnceToken, ^{
253-
if (!dockMenu.itemArray.lastObject.isSeparatorItem)
254-
[dockMenu addItem:[NSMenuItem separatorItem]];
255-
256-
[dockMenu addItem:AfloatXItem];
257-
});
258-
259-
// Make any necessary changes to our menu before it is 'flattened'
223+
- (CFArrayRef)_createDockMenu:(BOOL)enabled {
260224
NSWindow *window = [AXWindowUtils windowToModify];
261225
if(!window) {
262-
AfloatXItem.enabled = NO;
263-
return ZKOrig(CFArrayRef, dockMenu, flatList);
226+
return ZKOrig(CFArrayRef, enabled);
264227
}
265228

266-
AfloatXItem.enabled = YES;
229+
// Make any necessary changes to our menu before it is 'flattened'
267230
if([[AfloatX sharedInstance] isWindowTransient:window]) {
268231
[transientItem setState:NSControlStateValueOn];
269232
} else {
@@ -311,7 +274,12 @@ - (CFArrayRef)_flattenMenu:(NSMenu *)dockMenu flatList:(NSArray *)flatList {
311274
} else {
312275
[invertColorItem setState:NSControlStateValueOff];
313276
}
314-
315-
return ZKOrig(CFArrayRef, dockMenu, flatList);
277+
278+
CFArrayRef flatDockMenu = ZKOrig(CFArrayRef, enabled);
279+
CFArrayRef flatAfloatXMenu = (__bridge CFArrayRef)(objc_msgSend(self, sel_getUid("_flattenMenu:flatList:"), AfloatXMenu, nil));
280+
281+
NSMutableArray *combinedFlatMenus = (__bridge NSMutableArray *)flatDockMenu;
282+
[combinedFlatMenus addObjectsFromArray:(__bridge NSArray *)flatAfloatXMenu];
283+
return (__bridge CFArrayRef)combinedFlatMenus;
316284
}
317285
@end

0 commit comments

Comments
 (0)