From 908d8e22b18fbb9897e70e6b4ff1132b75d2948b Mon Sep 17 00:00:00 2001 From: Lukas Cech Date: Thu, 30 Jan 2025 09:13:00 +0100 Subject: [PATCH] Add window moving to hammerspoon --- home-manager/hammerspoon/window-move.lua | 15 ++ home-manager/hammerspoon/window-tiling.lua | 283 ++++++++++----------- home-manager/lcech-mac-veracode.nix | 1 + 3 files changed, 156 insertions(+), 143 deletions(-) create mode 100644 home-manager/hammerspoon/window-move.lua diff --git a/home-manager/hammerspoon/window-move.lua b/home-manager/hammerspoon/window-move.lua new file mode 100644 index 0000000..b098ced --- /dev/null +++ b/home-manager/hammerspoon/window-move.lua @@ -0,0 +1,15 @@ +(function() + local hyper = { "ctrl", "alt", "cmd" } + + -- move window to next screen + hs.hotkey.bind(hyper, "N", function() + local win = hs.window.focusedWindow() + win:moveToScreen(win:screen():next()) + end) + + for i = 1, 3 do + hs.hotkey.bind(hyper, "pad" .. i, function() + hs.window.focusedWindow():moveToScreen(i) + end) + end +end)() diff --git a/home-manager/hammerspoon/window-tiling.lua b/home-manager/hammerspoon/window-tiling.lua index 334f42c..bf53599 100644 --- a/home-manager/hammerspoon/window-tiling.lua +++ b/home-manager/hammerspoon/window-tiling.lua @@ -1,156 +1,153 @@ -hs.window.animationDuration = 0 -hs.window.setShadows(false) -local hyper = { "ctrl", "alt", "cmd" } +(function() + hs.window.animationDuration = 0 + hs.window.setShadows(false) + local hyper = { "ctrl", "alt", "cmd" } --- move window to next screen -hs.hotkey.bind(hyper, "N", function() - local win = hs.window.focusedWindow() - win:moveToScreen(win:screen():next()) -end) - -local wm = { - sizes = { 1 / 2, 2 / 3, 1 / 3 }, -} - -function wm:_nextStep(dim, offs, cb) - if hs.window.focusedWindow() then - local axis = dim == "w" and "x" or "y" - local oppDim = dim == "w" and "h" or "w" - local oppAxis = dim == "w" and "y" or "x" - local win = hs.window.frontmostWindow() - local screen = win:screen() - - local cell = hs.grid.get(win, screen) - - local nextSize = self.sizes[1] - for i = 1, #self.sizes do - if - cell[dim] == self.GRID[dim] * self.sizes[i] - and (cell[axis] + (offs and cell[dim] or 0)) == (offs and self.GRID[dim] or 0) - then - nextSize = self.sizes[(i % #self.sizes) + 1] - break - end - end - - cb(cell, nextSize) - if cell[oppAxis] ~= 0 and cell[oppAxis] + cell[oppDim] ~= self.GRID[oppDim] then - cell[oppDim] = self.GRID[oppDim] - cell[oppAxis] = 0 - end - - hs.grid.set(win, cell, screen) - end -end - -function wm:_fullscreen() - if hs.window.focusedWindow() then - local win = hs.window.frontmostWindow() - local screen = win:screen() - - local cell = hs.grid.get(win, screen) - - cell.x = 0 - cell.y = 0 - cell.w = self.GRID.w - cell.h = self.GRID.h - - hs.grid.set(win, cell, screen) - end -end - -function wm:_fullDimension(dim) - if hs.window.focusedWindow() then - local win = hs.window.frontmostWindow() - local id = win:id() - local screen = win:screen() - local cell = hs.grid.get(win, screen) - - if dim == "x" then - cell = "0,0 " .. self.GRID.w .. "x" .. self.GRID.h - else - cell[dim] = self.GRID[dim] - cell[dim == "w" and "x" or "y"] = 0 - end - - hs.grid.set(win, cell, screen) - end -end - -function wm:init() - self._pressed = { - up = false, - down = false, - left = false, - right = false, + local wm = { + sizes = { 1 / 2, 2 / 3, 1 / 3 }, } - self.GRID = { w = 24, h = 24 } - hs.grid.setGrid(self.GRID.w .. "x" .. self.GRID.h) - hs.grid.MARGINX = 0 - hs.grid.MARGINY = 0 + function wm:_nextStep(dim, offs, cb) + if hs.window.focusedWindow() then + local axis = dim == "w" and "x" or "y" + local oppDim = dim == "w" and "h" or "w" + local oppAxis = dim == "w" and "y" or "x" + local win = hs.window.frontmostWindow() + local screen = win:screen() - hs.hotkey.bind(hyper, "down", function() - self._pressed.down = true - if self._pressed.up then - self:_fullDimension("h") - else - self:_nextStep("h", true, function(cell, nextSize) - cell.y = self.GRID.h - self.GRID.h * nextSize - cell.h = self.GRID.h * nextSize - end) + local cell = hs.grid.get(win, screen) + + local nextSize = self.sizes[1] + for i = 1, #self.sizes do + if + cell[dim] == self.GRID[dim] * self.sizes[i] + and (cell[axis] + (offs and cell[dim] or 0)) == (offs and self.GRID[dim] or 0) + then + nextSize = self.sizes[(i % #self.sizes) + 1] + break + end + end + + cb(cell, nextSize) + if cell[oppAxis] ~= 0 and cell[oppAxis] + cell[oppDim] ~= self.GRID[oppDim] then + cell[oppDim] = self.GRID[oppDim] + cell[oppAxis] = 0 + end + + hs.grid.set(win, cell, screen) end - end, function() - self._pressed.down = false - end) + end - hs.hotkey.bind(hyper, "right", function() - self._pressed.right = true - if self._pressed.left then - self:_fullDimension("w") - else - self:_nextStep("w", true, function(cell, nextSize) - cell.x = self.GRID.w - self.GRID.w * nextSize - cell.w = self.GRID.w * nextSize - end) + function wm:_fullscreen() + if hs.window.focusedWindow() then + local win = hs.window.frontmostWindow() + local screen = win:screen() + + local cell = hs.grid.get(win, screen) + + cell.x = 0 + cell.y = 0 + cell.w = self.GRID.w + cell.h = self.GRID.h + + hs.grid.set(win, cell, screen) end - end, function() - self._pressed.right = false - end) + end - hs.hotkey.bind(hyper, "left", function() - self._pressed.left = true - if self._pressed.right then - self:_fullDimension("w") - else - self:_nextStep("w", false, function(cell, nextSize) - cell.x = 0 - cell.w = self.GRID.w * nextSize - end) + function wm:_fullDimension(dim) + if hs.window.focusedWindow() then + local win = hs.window.frontmostWindow() + local id = win:id() + local screen = win:screen() + local cell = hs.grid.get(win, screen) + + if dim == "x" then + cell = "0,0 " .. self.GRID.w .. "x" .. self.GRID.h + else + cell[dim] = self.GRID[dim] + cell[dim == "w" and "x" or "y"] = 0 + end + + hs.grid.set(win, cell, screen) end - end, function() - self._pressed.left = false - end) + end - hs.hotkey.bind(hyper, "up", function() - self._pressed.up = true - if self._pressed.down then - self:_fullDimension("h") - else - self:_nextStep("h", false, function(cell, nextSize) - cell.y = 0 - cell.h = self.GRID.h * nextSize - end) - end - end, function() - self._pressed.up = false - end) + function wm:init() + self._pressed = { + up = false, + down = false, + left = false, + right = false, + } + self.GRID = { w = 24, h = 24 } - hs.hotkey.bind(hyper, "m", function() - self:_fullscreen() - end) -end + hs.grid.setGrid(self.GRID.w .. "x" .. self.GRID.h) + hs.grid.MARGINX = 0 + hs.grid.MARGINY = 0 -wm:init() + hs.hotkey.bind(hyper, "down", function() + self._pressed.down = true + if self._pressed.up then + self:_fullDimension("h") + else + self:_nextStep("h", true, function(cell, nextSize) + cell.y = self.GRID.h - self.GRID.h * nextSize + cell.h = self.GRID.h * nextSize + end) + end + end, function() + self._pressed.down = false + end) -hs.notify.show("Welcome to Hammerspoon", "Have fun!", "") + hs.hotkey.bind(hyper, "right", function() + self._pressed.right = true + if self._pressed.left then + self:_fullDimension("w") + else + self:_nextStep("w", true, function(cell, nextSize) + cell.x = self.GRID.w - self.GRID.w * nextSize + cell.w = self.GRID.w * nextSize + end) + end + end, function() + self._pressed.right = false + end) + + hs.hotkey.bind(hyper, "left", function() + self._pressed.left = true + if self._pressed.right then + self:_fullDimension("w") + else + self:_nextStep("w", false, function(cell, nextSize) + cell.x = 0 + cell.w = self.GRID.w * nextSize + end) + end + end, function() + self._pressed.left = false + end) + + hs.hotkey.bind(hyper, "up", function() + self._pressed.up = true + if self._pressed.down then + self:_fullDimension("h") + else + self:_nextStep("h", false, function(cell, nextSize) + cell.y = 0 + cell.h = self.GRID.h * nextSize + end) + end + end, function() + self._pressed.up = false + end) + + hs.hotkey.bind(hyper, "m", function() + self:_fullscreen() + end) + end + + wm:init() + + hs.notify.show("Welcome to Hammerspoon", "Have fun!", "") + +end)() diff --git a/home-manager/lcech-mac-veracode.nix b/home-manager/lcech-mac-veracode.nix index 55112a4..2fe3854 100644 --- a/home-manager/lcech-mac-veracode.nix +++ b/home-manager/lcech-mac-veracode.nix @@ -43,6 +43,7 @@ in "${homedir}/.hammerspoon/init.lua" = { text = '' ${builtins.readFile ./hammerspoon/window-tiling.lua} + ${builtins.readFile ./hammerspoon/window-move.lua} ''; }; };