Skip to content

Instantly share code, notes, and snippets.

@benbriggs
Last active July 29, 2021 23:45
Show Gist options
  • Save benbriggs/6ced19d6d2404c006b58370706ac1f43 to your computer and use it in GitHub Desktop.
Save benbriggs/6ced19d6d2404c006b58370706ac1f43 to your computer and use it in GitHub Desktop.
JS slate file
slate.config('orderScreensLeftToRight', true);
const SCREENS = {
leftScreen: 0,
middleScreen: 1,
rightScreen: 2,
};
const WINDOW_ORIGINS = {
leftHalf: {
x: 'screenOriginX',
y: 'screenOriginY'
},
rightHalf: {
x: 'screenOriginX+screenSizeX/2',
y: 'screenOriginY'
},
bottomHalf: {
x: 'screenOriginX',
y: 'screenOriginY+screenSizeY/2'
}
};
SIZES = {
fullScreen: {
width: 'screenSizeX',
height: 'screenSizeY'
},
portrait: {
width: 'screenSizeX/2',
height: 'screenSizeY'
},
landscape: {
width: 'screenSizeX',
height: 'screenSizeY/2'
},
quarter: {
width: 'screenSizeX/2',
height: 'screenSizeY/2'
}
};
const throwScreen = (screen = SCREENS.middleScreen, resize = true) => {
let opts = {
screen: screen
};
if (resize) {
opts = Object.assign(
{},
opts,
SIZES.fullScreen
);
}
return slate.operation('throw', opts);
};
const focusApp = (app) => {
return slate.operation('focus', {
app: app
});
};
const corner = (corner = 'top-left', size = SIZES.fullScreen) => {
const opts = Object.assign({}, {direction: corner}, size);
return slate.operation('corner', opts);
};
const moveWindow = (offset, size, screen) => {
return slate.operation('move', Object.assign({}, offset, size, {screen}))
};
const defaultLayoutName = 'default';
const singleScreenLayoutName = 'singleScreen';
const repeatMoveLeft = (offset = WINDOW_ORIGINS.leftHalf, size = SIZES.fullScreen) => {
return {
operations: [
moveWindow(offset, size, SCREENS.leftScreen)
],
repeat: true
};
};
const singleScreenLayout = slate.layout(singleScreenLayoutName, {
'Code': repeatMoveLeft(),
'Slack': repeatMoveLeft(),
'Spotify': repeatMoveLeft(),
'iTerm2': repeatMoveLeft(WINDOW_ORIGINS.rightHalf, SIZES.portrait),
'Messages': repeatMoveLeft(WINDOW_ORIGINS.leftHalf, SIZES.portrait),
'Google Chrome': repeatMoveLeft()
});
const defaultLayout = slate.layout(defaultLayoutName, {
'_after_': {
operations: [
focusApp('Chrome'),
focusApp('Code'),
focusApp('Atom')
]
},
'Code': {
operations: [
throwScreen(SCREENS.middleScreen, true)
],
repeat: true
},
'Atom': {
operations: [
throwScreen(SCREENS.middleScreen, true)
],
repeat: true
},
'HipChat': {
operations: [
throwScreen(SCREENS.rightScreen, true)
]
},
'Slack': {
operations: [
throwScreen(SCREENS.rightScreen, true)
]
},
'Spotify': {
operations: [
moveWindow(WINDOW_ORIGINS.leftHalf, SIZES.portrait, SCREENS.leftScreen)
]
},
'Tweetbot': {
operations: [
moveWindow(WINDOW_ORIGINS.leftHalf, SIZES.portrait, SCREENS.leftScreen)
]
},
'iTerm2': {
operations: [
moveWindow(WINDOW_ORIGINS.rightHalf, SIZES.portrait, SCREENS.leftScreen)
]
},
'Messages': {
operations: [
moveWindow(WINDOW_ORIGINS.leftHalf, SIZES.quarter, SCREENS.leftScreen)
]
},
'Google Chrome': {
operations: [
(win) => {
const title = win.title();
if (title !== null && title !== undefined && title.match(/^DevTools/))
return win.doOperation(moveWindow(WINDOW_ORIGINS.leftHalf, SIZES.portrait, SCREENS.middleScreen))
else
return win.doOperation(moveWindow(WINDOW_ORIGINS.leftHalf, SIZES.fullScreen, SCREENS.leftScreen))
}
],
repeat: true
}
});
slate.bind('backslash:ctrl;cmd', (win) => {
if (slate.screenCount() === 1) {
return win.doOperation('layout', { name: singleScreenLayoutName });
}
return win.doOperation('layout', { name: defaultLayoutName });
});
slate.default(['2560x1440', '2560x1440', '1680x1050'], defaultLayoutName);
slate.default(['1440x900'], singleScreenLayoutName);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment