当前两个最流行的linux desktop environment: GNOME 和KDE, 两者对应的图形库分别是 GTK+ 和 QT.
GNOME与KDE与X11的关系:
X defines no user interface, but provides the means to make one. This means you’re free to create your own entire desktop environment, experimenting and innovating at will. But, it also hindered user interfaces on Linux and UNIX for a long time. Into this relative void, two desktop projects emerged as the favorites of Linux: KDE 和 GNOME, 即两者的底层基础应该是X11吧,毕竟X11跟显卡打交道!
GTK+ 和QT的图形库的基础/底层是桌面系统,一般被称为“X Window System”或X11或X. X11是开源的,1980s起始于MIT,当时开发x11是为了给高端的科学工作站提供统一的桌面系统,到1990s,随着硬件价格的降低,人们发起了名为XFree86的项目,将x11移植到家庭pc。(PC processors made by Intel and other commpanies are known as x86 processors)。
X11分为两部分: hardware-level(X server) 和 application-level(X client),两部分通过X protocol 来通信。
hardware-level(X server):
负责底层操作,将图形显示到显示器上。X server直接与显卡打交道,从而电脑中使用的x server需要与电脑中的显卡相匹配,例如分辨率,refresh rate, color depth等。配置文件名字为xorg.conf或Xfree86Config。 在以前,需要手动配置文件,但是在当今的linux版本中,会自动检测显卡。 X server监听用户输入,例如鼠标,键盘事件,并将其传送到 X client.application-level(X client):指的是使界面应用程序, X client 等待X server发送过来的用户实事件,然后反馈redraw message to X server,server便可以根据指示来重新绘制界面。
X client和X server可以放在不同的机器上。
X protocol: 使得x server和x client可以分开部署。Xlib:
Xlib被X client间接调用,Xlib构造出x protocol信息传递给X server。Xlib提供了基本的API,其用于绘制基本的图形元素等。Xlib非常的底层,如果直接调用xlib来绘制一个简单的菜单,也需要上百行代码。从而,编程设计人员开发时不会直接调用Xlib,而是使用toolkit工具包, 例如GTK+ 和 QT!!工具包让开发这只需要几行代码便可以创作出一个菜单,其实是对Xlib的封装吧。
对于X11,有很多toolkit可以选择,各有优缺点,为你的应用选择合适的toolkit是一个非常重要的决定,需要考虑的因素有:
❑Who are you targeting with your application?
❑ Will your users have the toolkit libraries installed? ❑ Does the toolkit have a port for other popular operating systems? ❑ What software license does the toolkit use, and is it compatible with your intended use? ❑ Does the toolkit support your programming language? ❑ Does the toolkit have a modern look and feel?Window Managers(窗口管理器):
负责将窗口放置在屏幕上,一般支持seperate workspace,即将桌面分割。也负责,在每个窗口周边增加装饰,例如最大化按钮。
Common window managers include:
❑ Metacity, the default window manager for the GNOME desktop. ❑ KWin, the default window manager for the KDE desktop. ❑Openbox, designed to conserve resources and run on older, slower systems. ❑ Enlightenment, a window manager that displays awesome graphics and effects. As with everything in X, you can switch window managers. Most users, though, run the window manager that comes with their desktop environment.----------------------------------------------------------------------------------------------------
Other Ways to Create a GUI — Platform-Independent Windowing APIs It’s worth mentioning other ways to create GUIs that are not specific to Linux — there are languages that have native GUI support under Linux: ❑ The Java Language supports programming GUIs using the Swing and older AWT APIs. The look and feel of Java GUIs isn’t to everybody’s taste, and on older machines the interface can feel clunky and unresponsive. A great advantage of Java is that once you’ve compiled your Java code, it runs unchanged on any platform with a Java Virtual Machine, which includes Linux, Windows, Mac OS, and mobile devices. See http://java.sun.com for more information. ❑ C# is a programming language very similar to Java. On Linux, the C# Common Language Runtime, or CLR, platform comes from the Mono project at http://www.mono-project.com. C# on the Mono platform supports both Windows. Forms, also used on Windows, and a special binding to the GTK+ toolkit, called Gtk#. ❑ Tcl/Tk is a scripting language that is excellent for rapid development of GUIs and works with X, Windows, and Mac OS. It’s great for rapid prototyping or for small utilities where you want the simplicity and maintainability of a script. You can find all the details at http://tcl.tk. ❑ Python is also a scripting language. You can use the Tk part of Tcl/Tk from Python, or you can program to the Python GTK+ binding, writing GTK+ programs in Python. You can find more about Python at http://www.python.org. ❑ Perl is another common Linux scripting language. You can use the Tk part of Tcl/Tk from Perl, as Perl/Tk. You can find more about Perl at http://www.perl.org/.With the platform independence that these languages bring there is a price to pay. Sharing informationwith native applications — for instance, using “drag and drop” — is difficult, and saving configuration usually has to be done in a proprietary rather than the desktop standard way. Sometimes vendors of Java software cheat by shipping with platform-specific extensions to get around these sorts of problems.