如何在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
相关产品推荐
相关产品推荐

