背景
在 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,这些成本还算可以接受的……吧