Skip to content

Commit

Permalink
[#239] more event stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
Jigish Patel committed Feb 24, 2013
1 parent cc33ca9 commit 54bf44e
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 57 deletions.
7 changes: 1 addition & 6 deletions Slate/Constants.h
Expand Up @@ -372,9 +372,4 @@ extern NSString *const OPT_MAIN_LAST;
extern NSString *const OPT_TITLE_ORDER;
extern NSString *const OPT_TITLE_ORDER_REGEX;
extern NSString *const OPT_BEFORE;
extern NSString *const OPT_AFTER;

// Javascript Events
extern NSString *const EVENT_SCREEN;
extern NSString *const EVENT_APP;
extern NSString *const EVENT_WINDOW;
extern NSString *const OPT_AFTER;
7 changes: 1 addition & 6 deletions Slate/Constants.m
Expand Up @@ -372,9 +372,4 @@
NSString *const OPT_TITLE_ORDER = @"title-order";
NSString *const OPT_TITLE_ORDER_REGEX = @"title-order-regex";
NSString *const OPT_BEFORE = @"_before_";
NSString *const OPT_AFTER = @"_after_";

// Javascript Events
NSString *const EVENT_SCREEN = @"screen";
NSString *const EVENT_APP = @"app";
NSString *const EVENT_WINDOW = @"window";
NSString *const OPT_AFTER = @"_after_";
2 changes: 1 addition & 1 deletion Slate/JSController.h
Expand Up @@ -32,7 +32,7 @@
@property NSMutableDictionary *eventCallbacks;

- (BOOL)loadConfigFileWithPath:(NSString *)path;
- (void)runCallbacks:(NSString *)what event:(NSString *)event payload:(id)payload;
- (void)runCallbacks:(NSString *)what payload:(id)payload;
- (NSString *)addCallableFunction:(WebScriptObject *)function;
- (id)runCallableFunction:(NSString *)key;
- (id)runFunction:(WebScriptObject*)function;
Expand Down
15 changes: 12 additions & 3 deletions Slate/JSController.m
Expand Up @@ -325,7 +325,11 @@ - (void)log:(id)msg {
}

- (BOOL)isValidEvent:(NSString *)what {
return [EVENT_SCREEN isEqualToString:what] || [EVENT_APP isEqualToString:what] || [EVENT_WINDOW isEqualToString:what];
return [what isEqualToString:@"windowClosed"] || [what isEqualToString:@"windowMoved"] || [what isEqualToString:@"windowResized"] ||
[what isEqualToString:@"windowOpened"] || [what isEqualToString:@"windowFocused"] || [what isEqualToString:@"windowTitleChanged"] ||
[what isEqualToString:@"appClosed"] || [what isEqualToString:@"appOpened"] || [what isEqualToString:@"appHidden"] ||
[what isEqualToString:@"appUnhidden"] || [what isEqualToString:@"appDeactivated"] || [what isEqualToString:@"appActivated"] ||
[what isEqualToString:@"screenConfigurationChanged"];
}

- (void)on:(NSString *)what do:(WebScriptObject *)callback {
Expand All @@ -339,6 +343,11 @@ - (void)on:(NSString *)what do:(WebScriptObject *)callback {
[NSApp terminate:nil];
}
}
if ([what isEqualToString:@"windowMoved"]) {
[[SlateConfig getInstance] setConfig:JS_RECEIVE_MOVE_EVENT to:@"true"];
} else if ([what isEqualToString:@"windowResized"]) {
[[SlateConfig getInstance] setConfig:JS_RECEIVE_RESIZE_EVENT to:@"true"];
}
NSMutableArray *callbacks = [[self eventCallbacks] objectForKey:what];
if (callbacks == nil) {
callbacks = [NSMutableArray array];
Expand All @@ -347,11 +356,11 @@ - (void)on:(NSString *)what do:(WebScriptObject *)callback {
[callbacks addObject:callback];
}

- (void)runCallbacks:(NSString *)what event:(NSString *)event payload:(id)payload {
- (void)runCallbacks:(NSString *)what payload:(id)payload {
NSArray *callbacks = [[self eventCallbacks] objectForKey:what];
if (callbacks == nil || [callbacks count] == 0) { return; }
for (WebScriptObject *callback in callbacks) {
[self runFunction:callback withArg:event secondArg:payload];
[self runFunction:callback withArg:what secondArg:payload];
}
}

Expand Down
70 changes: 30 additions & 40 deletions Slate/RunningApplications.m
Expand Up @@ -45,41 +45,31 @@ + (BOOL)isAppSelectable:(NSRunningApplication *)app {
return [app activationPolicy] == NSApplicationActivationPolicyRegular;
}

static NSDictionary *eventNameDict = nil;

static NSString *prettyifyEventName(NSString *event) {
if ([event isEqualToString:[NSString stringWithFormat:@"%@", kAXUIElementDestroyedNotification]]) {
return @"killed";
} else if ([event isEqualToString:[NSString stringWithFormat:@"%@", kAXMovedNotification]]) {
return @"moved";
} else if ([event isEqualToString:[NSString stringWithFormat:@"%@", kAXResizedNotification]]) {
return @"resized";
} else if ([event isEqualToString:[NSString stringWithFormat:@"%@", kAXWindowCreatedNotification]]) {
return @"created";
} else if ([event isEqualToString:[NSString stringWithFormat:@"%@", kAXFocusedWindowChangedNotification]]) {
return @"focused";
} else if ([event isEqualToString:[NSString stringWithFormat:@"%@", kAXTitleChangedNotification]]) {
return @"title";
} else if ([event isEqualToString:NSWorkspaceDidTerminateApplicationNotification]) {
return @"killed";
} else if ([event isEqualToString:NSWorkspaceDidLaunchApplicationNotification]) {
return @"launched";
} else if ([event isEqualToString:NSWorkspaceDidHideApplicationNotification]) {
return @"hidden";
} else if ([event isEqualToString:NSWorkspaceDidUnhideApplicationNotification]) {
return @"unhidden";
} else if ([event isEqualToString:NSWorkspaceDidDeactivateApplicationNotification]) {
return @"deactivated";
} else if ([event isEqualToString:NSWorkspaceDidActivateApplicationNotification]) {
return @"activated";
if (eventNameDict == nil) {
eventNameDict = [NSDictionary dictionaryWithObjectsAndKeys:@"windowClosed", [NSString stringWithFormat:@"%@", kAXUIElementDestroyedNotification],
@"windowMoved", [NSString stringWithFormat:@"%@", kAXMovedNotification],
@"windowResized", [NSString stringWithFormat:@"%@", kAXResizedNotification],
@"windowOpened", [NSString stringWithFormat:@"%@", kAXWindowCreatedNotification],
@"windowFocused", [NSString stringWithFormat:@"%@", kAXFocusedWindowChangedNotification],
@"windowTitleChanged", [NSString stringWithFormat:@"%@", kAXTitleChangedNotification],
@"appClosed", NSWorkspaceDidTerminateApplicationNotification,
@"appOpened", NSWorkspaceDidLaunchApplicationNotification,
@"appHidden", NSWorkspaceDidHideApplicationNotification,
@"appUnhidden", NSWorkspaceDidUnhideApplicationNotification,
@"appActivated", NSWorkspaceDidActivateApplicationNotification,
@"appDeactivated", NSWorkspaceDidDeactivateApplicationNotification, nil];
}

return @"";
return [eventNameDict objectForKey:event];
}

static void runWindowJSCallbacks(AXUIElementRef element, CFStringRef notification) {
// Run any js callbacks
AccessibilityWrapper *openedWindow = [[AccessibilityWrapper alloc] initWithApp:[AccessibilityWrapper applicationForElement:element] window:element];
[[JSController getInstance] runCallbacks:EVENT_WINDOW
event:prettyifyEventName([NSString stringWithFormat:@"%@", notification])
NSString *eventName = prettyifyEventName([NSString stringWithFormat:@"%@", notification]);
[[JSController getInstance] runCallbacks:eventName
payload:[[JSWindowWrapper alloc] initWithAccessibilityWrapper:openedWindow screenWrapper:[[ScreenWrapper alloc] init]]];
}

Expand All @@ -93,8 +83,8 @@ static void windowChanged(AXObserverRef observer, AXUIElementRef element, CFStri
AXObserverRemoveNotification(observer, element, kAXResizedNotification);
[ref pruneWindows];
}
[[JSController getInstance] runCallbacks:EVENT_WINDOW
event:prettyifyEventName([NSString stringWithFormat:@"%@", notification])
NSString *eventName = prettyifyEventName([NSString stringWithFormat:@"%@", notification]);
[[JSController getInstance] runCallbacks:eventName
payload:[[JSApplicationWrapper alloc] initWithRunningApplication:[NSRunningApplication runningApplicationWithProcessIdentifier:[AccessibilityWrapper processIdentifierOfUIElement:element]] screenWrapper:[[ScreenWrapper alloc] init]]];
}

Expand Down Expand Up @@ -433,17 +423,17 @@ - (void)applicationActivated:(id)notification {
if ([[activatedApp localizedName] isEqualToString:@"Slate"]) return;
[self bringAppToFront:activatedApp];
[self pruneWindows];
[[JSController getInstance] runCallbacks:EVENT_APP
event:prettyifyEventName([notification name])
NSString *eventName = prettyifyEventName([notification name]);
[[JSController getInstance] runCallbacks:eventName
payload:[[JSApplicationWrapper alloc] initWithRunningApplication:activatedApp screenWrapper:[[ScreenWrapper alloc] init]]];
}

- (void)applicationDeactivated:(id)notification {
SlateLogger(@"Deactivated: %@", [notification name]);
NSRunningApplication *activatedApp = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];
[[JSController getInstance] runCallbacks:EVENT_APP
event:prettyifyEventName([notification name])
payload:[[JSApplicationWrapper alloc] initWithRunningApplication:activatedApp screenWrapper:[[ScreenWrapper alloc] init]]];
NSRunningApplication *deactivatedApp = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];
NSString *eventName = prettyifyEventName([notification name]);
[[JSController getInstance] runCallbacks:eventName
payload:[[JSApplicationWrapper alloc] initWithRunningApplication:deactivatedApp screenWrapper:[[ScreenWrapper alloc] init]]];
}

- (void)applicationLaunched:(id)notification {
Expand Down Expand Up @@ -498,8 +488,8 @@ - (void)applicationLaunched:(id)notification {
}
[self bringAppToFront:launchedApp];
[self pruneWindows];
[[JSController getInstance] runCallbacks:EVENT_APP
event:prettyifyEventName([notification name])
NSString *eventName = prettyifyEventName([notification name]);
[[JSController getInstance] runCallbacks:eventName
payload:[[JSApplicationWrapper alloc] initWithRunningApplication:launchedApp screenWrapper:[[ScreenWrapper alloc] init]]];
}

Expand All @@ -516,8 +506,8 @@ - (void)applicationKilled:(id)notification {
[pidToObserver removeObjectForKey:[NSNumber numberWithInteger:[app processIdentifier]]];
[self pruneWindows];
[self bringAppToFront:[self currentApplication]];
[[JSController getInstance] runCallbacks:EVENT_APP
event:prettyifyEventName([notification name])
NSString *eventName = prettyifyEventName([notification name]);
[[JSController getInstance] runCallbacks:eventName
payload:[[JSApplicationWrapper alloc] initWithRunningApplication:app screenWrapper:[[ScreenWrapper alloc] init]]];
}

Expand Down
1 change: 1 addition & 0 deletions Slate/SlateConfig.h
Expand Up @@ -55,6 +55,7 @@
- (BOOL)append:(NSString *)configString;
- (BOOL)loadSnapshots;
- (BOOL)getBoolConfig:(NSString *)key;
- (void)setConfig:(NSString *)key to:(NSString *)value;
- (NSInteger)getIntegerConfig:(NSString *)key;
- (double)getDoubleConfig:(NSString *)key;
- (float)getFloatConfig:(NSString *)key;
Expand Down
6 changes: 5 additions & 1 deletion Slate/SlateConfig.m
Expand Up @@ -109,6 +109,10 @@ - (NSString *)getConfig:(NSString *)key {
return c;
}

- (void)setConfig:(NSString *)key to:(NSString *)value {
[configs setObject:value forKey:key];
}

- (NSString *)getConfigDefault:(NSString *)key {
return [configDefaults objectForKey:key];
}
Expand Down Expand Up @@ -469,7 +473,7 @@ - (void)onScreenChange:(id)notification {
SlateLogger(@"onScreenChange");
if (![ScreenWrapper hasScreenConfigChanged]) return;
[self checkDefaults];
[[JSController getInstance] runCallbacks:EVENT_SCREEN event:@"screenConfigurationChanged" payload:nil];
[[JSController getInstance] runCallbacks:@"screenConfigurationChanged" payload:nil];
}

- (NSDictionary *)snapshotsToDictionary {
Expand Down

0 comments on commit 54bf44e

Please sign in to comment.