Last active
August 29, 2015 14:02
-
-
Save ashmckenzie/b573c5c6e3f300d9c34e to your computer and use it in GitHub Desktop.
Slate JS - goes in ~/.slate.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function MergeRecursive(obj1, obj2) { | |
for (var p in obj2) { | |
try { | |
// Property in destination object set; update its value. | |
if ( obj2[p].constructor==Object ) { | |
obj1[p] = MergeRecursive(obj1[p], obj2[p]); | |
} else { | |
obj1[p] = obj2[p]; | |
} | |
} catch(e) { | |
// Property in destination object not set; create it and set its value. | |
obj1[p] = obj2[p]; | |
} | |
} | |
return obj1; | |
} | |
S.cfga({ | |
"defaultToCurrentScreen" : true, | |
"nudgePercentOf": "screenSize", | |
"resizePercentOf": "screenSize", | |
"secondsBetweenRepeat": 0.1, | |
"checkDefaultsOnLoad": true, | |
"focusCheckWidthMax": 3000, | |
"windowHintsIconAlpha": 0.3, | |
"windowHintsFontColor": "255;255;255;1", | |
"windowHintsBackgroundColor": "0;0;0;0.3", | |
"windowHintsShowIcons": true, | |
"windowHintsIgnoreHiddenWindows": false, | |
"windowHintsDuration": 5, | |
"windowHintsSpread": true | |
}); | |
// Hyper hotkey definition. You might want to change this. | |
// | |
var hyper_hotkey = "ctrl;shift;alt;cmd"; | |
// Display positions | |
// | |
var laptop = "0"; | |
var external = "1"; | |
var full_hash = { "x": "screenOriginX", "y": "screenOriginY", "width": "screenSizeX", "height": "screenSizeY" }; | |
var middle_hash = { "x": "screenSizeX/12", "y": "screenOriginY+screenSizeY/12", "width": "screenSizeX/12*(12-2)", "height": "(screenSizeY/12)*(12-2)" }; | |
var left_hash = { "x": "screenOriginX", "y": "screenOriginY", "width": "screenSizeX/2", "height": "screenSizeY" }; | |
var right_hash = { "x": "screenOriginX+screenSizeX/2", "y": "screenOriginY", "width": "screenSizeX/2", "height": "screenSizeY" }; | |
var full = S.op("move", full_hash); | |
var middle = S.op("move", middle_hash); | |
var left = S.op("move", left_hash); | |
var right = S.op("move", right_hash); | |
var external_full = S.op("move", MergeRecursive(full_hash, { "screen": external })); | |
var external_middle = S.op("move", MergeRecursive(middle_hash, { "screen": external })); | |
var external_left = S.op("move", MergeRecursive(left_hash, { "screen": external })); | |
var external_right = S.op("move", MergeRecursive(right_hash, { "screen": external })); | |
var laptop_full = S.op("move", MergeRecursive(full_hash, { "screen": laptop })); | |
var laptop_middle_hash = MergeRecursive(middle_hash, { "screen": laptop }); | |
var laptop_middle = S.op("move", laptop_middle_hash); | |
var laptop_left = S.op("move", MergeRecursive(left_hash, { "screen": laptop })); | |
var laptop_right = S.op("move", MergeRecursive(right_hash, { "screen": laptop })); | |
// Bindings | |
// | |
S.bind("up:" + hyper_hotkey, full); | |
S.bind("down:" + hyper_hotkey, middle); | |
S.bind("left:" + hyper_hotkey, left); | |
S.bind("right:" + hyper_hotkey, right); | |
S.bind("return:" + hyper_hotkey, S.op("hint")); | |
S.bind("backslash:" + hyper_hotkey, S.op("relaunch")); | |
// Layout setup | |
// | |
var layouts = { | |
"work": { "resolutions": [ "1440x900", "2560x1440" ], "apps": {} }, | |
//"work": { "resolutions": [ "1680x1050", "2560x1440" ], "apps": {} }, | |
"home": { "resolutions": [ "2560x1440" ], "apps": {} }, | |
"laptop": { "resolutions": [ "1440x900" ], "apps": {} }, | |
//"laptop": { "resolutions": [ "1680x1050" ], "apps": {} } | |
} | |
// Apps | |
// | |
var apps = [ | |
{ | |
"name": "iTerm", | |
"hotkey": "t", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_right ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_right ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Google Chrome", | |
"hotkey": "b", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
], | |
"events": [ | |
{ "screen": external, "op": "move", "args": MergeRecursive(middle_hash, { "screen": external }) } | |
] | |
}, | |
{ | |
"name": "Firefox", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Sublime Text", | |
"hotkey": "s", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_left ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_left ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
], | |
"events": [ | |
{ "screen": external, "op": "move", "args": MergeRecursive(right_hash, { "screen": external }) }, | |
{ "screen": laptop, "op": "move", "args": laptop_middle_hash } | |
] | |
}, | |
{ | |
"name": "Airmail", | |
"hotkey": "e", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ laptop_full ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_left ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Flowdock", | |
"hotkey": "f", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ laptop_full ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_right ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Textual", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ laptop_full ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "SourceTree", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_right ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_right ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Evernote", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Dash", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Calendar", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Spotify", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "home", "args": { "operations": [ external_middle ], "repeat": true } }, | |
{ "name": "laptop", "args": { "operations": [ full ], "repeat": true } } | |
] | |
}, | |
{ | |
"name": "Finder", | |
"layouts": [ | |
{ "name": "work", "args": { "operations": [ laptop_full ], "repeat": true } } | |
] | |
} | |
]; | |
// App / Event processing | |
// | |
var event_handlers = {}; | |
for (var i=0; i<apps.length; i++) { | |
app = apps[i]; | |
// Hotkeys | |
if (app.hotkey) { | |
S.bind(app.hotkey + ":" + hyper_hotkey, S.op("focus", { "app": app.name })); | |
} | |
// Layouts | |
for (var j=0; j<app.layouts.length; j++) { | |
app_layout = app.layouts[j] | |
layouts[app_layout.name]["apps"][app.name] = app_layout.args | |
} | |
// Events | |
if (app.events) { | |
event_handlers[app.name] = [] | |
for (var k=0; k<app.events.length; k++) { | |
move_event = app.events[k] | |
event_handlers[app.name].push(move_event); | |
} | |
} | |
} | |
// Layout processing | |
// | |
for (var layout_name in layouts) { | |
if (layouts.hasOwnProperty(layout_name)) { | |
layout = layouts[layout_name]; | |
S.default(layout.resolutions, S.layout(layout_name, layout.apps)); | |
} | |
} | |
// Event handling | |
// | |
// S.on("windowOpened", function(event, win) { | |
// app_name = win.app().name(); | |
// if (event_handlers[app_name]) { | |
// for (var i=0; i<event_handlers[app_name].length; i++) { | |
// e = event_handlers[app_name][i]; | |
// if (e.screen == win.screen().id()) { | |
// S.log(JSON.stringify(e.args)); | |
// win.doOperation(e.op, e.args); | |
// } | |
// } | |
// } | |
// }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment