如何在嵌套的 mutter(wayland)窗口中打开 gnome-terminal

如何在嵌套的 mutter(wayland)窗口中打开 gnome-terminal

下列的这些说明我成功打开了一个新的空窗口,并验证了已经出现了一个新的 Wayland 套接字:

$ ls -alt /run/user/1000
...
-rw-------  1 craig craig 120 Oct 31 13:54 .mutter-Xwaylandauth.RN8CT0
srwxrwxr-x  1 craig craig   0 Oct 31 13:54 wayland-0
-rw-rw----  1 craig craig   0 Oct 31 13:54 wayland-0.lock
...
$ mutter --nested --wayland & 
(mutter:24172): mutter-WARNING **: 13:55:28.911: WL: unable to lock lockfile /run/user/1000/wayland-0.lock, maybe another compositor is running
$ ls -alt /run/user/1000
...
-rw-------  1 craig craig 120 Oct 31 13:55 .mutter-Xwaylandauth.M06TS0
srwxrwxr-x  1 craig craig   0 Oct 31 13:55 wayland-1
-rw-rw----  1 craig craig   0 Oct 31 13:55 wayland-1.lock
drwxr-xr-x  3 root  root   60 Oct 31 13:54 ..
-rw-------  1 craig craig 120 Oct 31 13:54 .mutter-Xwaylandauth.RN8CT0
srwxrwxr-x  1 craig craig   0 Oct 31 13:54 wayland-0
-rw-rw----  1 craig craig   0 Oct 31 13:54 wayland-0.lock
...

新的空窗口看起来就像一块空白的画布,我很确定它是表面wayland-1

wayland-1现在我尝试在该画布中打开一个 gnome 终端

WAYLAND_DISPLAY=wayland-1 gnome-terminal
WAYLAND_SOCKET=wayland-1 gnome-terminal

然而在这两种情况下,它都不会在画布中打开wayland-1,而是在画布外部打开。

如何在嵌套的 mutter(wayland) 窗口中打开 gnome-terminal?


编辑:我能够在嵌套画布中打开 Firefox:

MOZ_DBUS_REMOTE=1 GDK_BACKEND=wayland WAYLAND_DISPLAY=wayland-1 firefox

但是,用 替换firefox不起作用gnome-terminal——gnome-terminal仍然在 外面打开wayland-1

答案1

以下对我有用(从相对基本的 X11 会话开始):

export $(dbus-launch)
mutter --nested --wayland
WAYLAND_DISPLAY=wayland-0 gnome-terminal

如果您正在运行其他 Wayland 服务器,则wayland-0可能wayland-1如此。

答案2

在某些发行版中,gnome-terminal 运行“服务器”进程(在 Ubuntu 上,这是通过包装器脚本完成的,该脚本启动 /usr/libexec/gnome-terminal-server - 其他终端,如 mate-terminal,使用 --server 选项自动启动),该脚本拦截打开新终端进程的请求,并将它们作为同一单个服务器进程内的新窗口启动。因此,当您尝试在新的嵌套会话中启动新终端时,请求仍会被拦截,并且运行在 wayland-0 中的 gnome-terminal-server 进程会将其作为新窗口打开,该窗口位于其运行的同一显示器中,而不是您请求的显示器中。

最好的解决方法是使用选项传递一个唯一的应用程序 ID --app-id。例如:

WAYLAND_DISPLAY=wayland-1 gnome-terminal --app-id app.x

app.x是一个“反向 DNS 样式指示符”,因此对于我们的目的而言,只要它包含两个字母部分,以句点分隔,就可以了。应用程序 ID 的完整规则可在此处找到https://developer.gnome.org/documentation/tutorials/application-id.html。如果您运行两个嵌套的显示服务器,则需要两个单独的 app-id,如app.xapp.y

一些发行版(例如 Ubuntu)有一个包装器,当你运行 gnome-terminal 时会运行它,而真正的 gnome-terminal 可执行文件称为gnome-terminal.real。运行它将生成一个新进程,而不是子窗口,但是仅有的如果没有 gnome-terminal-server 进程正在运行(如果存在,它将使用它,并且您将获得您试图避免的相同行为)。

还有一个--no-factory选项,但它不再在手册页中列出,因此不应该期望它将来会继续工作。

相关内容