Windows平台折腾 X11 Sever 还是很麻烦的, Qt的Window::reparent已经实现了各操作系统原生图形接口的对接,Gdk理论上可以跑,但是在非Linux平台还是太折腾。
至于Wayland native我不是很Care, 只要XWayland可以跑就行了, Qt Window::reparent 技术的好处是,我们根本不用关心Emacs的内部实现,粘贴窗口上去就好了,跨平台特性也好。
EAF项目的目标有三个:
- 引入Qt和浏览器,扩展Emacs多媒体绘制能力
- 不要大改Emacs, 在Emacs支持多个平台的代码发展速度太慢了,从零用C语言在Emacs中写所有功能代码,编译发布周期都太长
- 脚本话开发多媒体应用,通过IPC的方式借力其他语言的现有生态(包括多线程、Python、NPM、JS等生态),尽最大可能利用现有生态
Anyway, 支持你继续开发xwidget, 始终是好事。
EAF主要是满足我个人集成多媒体/多线程应用到Emacs的初心,同时也不想和GNU派在邮件列表讨论为啥代码不是free software, 和xwidget的发展方向不一致。
2 个赞
K-gihu
22
如果实现了这个,或许可以期待以后在 org 文件里使用 mathjax 渲染数学公式,不是插入生成的图片了…别的图片也可以用web技术渲染?
其实不管 xwidget 还是 EAF 类似的技术都可以实现 org-mode 直接浏览器控件和文本内容混排。
从原理上只需要解决两个问题:
- 多个View对于一个Widget的画面同步,避免Emacs分屏后的多实例问题
- 结合 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多个)有没有人兴趣折腾的。
- Fork EAF基础设施,包括多语言IPC互调用框架(Elisp <-> Python <-> JS), 为后续引用JS库渲染 org-mode 内容打基础
- 需要针对 org-mode 开发 overlay 插件,主要针对多媒体内容实现空间占位符, overlay 本身也可以和现有Emacs文本编辑函数做交互
- 用Qt或者浏览器来渲染 org-mode 多媒体内容,并根据实际大小调整 overlay 占位符
- 用 Qt::reparent 技术粘贴 Qt 或浏览器窗口到 Emacs 窗口上
- org-mode buffer 切换后,隐藏 Qt或浏览器 窗口,关闭就销毁这些窗口
- 根据 org-mode buffer 的可视空间,对超出可视空间的 Qt或浏览器 窗口做 input/clip mask, 保证超出区域不展示多媒体内容,完全超出的控件暂时隐藏,方便 org-mode 来回滚动
以上就是利用EAF完整实现 org-mode 混排的完整逻辑,实现后可以具备如下优势:
- 和EAF一样跨平台支持
- 性能非常好,任何版本的Emacs都支持
- 像 org-mode 里面的图片、视频、LaTeX、数学公式、MathLab、URL预览统统可以支持
- 开发快,马上利用 Python 和 JS 生态开发预览插件,可以参考一下 popweb 的插件编写速度
- overlay本身可以作为多媒体控件和文本混排的交互边界,比如删除overlay就可以马上把 org-mode 的视频预览给删除了,对 org-mode 本身的文本内容也没啥侵入性
考虑到 org-mode 太复杂,分享一下我的理论思路,除了步骤6 input/clip mask需要对图形编程比较熟悉外,其他都是EAF现有技术。
5 个赞
Vitaly
25
太遗憾了,我只想要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 在高清屏幕上运行应用没有增大画面吗?我听说平常会导致画面模糊。
EAF自己已经做了DPI处理,包括Gnome, KDE等窗口管理器,所以非常清晰。
XWayland的环境, Gnome3 已经做了很好的启动DPI设置,默认就能正常工作。
我一直在XWayland 4k的环境下工作,没有任何不清晰的情况。
我比较好奇, 你是 haiku 全职开发者吗, 这个系统现在主要是什么人在使用?