mirror of https://github.com/einverne/dotfiles.git
Ein Verne
4 years ago
2 changed files with 197 additions and 1 deletions
@ -0,0 +1,197 @@
|
||||
--- === WinRectangle === |
||||
--- |
||||
--- Manage windows |
||||
--- |
||||
--- Download: []() |
||||
|
||||
local obj={} |
||||
obj.__index = obj |
||||
|
||||
--- Metadata |
||||
obj.name = "WinRectangle" |
||||
obj.version = "0.1" |
||||
obj.author = "Ein Verne <[email protected]>" |
||||
obj.homepage = "https://github.com/einverne/dotfiles" |
||||
obj.license = "MIT - https://opensource.org/licenses/MIT" |
||||
|
||||
--- WinRectangle.logger |
||||
--- Variable |
||||
--- Logger object used within the Spoon. Can be accessed to set the default log level for the messages coming from the Spoon. |
||||
obj.logger = hs.logger.new('WinRectangle') |
||||
|
||||
log = hs.logger.new('WinRectangle', 'debug') |
||||
|
||||
|
||||
--- WinRectangle.defaultHotkeys |
||||
--- Variable |
||||
--- Table containing a sample set of hotkeys that can be |
||||
--- assigned to the different operations. These are not bound |
||||
--- by default - if you want to use them you have to call: |
||||
--- `spoon.WinRectangle:bindHotkeys(spoon.WinRectangle.defaultHotkeys)` |
||||
--- after loading the spoon. Value: |
||||
--- ``` |
||||
--- function() |
||||
--- local win = hs.window.focusedWindow() |
||||
--- local f = win:frame() |
||||
--- local screen = win:screen() |
||||
--- local max = screen:frame() |
||||
--- |
||||
--- f.x = max.x |
||||
--- f.y = max.y |
||||
--- f.w = max.w / 2 |
||||
--- f.h = max.h |
||||
--- win:setFrame(f) |
||||
--- end |
||||
--- ``` |
||||
obj.defaultHotkeys = { |
||||
screen_left = { {"ctrl", "alt", "cmd", "shift"}, "H" }, |
||||
screen_right= { {"ctrl", "alt", "cmd", "shift"}, "L" }, |
||||
screen_down = { {"ctrl", "alt", "cmd", "shift"}, "J" }, |
||||
screen_up = { {"ctrl", "alt", "cmd", "shift"}, "K" }, |
||||
screen_full = { {"ctrl", "alt", "cmd", "shift"}, "F" }, |
||||
screen_left_up = { {"ctrl", "alt", "cmd", "shift"}, "Y" }, |
||||
screen_right_up = { {"ctrl", "alt", "cmd", "shift"}, "O" }, |
||||
screen_left_bottom = { {"ctrl", "alt", "cmd", "shift"}, "U" }, |
||||
screen_right_bottom = { {"ctrl", "alt", "cmd", "shift"}, "I" }, |
||||
} |
||||
|
||||
--- WinRectangle.animationDuration |
||||
--- Variable |
||||
--- Length of the animation to use for the window movements across the |
||||
--- screens. `nil` means to use the existing value from |
||||
--- `hs.window.animationDuration`. 0 means to disable the |
||||
--- animations. Default: `nil`. |
||||
obj.animationDuration = nil |
||||
|
||||
-- Internal functions to store/restore the current value of setFrameCorrectness and animationDuration |
||||
local function _setFC() |
||||
obj._savedFC = hs.window.setFrameCorrectness |
||||
obj._savedDuration = hs.window.animationDuration |
||||
hs.window.setFrameCorrectness = obj.use_frame_correctness |
||||
if obj.animationDuration ~= nil then |
||||
hs.window.animationDuration = obj.animationDuration |
||||
end |
||||
end |
||||
|
||||
local function _restoreFC() |
||||
hs.window.setFrameCorrectness = obj._savedFC |
||||
if obj.animationDuration ~= nil then |
||||
hs.window.animationDuration = obj._savedDuration |
||||
end |
||||
end |
||||
|
||||
-- Move current window to a different screen |
||||
function obj.moveCurrentWindowToScreen(how) |
||||
local win = hs.window.focusedWindow() |
||||
if win == nil then |
||||
return |
||||
end |
||||
_setFC() |
||||
if how == "left" then |
||||
win:moveOneScreenWest() |
||||
elseif how == "right" then |
||||
win:moveOneScreenEast() |
||||
end |
||||
_restoreFC() |
||||
end |
||||
|
||||
function obj.moveWindow(direction) |
||||
log.i("movie window to " .. direction) |
||||
local win = hs.window.focusedWindow() |
||||
local app = win:application() |
||||
local app_name = app:name() |
||||
local f = win:frame() |
||||
local screen = win:screen() |
||||
local max = screen:frame() |
||||
if direction == "left" then |
||||
f.x = max.x |
||||
f.y = max.y |
||||
f.w = (max.w / 2) |
||||
f.h = max.h |
||||
elseif direction == "right" then |
||||
f.x = (max.x + (max.w / 2)) |
||||
f.y = max.y |
||||
f.w = (max.w / 2) |
||||
f.h = max.h |
||||
elseif direction == "full" then |
||||
f.x = max.x |
||||
f.y = max.y |
||||
f.w = max.w |
||||
f.h = max.h |
||||
elseif direction == "up" then |
||||
f.x = max.x |
||||
f.y = max.y |
||||
f.w = max.w |
||||
f.h = (max.h / 2) |
||||
elseif direction == "down" then |
||||
f.x = max.x |
||||
f.y = max.y + (max.h / 2) |
||||
f.w = max.w |
||||
f.h = max.h / 2 |
||||
elseif direction == "leftUp" then |
||||
f.x = max.x |
||||
f.y = max.y |
||||
f.w = max.w / 2 |
||||
f.h = max.h / 2 |
||||
elseif direction == "rightUp" then |
||||
f.x = max.w / 2 |
||||
f.y = max.y |
||||
f.w = max.w / 2 |
||||
f.h = max.h / 2 |
||||
elseif direction == "leftBottom" then |
||||
f.x = max.x |
||||
f.y = max.h / 2 |
||||
f.w = max.w / 2 |
||||
f.h = max.h / 2 |
||||
elseif direction == "rightBottom" then |
||||
f.x = max.w / 2 |
||||
f.y = max.h / 2 |
||||
f.w = max.w / 2 |
||||
f.h = max.h / 2 |
||||
elseif direction == "normal" then |
||||
f.x = (max.x + (max.w / 8)) + 6 |
||||
f.y = max.y |
||||
f.w = (max.w * 3 / 4) - 12 |
||||
f.h = max.h |
||||
end |
||||
win:setFrame(f, 0.0) |
||||
end |
||||
|
||||
-- -------------------------------------------------------------------- |
||||
-- Shortcut functions for those above, for the hotkeys |
||||
-- -------------------------------------------------------------------- |
||||
|
||||
obj.oneScreenLeft = hs.fnutils.partial(obj.moveWindow, "left") |
||||
obj.oneScreenRight = hs.fnutils.partial(obj.moveWindow, "right") |
||||
obj.oneScreenDown = hs.fnutils.partial(obj.moveWindow, "down") |
||||
obj.oneScreenUp = hs.fnutils.partial(obj.moveWindow, "up") |
||||
obj.oneScreenFull = hs.fnutils.partial(obj.moveWindow, "full") |
||||
obj.oneScreenLeftUp = hs.fnutils.partial(obj.moveWindow, "leftUp") |
||||
obj.oneScreenRightUp = hs.fnutils.partial(obj.moveWindow, "rightUp") |
||||
obj.oneScreenLeftBottom = hs.fnutils.partial(obj.moveWindow, "leftBottom") |
||||
obj.oneScreenRightBottom = hs.fnutils.partial(obj.moveWindow, "rightBottom") |
||||
|
||||
--- WinRectangle:bindHotkeys(mapping) |
||||
--- Method |
||||
--- Binds hotkeys for WinRectangle |
||||
--- |
||||
--- Parameters: |
||||
--- * mapping - A table containing hotkey objifier/key details for the following items: |
||||
--- * screen_left, screen_right - move the window to the left/right screen (if you have more than one monitor connected, does nothing otherwise) |
||||
function obj:bindHotkeys(mapping) |
||||
local hotkeyDefinitions = { |
||||
screen_left = self.oneScreenLeft, |
||||
screen_right = self.oneScreenRight, |
||||
screen_down = self.oneScreenDown, |
||||
screen_up = self.oneScreenUp, |
||||
screen_full = self.oneScreenFull, |
||||
screen_left_up = self.oneScreenLeftUp, |
||||
screen_right_up = self.oneScreenRightUp, |
||||
screen_left_bottom = self.oneScreenLeftBottom, |
||||
screen_right_bottom = self.oneScreenRightBottom, |
||||
} |
||||
hs.spoons.bindHotkeysToSpec(hotkeyDefinitions, mapping) |
||||
return self |
||||
end |
||||
|
||||
return obj |
Loading…
Reference in new issue