现代编写窗口管理器的方法

18

我正尝试编写一个窗口管理器。(实际上,我已经写了一个操作系统和一个编译器,但那不是重点。)

XLib和xcb并不像win32标准那样令人讨厌,但它们确实非常老旧,难以很好地抽象出使我的生活更轻松的良好抽象层。不仅如此,现代高级语言的绑定也缺乏。

我的问题是:这些低级东西真的必要吗?是否存在库可以为我封装所有难搞的东西?我有一个模糊的记忆,认为Enlightenment的人已经做过这样的事情,但找不到任何东西。或者像GDK这样的现代部件库是否具有足够的功能,我不需要接触Xlib层了吗?

任何具有Java绑定的库都特别感兴趣...


不错的问题。你是否只需要逐像素渲染能力?可能有一些技巧,但这是我开始的方式。 - Blender
我会看一下kwin、metacity、compiz和/或enlightenment。就我个人而言,我喜欢底层,并且只看过使用原始Xlib完成的WM。希望有点运气,Havoc Pennington会注意到这个问题 :) - ninjalj
Haskell有相当不错的X11绑定,这些绑定被用来编写窗口管理器Xmonad。 - wnoise
请参见https://dev59.com/KXI-5IYBdhLWcg3whYwr。 - Josh Lee
2个回答

9
如果你所说的“低级别东西”是指C语言,那么从技术角度来看,不是必需的;你可以使用XCB的XML生成任何语言的绑定。
但是,如果你所说的“低级别东西”是指在X协议级别上处理,那么是必需的(如果你不想把头发都拔光)。窗口管理器必须在X11协议级别上工作,因此使用某些“高级别”的东西只会让你的生活更加困难。事实上,XCB的创建正是因为Xlib太高级了,掩盖了太多底层信息,这样容易犯错误,并且难以或不可能完全控制。(此外,从X的角度来看,XCB并不是“非常古老”的;只有在最近几年,所有主要的Linux发行版才开始完全使用XCB。)

1
好的答案。最好的高级方法可能是从现有的 WM 开始。此外,一个选择是使用 JavaScript,就像 Gnome-Shell 一样。如果您考虑使用其他编程语言,XCB 和 gobject-introspection 都可以为您提供自动生成语言绑定的工具。 - Havoc P
顺便提一下,由于未来的方向是窗口管理器必须也作为组件管理器工作,而总体来说这有点像火箭科学,如果你的目标是替代UI,那么使用gnome-shell的C部分并交换JavaScript部分(或多或少)会有很大的争议。UI决策应该主要在JS中进行,但旧的metacity位和clutter C位中的绘图循环和低级别的gunge。 - Havoc P
1
我尊重地不同意:窗口管理器似乎没有什么特别奇异的东西,除了特殊的窗口管理器事件和XGrabKey()。事实上,自从我发了我的问题后,我一直在使用gdk进行编程,并且它几乎可以做到我想要的许多事情;我已经编写了几乎完全从GdkWindow领域管理窗口的代码(以非常原始的方式)。遗憾的是,它没有做到的事情相当危险。特别是,gdk对键盘输入做了非常奇怪的处理,如果XInput可用,则会忽略KeyPress和KeyRelease。猜猜XGrabKey()发送哪些事件?正确。 - David Given
我还要补充一点,gdk 在某种程度上是 xlib 的一个薄包装器,这对我帮助很大。因此,我在 gdk 中主要实现了我在 xlib 中使用的相同逻辑。虽然 gdk 让它变得不那么烦人了。我仍在寻找一个像样的 WM 抽象层;也许我的概念验证代码会成为其中之一。 - David Given

7
这是一个晚回答,所以可能已经不太相关了,但我还是会发布它,因为其他人可能正在寻找它...
我曾经问过自己同样的问题,并得出结论,在Java中根本没有这样的东西。虽然某些小部件工具包(如qt)提供了使用现有显示结构并将小部件创建为现有xlib窗口句柄的可能性,但您仍然必须使用xlib / xcb来进行与X服务器进行通信以进行wm特定操作。其他库(如GDK和启示)也像其他人所说提供了基本抽象。
尽管如此,我对所有这些都不满意,因为它们都使用C / C ++,而坐在懒洋洋的屁股上等待别人在Java中为我完成工作并不是一个选项,所以我开始编写自己的库,允许您构建自己的模块化WM,在Java中。 https://github.com/Zubnix/trinityshell

我非常有兴趣看到这个。现在我正忙于其他事情,但将来一定会去看一下。让我们知道你的进展情况! - David Given

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接