You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AwesomeWM中设置始终单活动屏幕并实现外接屏自动切换?

AwesomeWM Git版实现单屏幕自动切换方案

针对你的需求(插拔外接显示器时自动迁移所有窗口/工作区到唯一活动屏幕),可以通过AwesomeWM的屏幕信号监听+xrandr输出控制来实现,以下是具体步骤:

1. 确认屏幕名称

先通过xrandr --query命令查看你的内置屏和外接屏的准确名称,Zephyrus G14的内置屏通常是eDP-1,外接屏可能是HDMI-1/DP-1这类,记下来备用。

2. 在rc.lua中添加信号处理代码

将以下代码添加到你的AwesomeWM配置文件(~/.config/awesome/rc.lua)中,记得替换代码里的屏幕名称为你实际查到的:

-- 替换为你的实际屏幕名称
local internal_screen = "eDP-1"
local external_screen = "HDMI-1"

-- 监听外接屏插入事件
screen.connect_signal("added", function(s)
    if s.name == external_screen then
        -- 关闭内置屏,启用外接屏作为唯一输出
        awful.spawn.with_shell("xrandr --output " .. internal_screen .. " --off --output " .. external_screen .. " --auto --primary")
        
        -- 延迟执行,确保屏幕切换完成
        gears.timer.delayed_call(function()
            local target_screen = screen[external_screen]
            if not target_screen then return end
            
            -- 将所有工作区迁移到外接屏
            for _, tag in ipairs(root.tags()) do
                tag.screen = target_screen
            end
            
            -- 强制迁移所有窗口(如果工作区迁移后窗口没跟上)
            for _, c in ipairs(client.get()) do
                c.screen = target_screen
            end
            
            -- 将焦点切换到外接屏
            target_screen:emit_signal("request::activate", "screen_switch", {raise = true})
        end)
    end
end)

-- 监听外接屏拔出事件
screen.connect_signal("removed", function(s)
    if s.name == external_screen then
        -- 启用内置屏作为唯一输出
        awful.spawn.with_shell("xrandr --output " .. external_screen .. " --off --output " .. internal_screen .. " --auto --primary")
        
        gears.timer.delayed_call(function()
            local target_screen = screen[internal_screen]
            if not target_screen then return end
            
            -- 将所有工作区迁移回内置屏
            for _, tag in ipairs(root.tags()) do
                tag.screen = target_screen
            end
            
            -- 强制迁移所有窗口
            for _, c in ipairs(client.get()) do
                c.screen = target_screen
            end
            
            -- 将焦点切换到内置屏
            target_screen:emit_signal("request::activate", "screen_switch", {raise = true})
        end)
    end
end)

3. 额外优化与注意事项

  • 如果你的外接屏有多个可能的连接方式(比如同时支持HDMI和DP),可以修改added信号的判断逻辑,比如检查s.name ~= internal_screen来匹配所有非内置屏
  • 测试时可以手动执行xrandr命令模拟屏幕插拔,比如xrandr --output HDMI-1 --auto触发添加事件,xrandr --output HDMI-1 --off触发移除事件
  • 因为你用的是AwesomeWM Git版,gears.timer.delayed_call是原生支持的,用来避免屏幕切换未完成就执行工作区迁移导致的异常
  • 如果遇到部分窗口无法迁移的情况,可以在客户端的manage信号中添加逻辑,确保新窗口始终在当前活动屏幕上:
client.connect_signal("manage", function(c)
    if awesome.startup then
        c.screen = awful.screen.focused()
    end
end)

内容的提问来源于stack exchange,提问作者Matthew Bonnette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:35:19