如何在i3窗口管理器下获取X11关联显示器的可见虚拟桌面?
解决方案:获取i3显示器当前可见的桌面
要在i3窗口管理器下获取单台显示器当前显示的桌面,核心是通过i3的IPC接口实现——Xlib/Gtk3本身并未直接暴露窗口管理器级别的桌面关联信息,以下是两种可行方案:
方法1:使用i3ipc-python库(推荐)
i3提供官方IPC接口,借助i3ipc库可直接查询显示器与桌面的关联状态:
- 安装依赖库:
pip install i3ipc
- 编写实现代码:
import i3ipc def get_current_desktop_for_monitor(monitor_xid): # 连接i3的IPC服务 i3 = i3ipc.Connection() # 获取所有工作区和显示器信息 workspaces = i3.get_workspaces() outputs = i3.get_outputs() # 匹配目标显示器的xid target_output = None for output in outputs: if int(output.id) == monitor_xid: target_output = output break if not target_output: return None # 查找该显示器当前激活的桌面 for workspace in workspaces: if workspace.output == target_output.name and workspace.visible: return workspace.num return None # 结合现有代码调用示例 # x11display = Gdk.get_default_root_window().get_display() # x11monitor = x11display.get_monitor_at_window(gtk_window) # monitor_xid = int(GdkX11.X11Monitor.get_output(x11monitor)) # current_desktop = get_current_desktop_for_monitor(monitor_xid)
方法2:直接调用i3-msg命令(无额外依赖)
如果不想引入第三方库,可直接执行i3-msg命令并解析JSON输出:
import subprocess import json def get_current_desktop_for_monitor(monitor_xid): # 获取显示器信息 output_result = subprocess.run( ["i3-msg", "-t", "get_outputs"], capture_output=True, text=True ) outputs = json.loads(output_result.stdout) # 定位目标显示器名称 target_output_name = None for output in outputs: if int(output["id"]) == monitor_xid: target_output_name = output["name"] break if not target_output_name: return None # 获取工作区信息并匹配可见桌面 workspace_result = subprocess.run( ["i3-msg", "-t", "get_workspaces"], capture_output=True, text=True ) workspaces = json.loads(workspace_result.stdout) for workspace in workspaces: if workspace["output"] == target_output_name and workspace["visible"]: return workspace["num"] return None
关键说明
- i3中每个显示器(output)关联的工作区里,只有
visible字段为True的是当前显示的桌面。 - Gdk获取的
xid需要转换为整数,才能和i3输出中的id字段匹配。 - 两种方法均依赖i3原生IPC接口,这是查询窗口管理器桌面状态的可靠方式,比Xlib直接查询更准确——桌面关联逻辑由i3自行维护,X协议未统一相关标准。
内容的提问来源于stack exchange,提问作者Robert Siemer
相关产品推荐
相关产品推荐

