26

我的主要经验是使用 C && C++,所以我更愿意留在他们身边。我不想使用 QT、GTK 或 wxWidgets 或任何工具包之类的东西。我想学习本机编程,这违背了目的。考虑到这一点,我也想避免使用 Java。

我了解 gnome 和 xfce 和 KDE 等都是 Linux 的桌面环境,安装的基础通常是 X (Xorg)。在为 Linux 编码时,您是为 X 编码还是为桌面环境编码?是否有适用于 Linux 的标准 Linux 标头(如 win32 有 windows.h)?还是每个桌面环境都有不同的编码方法?

任何帮助是极大的赞赏。

4

11 回答 11

65

X 是一个可怕的编程层,尽管您打算避免使用 Java、QT 或任何优秀的 UI 抽象层,但编写到那个级别会对您自己造成伤害。我已经做到了(很久以前,当 Motif 在我们使用的平台上处于起步阶段时),如果有更简单的方法,我不会再这样做了。

您对“本机编程”一词的使用使我有些困惑。如果你想学习原生编程,那就是你选择调用的 API。使用类似的推理,您也不应该使用 C 进行编码,而是选择汇编程序(或直接机器代码),因为 C 提供了对硬件的抽象。

如果你想学习 X 编程,那很好。您最终将获得对界面的更多控制权,但几乎所有其他人在软件交付方面都将超越您。就我自己而言,我更喜欢编写可以在许多平台上使用的更高级别的 API——它给了我更快的交付时间和更大的市场潜力。

你不是用原子建造房子,而是用砖块建造它。我的建议是使用这些工具,这就是它们的用途。

于 2008-12-12T01:49:30.370 回答
44

我不想使用 QT、GTK 或 wxWidgets 或任何工具包之类的东西。我想学习本机编程,这违背了目的。

不,你没有。回到 X11 的早期版本,如 R1 或 R2,我仅在 Xlib 中编写了一个完整的“Hello, world”程序。

大约 700 行 C.

你不想去那里。

于 2008-12-12T02:32:36.930 回答
14

我猜你可以直接针对Xlib编写 C 代码,但你最终会重新创建 GTK+ 或 QT 提供的所有功能,而 X 并不孤单。

于 2008-12-12T01:45:35.887 回答
10

Unix(以及扩展,Linux)实际上并没有定义任何与 GUI 相关的内容。X 是常用的,它没有定义任何与小部件或样式或任何类似性质的东西 - 它主要关注绘图原语和事件处理。本质上,如果你想用纯 X 编写,你将定义屏幕上每个元素的形状和行为。如果您疯狂到放弃 X,那么您将在图形帧缓冲区级别工作...

你最好使用一些工具包——如果你正在寻找轻量级的东西,为什么不试试FLTK呢?

于 2008-12-12T07:44:29.327 回答
4

GTK、QT 和 wx 是构建在 X 之上的工具包,可提供更友好的 API。

如果您不使用现有的工具包,您将需要在非常低的级别编写内容 - 直接处理鼠标和键盘事件。如果你想要一个按钮或一个文本框,你必须使用低级 xlib 原语自己编写。

在尝试这个之前,您最好选择您喜欢的桌面环境的工具包并从它开始。

于 2008-12-12T01:48:49.437 回答
4

在这种情况下,根本就没有“原生”这样的东西。Windows 和 OS X 只有一个官方选项,而 X 没有。

于 2008-12-12T01:50:49.200 回答
3

Linux 和大多数其他类 Unix 操作系统的“本机”接口是 Xlib,它是 X11 的最低级 C API。

GTK、Qt 和其他(据我所知)都是以 Xlib 为核心实现的。正如其他人所说,Xlib 为您提供最大的控制权,但您必须为此努力(其他人可能会在交付产品方面绕着您转圈)。

作为参考,我个人用 C++ 实现了一个功能相当丰富且现代(即可流动)的跨平台(Win32 + X11)GUI 库。总计数约为 29 KLOC 的 C++,其中 X11 和 Win32 匀场需要约 2500 行。其余的用于平台中立的 Widget 实现。除非您准备做出这样的承诺,否则我强烈建议您使用更高级别的库之一(Qt 可能是我的选择,尽管我无法忍受预处理器方法)。

顺便说一句,Xlib 的一大优点是它的原始可移植性——任何带屏幕的 Unix 盒子都可以,而且它也可以在 Windows 和 OS X 上工作。

于 2008-12-12T04:26:51.380 回答
3

我觉得有必要在这里反驳其他答案的一致意见。X11确实是低级。但要“真正”了解发生了什么,您应该对 X11 的工作原理有所了解。由于所有工具包都在 X 之上工作,因此无论您喜欢与否,您都在使用它。我懒得搜索的地方有很好的在线教程。它指导您构建一个简单的 Hello World。为此,您必须学习如何创建窗口、请求事件、映射窗口以及循环处理事件。你甚至可以在亚马逊上订购一些旧书。O'Reilly vols 1 和 2(目前获得最便宜的版本,但不早于 X11R4)对于参考和了解这些部件如何协同工作的完整故事至关重要。然而,为了学习,

正如其他人所说,在这段旅程的某个时刻,你会发现你已经受够了。两页代码只是为了选择一个视觉对象,然后您仍然必须填充一个颜色图,然后才能绘制您的自定义位图。然后进行了两天的重写和调试,意识到这一切有效;你只是忘了XFlush()

斗争很重要,因为一旦找到你喜欢的工具包,你就会更加欣赏这些工具包。

于 2011-08-07T06:57:18.030 回答
1

我也建议使用lesstif/motif。它也建立在 X 之上,在我看来,学习曲线不像 GTK 或 Qt 那样陡峭。不过,您使用它构建的 UI 不会像您可以使用 GTK 或 Qt 构建的那样复杂。更多信息可以在这里找到。

正如其他人提到的那样,您可能不想 X,这很痛苦。

于 2008-12-12T02:41:48.363 回答
0

为什么不从 Qt、wxWidgets 和 GTK 中选择一个并学习它的内部结构,而不是它的 API?我的意思不仅仅是为了它,而是为了贡献你觉得最吸引人的部分。通过这种方式,您将实现您的目标并为您和他人做一些有用的事情。我认为这比给自己分配一个相当人为的任务来构建应用程序并使用错误的工具更有意义。

于 2011-08-07T08:07:12.350 回答
0

哦,是的,有这样“原生”的东西:

FBUI、svgalib、directfb、exa(kdrive)、SDL、Allegro..+Wayland,虽然不是主流。

http://home.comcast.net/~fbui/

http://www.svgalib.org/

http://directfb.org/

http://xorg.freedesktop.org/wiki/ExaStatus

+ http://wayland.freedesktop.org/

于 2011-10-28T14:07:57.350 回答