Hammerspoon 窗口管理在第二个显示器上无法按预期工作

我对 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)
点赞
用户34704
用户34704

最好的建议是我可以发布我自己为类似目的编写的代码,已经使用了三年多,而且在内部和外部显示器上都能完美地工作。正如您所看到的,我正在使用 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)
2020-03-18 12:33:45
用户3948869
用户3948869

我正在修改 ArrangeDesktop 糖匙来帮助保存和安排窗口位置。这可能会对你有所帮助。

2022-06-23 20:56:31