我是一名 Windows 开发人员 (Win32api),正在从 Windows 转到 Linux。在安装 Linux 时,有很多关于 X11、X Window System、X Server、Xorg、Xfree86 等的知识需要了解。
我们怎么不知道 Windows 中有这样的事情?维基百科上关于这些的文章让我害怕。有人能解释一下这些事情吗?它们是如何工作的?为什么 Linux 中如此复杂,而 Windows 中却不复杂?
任何好的参考资料都将受到赞赏。
附言:我喜欢了解内部细节,不要犹豫深入了解。
答案1
Windows 在单一 API / 框架的单一实现之上为您提供单一桌面的单一实现,这一切都由 Microsoft 完成。
在 Unix 系统上,您会获得一个 API / 框架(X11 / X Window System),它有多个实现(Xorg、Xfree86),在此基础上您会获得各种“更高级别”的 API / 框架(GTK+、Qt 等),因为原始 X11 非常原始,在此基础上您会获得各种桌面(Gnome、KDE 等),所有这些都是由不同的人完成的。
此外,X11 系统从一开始就考虑了远程 GUI 进行设计 - 即本地机器显示远程运行的应用程序的 GUI - 这引入了“X 服务器”和“X 客户端”的概念。
然后,有一个对于新手来说“感觉”错误的命名法:您的本地机器正在运行“X 服务器”,提供“显示 GUI”服务,而远程机器是“X 客户端”,利用您机器上的服务来显示 GUI。
好吧,这是快速概述;一旦你理清了这一点,理解关于该主题的任何文章/论坛帖子就会变得容易得多。
编辑:回答 OP 的前两个评论。
是的,“X11” 只是一个协议,Xorg / XFree86 是两个实现。从根本上讲,X11 只是绘制线条和点,如果你想做 GUI,这没什么用。
在 X11 协议的基础上,人们实现了很多东西,很难与 Windows 进行 1:1 的比较,因为微软从来没有费心去真正地把事情分开。另外,我不是 GUI 类型的开发人员,也就是说,我实际使用的经验任何一个系统是最小的。
在底部,“窗口管理器”提供了一个窗口(处理边框、关闭/最小化/最大化按钮、调整大小等),并为窗口小部件工具集提供了窗口内的“空间”。有许多窗口管理器,其中一些模仿其他系统(Windows、MacOS、AmigaOS 等),它们大多可以互换,对其余系统透明。
“小部件工具集”为您提供按钮、滑块、文本字段等,供您构建 GUI。这是您(作为应用程序开发人员)实际“看到”的 API,也是决定应用程序大部分“外观和感觉”的东西。
“桌面”在某个窗口小部件工具集/窗口管理器组合之上构建了许多应用程序,以提供一致的外观和感觉。除非您确实想开发桌面本身,否则您不必为这些烦恼。
桌面“Gnome”在窗口管理器“Metacity”上使用窗口小部件工具集“GTK+”。
桌面“KDE”在窗口管理器“KWin”上使用窗口小部件工具集“Qt”。
请注意,尤其是 GTK+ 和 Qt 这两个,已经远远超出了简单的“小部件工具集”的范围,发展成为“应用程序开发框架”。如果您想为 Linux 开发 GUI 应用程序,实际上您必须选择要使用这两个中的哪一个。如果您想要一个更“轻量级”的应用程序(不需要大的库依赖项),那么还有更多选择,但如今大多数系统都已经安装了 GTK+ 和 Qt 库。
在 Gnome 桌面上使用 Qt 应用程序或在 KDE 桌面上使用 GTK+ 应用程序是完全可能的(以前并非如此),因此您无需担心兼容性问题。如果要在两个功能相当的应用程序之间进行选择,人们通常会选择使用其所选桌面的“原生”小部件的应用程序,但我并不担心这一点。
在选择“小部件工具集”时其他更重要的要点:许可条款、对您选择的语言的支持、跨平台兼容性。
附言:几年后回来,我积累了一些自己的 GUI 编程经验,并且意识到,如果你正在寻找“该走哪条路”的建议,上述解释中缺少一件事:插件. 这是一个构建在上面无论您本地使用什么,并允许透明便携GUI 开发,无需牺牲性能或附加任何许可条件。C++ API。这是我为满足 GUI 需求而选择的路径,我感觉它应该为了完整性而被提及。
答案2
我不明白为什么你觉得理解 http://en.wikipedia.org/wiki/X_Window_System但无论如何:
X Window 系统通常由两部分组成:
- 一个服务器(称为 XServer)
- 客户端(称为..XClients:))
服务器连接到硬件(显卡、输入设备)并允许客户端使用这些资源。客户端连接到 xserver 并使用提供的资源。
存在适用于 Unix 的服务器(Xorg,Mac 用户有自己的服务器等)和适用于 Windows 的服务器(Hummingbird、Cygwin 的 Xorg 端口等)。
您可以将一个操作系统上的客户端连接到另一个操作系统上运行的服务器。
服务器和客户端之间的通信是通过Xlib-API或者(更现代的)xcb-API。
要创建一个简单的应用程序,通常只需执行以下操作:
- 连接到 xserver
- 请求 xserver 创建一个窗口(它将为您提供一个“句柄”)
- 告诉 xserver 打开窗口
- 处理事件(鼠标、键盘、曝光、运动等)
- 在窗口中绘制内容(文本、图形等)
- 通过告诉 xserver 释放所有资源来退出应用程序
并做了。