Slate – «серебряная пуля» для расположения окон на экранах OS X

от автора

Привет, Хабр! Хочу поделиться очень интересным инструментом для «приручения» положения окон в OS X. Если кратко, то вот ссылка на репозиторий с замечательным приложением Slate. За подробностями, добро пожаловать под кат.

image

Я столкнулся с проблемой расположения (и, что самое главное, сохранения этой позиции!) окон на нескольких мониторах в OS X. Особенно эта проблема актуальна в случае, если основная рабочая машина – это ноутбук, а работать приходится много, и, соответственно, подключать разные мониторы и в разном количестве. У меня, например, стоит довольно большой монитор в офисе, по-меньше дома, а в дороге – возможности подключить второй монитор нет вообще. В итоге, каждый мой рабочий сеанс начинается с включения IDE и расположения всех окон-инструментов (терминал, история версий, структура проекта, инспектор класса и т.д.) IDE по мониторам. Этот процесс сильно ускоряется такими приложениями как ShiftIt, но все равно приходится тратить время на точное расположение каждого окна. Хочется просто нажать заветную комбинацию клавиш и наблюдать как окна сами располагаются по заранее заданным позициям.

И вот сегодня я нашёл решение, которое покрывает все мои потребности с головой и хочу поделиться им с вами.

Собственно, приложение называется Slate. Вот ссылка на гитхаб. Это приложение позволяет создавать свои собственные конфигурации расположения окон на мониторах в виде JS файла с конфигурацией. Slate предоставляет очень мощный и в то же время простой для понимания API для манипуляции с окнами, позволяет байндить события на сочетания клавиш, имеет отличную документацию и (что самое главное) работает!

Для создания своей собственной конфигурации необходимо создать файл ~/.slate.js и описать там расположение окон.

Вот так, например, получилось у меня:

// При нажатии на ctrl+alt+cmd+shift+1 будем расставлять окна на место slate.bind("1:ctrl,alt,cmd,shift", function() {         // Пока что не будем обрабатывать ситуацию, когда количество мониторов не равно 2-м. 	if (slate.screenCount() !== 2) { 		return; 	}         // Выберем более большой по размеру монитор как главный, а второй как дополнительный 	var screen0 = slate.screenForRef('0'); 	var screen1 = slate.screenForRef('1'); 	var mainScreen = null, 		additionalScreen = null; 	if (screen0.rect().width * screen0.rect().height > screen1.rect().width * screen1.rect().height) { 		mainScreen = screen0; 		additionalScreen = screen1; 	} else { 		mainScreen = screen1; 		additionalScreen = screen0; 	}                  // Пробежимся по всем открытым приложениям 	slate.eachApp(function(app) {                 // Но работать будем только с окнами IntelliJ IDEA 		var appName = app.name(); 		if (appName !== 'IntelliJ IDEA') { 			return; 		} 		app.eachWindow(function(win) {                         //В зависимости от названия окна - инструмента IntelliJ IDEA зададим ему позицию, размеры и монитор 			var w, h, xOffset, yOffset, screen; 			switch (win.title()) { 				case 'Terminal': 					w = 5; 					h = 5; 					xOffset = 7; 					yOffset = 7; 					screen = mainScreen; 					break; 				case 'Version Control': 					w = 5; 					h = 5; 					xOffset = 7; 					yOffset = 2; 					screen = mainScreen; 					break; 				case 'Database': 					w = 3; 					h = 2; 					xOffset = 9; 					yOffset = 0; 					screen = mainScreen; 					break; 				case 'Workspaces': 					w = 2; 					h = 2; 					xOffset = 7; 					yOffset = 0; 					screen = mainScreen; 					break; 				case 'Project': 					w = 6; 					h = 12; 					xOffset = 0; 					yOffset = 0; 					screen = additionalScreen; 					break; 				case 'Structure': 					w = 6; 					h = 12; 					xOffset = 6; 					yOffset = 0; 					screen = additionalScreen; 					break; 				default: 					w = 7; 					h = 12; 					xOffset = 0; 					yOffset = 0; 					screen = mainScreen; 			}                         // Применим изменения к окну 			win.doOperation(slate.operation('move', { 				'x': 'screenOriginX+screenSizeX/12*' + xOffset, 				'y': 'screenOriginY+screenSizeY/12*' + yOffset, 				'width': 'screenSizeX/12*' + w, 				'height': 'screenSizeY/12*' + h, 				'screen': screen 			})); 		}); 	}); }); 

И вот такой результат:

image

image

Спасибо за внимание!
ссылка на оригинал статьи https://habrahabr.ru/post/313578/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *