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

画面同步主要是照顾Emacs的视窗分屏设计,如果不做画面同步浏览器应用就会导致多实例的问题。 画面同步只要在 X11 Server端做,避免 Sever-Client 之间拷贝大量图形数据都不会卡顿。

我在EAF主要用 QGraphicsScene 和 QGraphicsView 来分别实现Emacs中 Buffer 和 View 的概念,Qt这两个库都是基于GPU来实现的,效率很高,而且支持Windows, Mac, Linux、 BSD等多个平台。

GDK的实现问题是只能兼顾Linux平台,不同平台要用不同的图形服务来分别写代码,维护代价要比EAF这种实现大很多,相当于在Emacs中实现跨平台的图形绘制API.

GSteamer我觉得没啥必要,API太复杂了,视频绘制Gtk/Qt默认的控件就足够了,如果视频编辑, 浏览器+JavaScript库就好了。

是啊,xwidget这种目标就是要在Server端实现才会不闪烁不卡顿。

GdkOffscreenWindow 支持任何 GDK 支持的平台,也包括 GNU/Linux 以外的各种 Unix 版本,和 MS Windows(不过这里的代码还依赖于 X-Windows)。而且,只要支持 XRender 和 MIT-SHM,GdkOffscreenWindow 中也能做到硬件加速,基本上不需要担心性能问题。

GStreamer widget 也做到了完整的画面同步,不会出现多实例问题。

我个人认为维护成本不是问题,而 EAF 的方式是无法在 Wayland 上实现的,因为 Wayland 禁止应用任意排放窗口。

2 个赞

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技术的弹窗框架 - #89,来自 manateelazycat

按照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: