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

如何在i3窗口管理器下获取X11关联显示器的可见虚拟桌面?

解决方案:获取i3显示器当前可见的桌面

要在i3窗口管理器下获取单台显示器当前显示的桌面,核心是通过i3的IPC接口实现——Xlib/Gtk3本身并未直接暴露窗口管理器级别的桌面关联信息,以下是两种可行方案:

方法1:使用i3ipc-python库(推荐)

i3提供官方IPC接口,借助i3ipc库可直接查询显示器与桌面的关联状态:

  1. 安装依赖库:
pip install i3ipc
  1. 编写实现代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:31:01