Skip to content

Instantly share code, notes, and snippets.

@ashmckenzie
Last active August 29, 2015 14:02
Show Gist options
  • Save ashmckenzie/b573c5c6e3f300d9c34e to your computer and use it in GitHub Desktop.
Save ashmckenzie/b573c5c6e3f300d9c34e to your computer and use it in GitHub Desktop.
Slate JS - goes in ~/.slate.js
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