想法,关于在 Emacs 中嵌入 Wayland 窗口

背景

在 Linux 下,X11 有提供 XReparentWindow 方法和 XEmbed 协议用于不同进程的窗口“套娃”

但 Wayland 没有类似的东西(出于安全性?),无法像 EAF 那样把窗口嵌入 Emacs(目前 EAF 在 Wayland 下是使用 xcb 后端曲线救国)

虽然纯 Wayland 现在还太早,但有个方案总是好的,刚好这两天看了相关文档,就把想法发出来讨论一下

方法

既然无法嵌入窗口,那就嵌入半个 Compositor

如图,Wayland 官方实现 Weston 跑在窗口模式,里面还跑了俩终端

嵌入到 Emcas 中的话可以简化一些,不需要窗口管理部分

Qt 的 QWayland 示例里也有一个将 Compositor 画到 OpenGL 的例子:https://code.qt.io/cgit/qt/qtwayland.git/tree/examples/wayland/qwindow-compositor?h=5.15 ,应该比较容易移植(注:这个例子比较旧,里面的 xdg-shell 版本是 v5,想跑 GTK 程序的话需升到 v6)

问题

就某种程度来讲,这可能比用 xcb 后端的曲线救国更曲线一点

得写个 emacs module。所有的输入都需要转发到 Compositor 内。部分扩展协议,比如输入法,需要单独转发。工作量巨大

但考虑到未来 Wayland 成为主流后,一些高级设置(如色彩管理,HDR,高分屏非整数倍缩放)和 X 的同步问题(好像目前就 GNOME 的 XWayland 缩放不糊),以及可能未来出现的某些更高级的显示技术不再支持 X,这些成本还算可以接受的……吧

1赞

其实也不是不可能。

Compositor 相当于 EAF 中的 QGraphicsView, 反而进程粘贴我不觉得是麻烦的事情,只不过手动调整Compositor窗口的位置、大小和是否隐藏?

噢还可以这样。我想的是像 emacs-webkit 那样拿到 Emacs 的 GtkFixed,然后从 QWaylandBufferRef 里拿输出塞到里面,但这么搞会混合 Qt 和 Gtk,比较罗嗦

emacs-webkit 只是把动态模块的view丢到emacs GtkFixed的坐标空间里去移动位置。

这和我6年前做的webkit-mode差不多,它其实没有解决compositor的问题。它一分屏就会导致创建两个webkit view的问题,这和我13年前做的haskell manatee遇到问题是一样的,进入一个死胡同,当分屏的时候会创建了两个webkit view,假设这个网页是一个电影页面,分屏会导致多个页面创建,很多声音会不同时发出,分屏越多越惨。

而EAF不管多少分屏,都是一个view的N个composite同步画面,这样就解决了多媒体窗口和emacs buffer/window的设计对应。

gtk自身是没有QGraphicsScence(buffer)和 QGraphicsView(view)的东西的,它需要借助外部xcompositor(效率低)和 wayland compositor(绑定wayland平台)。

键盘事件还好,因为只是对核心控件的事件伪造和转发的事情,gtk和qt都可以做到,主要是分屏后鼠标事件的坐标转换,特别是分屏大小不一样的时候,这里坐标转换需要很多工作,qt的QGraphicsView就是做这个事情的。GTK要处理这些也不是不可能,相当于要造整套QGraphicsSencse和QGraphicsView出来。

目前emacs-webkit的作者还没有意识到compositor的问题,他马上会遇到我上面说的这些难题。

EAF是很长时间的思考和积累的过程,Qt和Python的选型都是顺势而为的选择,我个人的GTK技术要比Qt熟悉很多,最终选择Qt就是上面思考过后的自然选择。

5赞

我一直比较反对这种唯GTK论的,技术情节决定技术方案的不理智行为。

Gtk目前没有好的解决方案,为啥不用Qt的现成成果呢?QWindow::setParent已经为windows平台用EAF打下基础。

Gtk和Wayland从跨平台角度去考虑只是把技术实现自我限定在GtkFixed和Wayland方案里。

1赞

https://lists.gnu.org/archive/html/emacs-devel/2020-11/msg01451.html

我在读关于emacs-webkit的邮件列表,其实作者已经意识到 compositor 的问题了,所以 emacs-webkit 现在不支持分屏操作,它只支持一个Windows显示 emacs-webkit 的内容。

其实作者可以采用EAF最开始采用的方案,通过 XComposite 并结合 XDamaga 协议实现类似的 QGraphicsSence/QGraphicsView 的技术,只不过 emacs-webkit 的作者是如此不喜欢 X11 的技术,估计 emacs-webkit 在很长的时间都很难支持Emacs分屏操作。

细想一下, emacs-webkit 是做个浏览器,我们平时浏览器用分屏的机会也不多吧?

其实很多,当你对比网上教材写代码的时候,主要是分屏后只有一个窗口显示浏览器,如果你需要切换窗口的时候,还需要调换一下位置。

我只是说 emacs-webkit 作者不应该太排斥X11的技术,这样可以实现的更加完整一点。

个人感觉既然已经用了waylan 却还要去安装x11 相关的东西,那不如直接用x11 了,另外xorg-wayland 有个问题,比如无法获取通过xorg-wayland 运行的窗口id,还有鼠标有时候会诡异的移动,,也可能是窗口管理器的问题

呃可能我没表达清楚,我只是想说之前并没有想到可以直接把 Compositor 窗口独立出来控制的这种方法(因为 Wayland 对不同进程窗口隔离比较彻底,而我忘了这是同进程),然后说了一下之前想到的方案,说 GtkFixed 也只是因为 Emacs 只支持它,并没有唯 GTK 不可的意思,突然这样有点吓人……

我说的 emacs-webkit 的作者哈,没有说你哈。

:sweat_smile: 是我想多了,实在是被这种“技术政治正确”吓怕了,全部都要 GNU 什么的