【问题标题】:Is there something like "awful.client.focus.global_byidx()"?有没有像“awful.client.focus.global_byidx()”这样的东西?
【发布时间】:2023-03-05 04:26:01
【问题描述】:

我有两台显示器,我想通过快捷方式更改客户端。现在我有awful.client.focus.byidx(1),但它只在一台显示器上更改客户端。我知道有awful.client.focus.global_bydirection("right") 可以在多个屏幕上工作,但它只指向一个方向,并且在到达最后一个客户时停止工作。我喜欢 awful.client.focus.byidx(1) 循环遍历所有客户端的行为,所以从最后一个客户端到第一个客户端。

我想在以下两者之间使用混合:像awful.client.focus.byidx(1) 那样通过客户端,但在像awful.client.focus.global_bydirection("right") 这样的所有监视器/屏幕上。是否有具有该行为的功能以便我可以使用它?如果没有,你知道我怎样才能实现这个目标吗?

【问题讨论】:

    标签: lua client focus awesome-wm


    【解决方案1】:

    首先,我们来看看awful.client.focus.byidx是如何实现的。

    函数本身调用awful.client.next,然后聚焦返回的客户端,如果找到的话:

    https://github.com/awesomeWM/awesome/blob/9781f14b105ee700c5bca339bf49bb52d2cca4b5/lib/awful/client/focus.lua#L65-L71

    awful.client.next在这里实现:https://github.com/awesomeWM/awesome/blob/9781f14b105ee700c5bca339bf49bb52d2cca4b5/lib/awful/client.lua#L262-L284

    它执行以下操作:

    • 第 263 行:获取当前关注的客户
    • 第 267 行:获取可见客户端屏幕上的所有可见客户端
    • 第 270-274 行:从列表中过滤掉无法聚焦的客户
    • 第 277 - 278 行:在结果列表中找到焦点客户
    • 第 280 行:获取所需偏移量的客户端并返回

    因此,您的请求听起来您只需要在此处更改一步:获取所有可见客户端的列表,而不是仅获取当前聚焦屏幕上的那些。 要获取该列表,您需要使用 nil 而不是特定屏幕调用 awful.client.visible

    未经测试的代码:

    function next_global(i, sel, stacked)
      sel = sel or client.focus
      if not sel then return end
      local cls = awful.client.visible(nil, stacked)
      local fcls = {}
      for _, c in ipairs(cls) do
        if awful.client.focus.filter(c) or c == sel then
          table.insert(fcls, c)
        end
      end
      cls = fcls
      for idx, c in ipairs(cls) do
        if c == sel then
          return cls[gears.math.cycle(#cls, idx + i)]
        end
      end
    end
    function focus_byidx_global(i, c)
      local target = next_global(i, c)
      if target then
        target:emit_signal("request::activate", "client.focus.byidx", {raise=true})
      end
    end
    

    我不知道您使用的是哪个版本的 AwesomeWM。如果有疑问,请查看/usr/share/awesome/lib/ 中的已安装文件并从那里复制代码,然后进行更改。

    (一个更丑陋的解决方案类似于以下,即使它需要更少的代码;我把它留给读者作为练习,让读者弄清楚这是做什么的,但请注意,这会“破坏东西”,以防万一发生 Lua 错误,monkey-patching 变为永久)

    function focus_byidx_global(i, c)
      local old = awful.client.visible
      awful.client.visible = function(_, s) return old(nil, s) end
      awful.client.focus.byidx(i, c)
      awful.client.visible = old
    end
    

    【讨论】:

      猜你喜欢
      • 2013-07-30
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多