沉寂 2 年多的 xwidget 迎来了 Po Lu 大神的大量更新

Windows平台折腾 X11 Sever 还是很麻烦的, Qt的Window::reparent已经实现了各操作系统原生图形接口的对接,Gdk理论上可以跑,但是在非Linux平台还是太折腾。

至于Wayland native我不是很Care, 只要XWayland可以跑就行了, Qt Window::reparent 技术的好处是,我们根本不用关心Emacs的内部实现,粘贴窗口上去就好了,跨平台特性也好。

EAF项目的目标有三个:

  1. 引入Qt和浏览器,扩展Emacs多媒体绘制能力
  2. 不要大改Emacs, 在Emacs支持多个平台的代码发展速度太慢了,从零用C语言在Emacs中写所有功能代码,编译发布周期都太长
  3. 脚本话开发多媒体应用,通过IPC的方式借力其他语言的现有生态(包括多线程、Python、NPM、JS等生态),尽最大可能利用现有生态

Anyway, 支持你继续开发xwidget, 始终是好事。

EAF主要是满足我个人集成多媒体/多线程应用到Emacs的初心,同时也不想和GNU派在邮件列表讨论为啥代码不是free software, 和xwidget的发展方向不一致。

2 个赞

如果实现了这个,或许可以期待以后在 org 文件里使用 mathjax 渲染数学公式,不是插入生成的图片了…别的图片也可以用web技术渲染?

其实不管 xwidget 还是 EAF 类似的技术都可以实现 org-mode 直接浏览器控件和文本内容混排。

从原理上只需要解决两个问题:

  1. 多个View对于一个Widget的画面同步,避免Emacs分屏后的多实例问题
  2. 结合 Emacs Buffer的视图对图形控件做实时的 Clip 或 Mask 操作

如果EAF类似的技术,需要用这个逻辑去处理:popweb,基于Web技术的弹窗框架

按照Po Lu现在的实现方式,也许更快可以支持 org-mode 的内容混排,但是我认为 xwidget 加入 org-mode 后最重要的就是要处理光标、像素滚动、块逻辑等处理,因为 org-mode 本身用法太复杂,我不认为 xwidget/EAF 类似技术支持混排后在短时间内能达到大家期望的那种效果。

1 个赞

我自己不用 org-mode, 也没有时间跳这个神坑,但是可以写一下用EAF技术实现 org-mode 多媒体(图片、视频、网页等)混排的完整思路,看看EAF现有开发者(70多个)有没有人兴趣折腾的。

  1. Fork EAF基础设施,包括多语言IPC互调用框架(Elisp <-> Python <-> JS), 为后续引用JS库渲染 org-mode 内容打基础
  2. 需要针对 org-mode 开发 overlay 插件,主要针对多媒体内容实现空间占位符, overlay 本身也可以和现有Emacs文本编辑函数做交互
  3. 用Qt或者浏览器来渲染 org-mode 多媒体内容,并根据实际大小调整 overlay 占位符
  4. 用 Qt::reparent 技术粘贴 Qt 或浏览器窗口到 Emacs 窗口上
  5. org-mode buffer 切换后,隐藏 Qt或浏览器 窗口,关闭就销毁这些窗口
  6. 根据 org-mode buffer 的可视空间,对超出可视空间的 Qt或浏览器 窗口做 input/clip mask, 保证超出区域不展示多媒体内容,完全超出的控件暂时隐藏,方便 org-mode 来回滚动

以上就是利用EAF完整实现 org-mode 混排的完整逻辑,实现后可以具备如下优势:

  1. 和EAF一样跨平台支持
  2. 性能非常好,任何版本的Emacs都支持
  3. 像 org-mode 里面的图片、视频、LaTeX、数学公式、MathLab、URL预览统统可以支持
  4. 开发快,马上利用 Python 和 JS 生态开发预览插件,可以参考一下 popweb 的插件编写速度
  5. overlay本身可以作为多媒体控件和文本混排的交互边界,比如删除overlay就可以马上把 org-mode 的视频预览给删除了,对 org-mode 本身的文本内容也没啥侵入性

考虑到 org-mode 太复杂,分享一下我的理论思路,除了步骤6 input/clip mask需要对图形编程比较熟悉外,其他都是EAF现有技术。

5 个赞

太遗憾了,我只想要wayland native,xwayland问题不少

请问下什么时候引入的呢?我编译了最新的Emacs29,发现还是不行,需要设置字体么?

没事,EAF的目标是让任意emacs版本都可以使用多媒体图形应用。

我不觉得xwayland会消失,如果emacs只支持wayland那才叫遗憾呢,哈哈哈哈。

顺便提醒一下,emacs 29 的滚动代码会用 XQueryTree 找到 child window,再把滚动范围中的 Window 都移动到正确的位置,可能会对 EAF 造成影响。如果受到影响麻烦告诉一声,我会想办法解决。谢谢。

EAF只需要能获取正确的XID并能支持xwayland就行了,EAF对emacs内部实现应该没有依赖,感谢提醒😘

Wayland surface 在 XWayland 中没有对应的 XID,由于安全考虑无法通过 Xwayland 或任何其他方式 reparent

现在EAF是通过 (frame-parameter frame 'window-id) 来获取xid的,你的意思是以后emacs这个函数会失效?

是的,比如说 PGTK 只会提供 Emacs address space 中对 GdkWindow 的一个指针,对其他进程没有用处。Wayland 也不允许不是创建 surface 的进程(包括 Xwayland)改变 surface 的参数或往上面 reparent window

没有编译选项支持x11?只允许wayland native跑不太妥吧?

有编译选项,但是在 XWayland 下运行应用限制还是比较多,比如说不支持高清屏幕

有编译选项就行,我就是4k屏,xwayland跑的很欢快。

Xwayland 在高清屏幕上运行应用没有增大画面吗?我听说平常会导致画面模糊。

都是瞎说的,不会模糊,把DPI设置好就行了。:wink:

xwayland的hidpi一直不完美吧,得等这个补丁完整进去后 https://blog.lilydjwg.me/2021/11/20/wayfire-migration-2.215977.html https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/733

EAF自己已经做了DPI处理,包括Gnome, KDE等窗口管理器,所以非常清晰。

XWayland的环境, Gnome3 已经做了很好的启动DPI设置,默认就能正常工作。

我一直在XWayland 4k的环境下工作,没有任何不清晰的情况。

我比较好奇, 你是 haiku 全职开发者吗, 这个系统现在主要是什么人在使用?