Hammerspoon 窗口管理在第二个显示器上无法按预期工作
2020-3-17 18:53:50
收藏:0
阅读:171
评论:2
我对 Lua 和 Hammerspoon 还不熟悉,但我真的无法弄清楚为什么以下代码在我的主屏幕上工作正常,但是在我的第二个显示器上位置循环不起作用。在第二个显示器上按下快捷键启用第一位置,但第二次按下无效。
阅读文档,hs.screen.mainScreen() 启用了当前有焦点的屏幕,所以它应该会工作?
顺带一提...第二个显示器实际上物理上是与主显示器相同,正在运行 PBP(否则显卡无法处理分辨率)
我只贴出了我认为相关的代码如下:
local rightScreen = hs.screen.primaryScreen(0x600003f98880)
local leftScreen = rightScreen:toWest()
function bindKey(key, fn)
hs.hotkey.bind({"cmd", "ctrl","alt"}, key, fn)
end
grid = {
{key="q", units={positions.leftthird, positions.left50, positions.left66}},
{key="w", units={positions.middlethird}},
{key="e", units={positions.rightthird}},
{key="r", units={positions.left50, positions.lower50Left50, positions.upper50Left50, positions.upper50, positions.lower50}}, -- 在第二屏不起作用
{key="t", units={positions.right50, positions.lower50Right50, positions.upper50Right50, positions.upper50, positions.lower50}}, -- 在第二屏不起作用
}
hs.fnutils.each(grid, function(entry)
bindKey(entry.key, function()
local units = entry.units
local screen = hs.screen.mainScreen()
local window = hs.window.focusedWindow()
local windowGeo = window:frame()
local index = 0
hs.fnutils.find(units, function(unit)
index = index + 1
local geo = hs.geometry.new(unit):fromUnitRect(screen:frame()):floor()
return windowGeo:equals(geo)
end)
if index == #units then index = 0 end
window:moveToUnit(units[index + 1])
end)
end)
点赞
用户3948869
我正在修改 ArrangeDesktop 糖匙来帮助保存和安排窗口位置。这可能会对你有所帮助。
2022-06-23 20:56:31
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

最好的建议是我可以发布我自己为类似目的编写的代码,已经使用了三年多,而且在内部和外部显示器上都能完美地工作。正如您所看到的,我正在使用
win:setFrame而不是:moveToUnit。很抱歉无法帮助调试您的问题,因为我已经忘记了Lua和Hammerspoon......希望能有所帮助。function coords () return hs.window.focusedWindow(), hs.window.focusedWindow():frame(), hs.window.focusedWindow():screen(), hs.window.focusedWindow():screen():frame() end hs.hotkey.bind({"cmd", "alt", "ctrl"}, "left", function() local win, wf, scr, sf = coords() if wf.x <= sf.x and wf.w <= math.floor(sf.w/3) then wf.x = sf.x wf.w = math.floor(sf.w/4) elseif wf.x <= sf.x and wf.w <= math.floor(sf.w/2) then wf.x = sf.x wf.w = math.floor(sf.w/3) else wf.x = sf.x wf.w = math.floor(sf.w/2) end wf.y=sf.y wf.h=sf.h win:setFrame(wf, 0) end) hs.hotkey.bind({"cmd", "alt", "ctrl"}, "right", function() local win, wf, scr, sf = coords() if wf.x >= math.floor(sf.x + sf.w/3) and wf.w <= math.floor(sf.w/3) then wf.w = sf.w/4 wf.x = math.floor(sf.x + 3 * sf.w/4) elseif wf.x >= math.floor(sf.x + sf.w/2) and wf.w <= math.floor(sf.w/2) then wf.w = sf.w/3 wf.x = math.floor(sf.x + 2 * sf.w/3) else wf.w = sf.w/2 wf.x = math.floor(sf.x + sf.w/2) end wf.y=sf.y wf.h=sf.h win:setFrame(wf, 0) end) hs.hotkey.bind({"cmd", "alt", "ctrl"}, "up", function() local win, wf, scr, sf = coords() win:setFrame(sf, 0) end) hs.hotkey.bind({"cmd", "alt", "ctrl"}, "down", function() local win, wf, scr, sf = coords() if wf.x ~= math.floor(sf.x + sf.w/3) and wf.w ~= math.floor(sf.w/3) then wf.w = math.floor(sf.w/3) wf.x = math.floor(sf.x + sf.w/3) else wf.w = sf.w/2 wf.x = math.floor(sf.x + sf.w/4) end wf.y=sf.y wf.h=sf.h win:setFrame(wf, 0) end)