Wayland中如何通过点击来识别窗口

Wayland中如何通过点击来识别窗口

我想确定一个窗口属于 Wayland 中的哪个进程。有没有像xpropX 那样允许用户通过单击来选择窗口并输出所有窗口详细信息(包括 PID)的东西?

答案1

好消息,Gnome Shell 中内置了类似的东西,与xpropXorg不同韦兰。如果您使用 KDE、i3 或其他工具,最终这可能属于其他工具的范畴。

首先,在键盘上键入“ALT+F2”键,这将弹出一个如下菜单:

替代英尺

出现之后,发出命令lg(“镜子”)。

然后,这将打开观察玻璃窗口,我们可以从中提取窗口信息。从镜子的右上角选择“窗口”:

窗户部分

从那里,您将看到一个窗口列表,您可以从中单击要识别的窗口的名称。

列表

在本例中,我选择了 gedit 作为示例:

编辑器

在该输出的第一行中,您可能会注意到:

Inspecting object: object instance proxy GType: MetaWindowX11 ...

“GType”将是MetaWindowX11或之一MetaWindowWayland

此信息来自https://fedoraproject.org/wiki/How_to_debug_Wayland_problems

答案2

我意识到这是特别缺乏的东西,所以我创建了一个要点来做到这一点。

看哪:wlprop

wlprop在终端中输入并单击一个窗口,它将为您提供该特定窗口的 sway 树输出:

$ wlprop
# A prompt to select a window will appear
{
  "id": 72,
  "type": "con",
  "orientation": "none",
  "percent": 0.5002881844380404,
  "urgent": false,
  "marks": [],
  "focused": false,
  "layout": "none",
  "border": "pixel",
  "current_border_width": 2,
  "rect": {
    "x": 0,
    "y": 26,
    "width": 868,
    "height": 1130
  },
  "deco_rect": {
    "x": 0,
    "y": 0,
    "width": 0,
    "height": 0
  },
  "window_rect": {
    "x": 2,
    "y": 2,
    "width": 864,
    "height": 1126
  },
  "geometry": {
    "x": 0,
    "y": 0,
    "width": 1328,
    "height": 858
  },
  "name": "How to identify window by clicking in Wayland - Unix & Linux Stack Exchange — Mozilla Firefox",
  "window": null,
  "nodes": [],
  "floating_nodes": [],
  "focus": [],
  "fullscreen_mode": 0,
  "sticky": false,
  "pid": 47844,
  "app_id": "firefox",
  "visible": true,
  "max_render_time": 0,
  "shell": "xdg_shell",
  "inhibit_idle": false,
  "idle_inhibitors": {
    "user": "none",
    "application": "none"
  }
}

您可以使用以下方法按特定元素进行过滤jq

$ wlprop | jq -r '.name'
# The same prompt will appear
How to identify window by clicking in Wayland - Unix & Linux Stack Exchange — Mozilla Firefox

希望这个解决方案足够优雅,能够填补xprop每个人心中的空洞

答案3

xdg-foreign协议扩展草案,它允许获取wl_surface由其他 Wayland 客户端创建的 的句柄。有了这个句柄,您就可以从中获得任何可以从客户端表面获得的东西。然而,该协议仍然有局限性:

  • 显然,如果不在客户端中实现,它就不会起作用。
  • 它的目标客户是知道彼此之间,因此它不提供触发它的方法:您的客户端以某种方式与外部客户端进行通信,扩展不包括在内。然后,外国客户端通过此扩展为您的客户端发布一个句柄。
  • 与 相比,它获得了太多的控制权xprop。事实上,你甚至可以在外国表面上画画!

因此,这不太可能成为任何客户端从任何客户端获取表面参数的通用方法。但不要失去希望:科技史上有很多例子,最初为某种目的而设计的一项技术后来被广泛用于其他目的,就像汽车点烟器或 Android 中的辅助功能 API 一样。此外,将来可能会出现更适合您的任务的协议扩展,因为肯定需要它(例如,时间跟踪器)。

答案4

在 Sway 中,您可以针对 来 grep 查找您的应用程序swaymsg -t get_tree,这类似于xprop, 但同时针对所有窗口。

相关内容