系列文章目录
深度探索Linux操作系统 —— 编译过程分析
深度探索Linux操作系统 —— 构建工具链
深度探索Linux操作系统 —— 构建内核
深度探索Linux操作系统 —— 构建initramfs
深度探索Linux操作系统 —— 从内核空间到用户空间
深度探索Linux操作系统 —— 构建根文件系统
深度探索Linux操作系统 —— 构建桌面环境
文章目录
- 系列文章目录
- 前言
- 一、窗口管理器
- 1、基本原理
- 1. X 的窗口
- 2. 窗口装饰
前言
计算机领域中的桌面环境(Desktop Environment)其实是一种比喻的说法,即图形用户界面就像物理书桌一样,其上可以放置文件夹、文档等。桌面最初用来特指个人计算机(PC),但是现在不只个人计算机有图形界面环境,服务器、嵌入式设备等基本都提供桌面环境。桌面环境包括窗口管理器、任务条等基本组件,除了这些基本的组件外,有的桌面环境还提供文件管理器、控制面板等。
桌面环境是操作系统中人机交互的关键部分,理解它的基本运作原理,无论是对理解操作系统,还是对开发应用程序,都有极大的帮助。我们处于这样一个追求个性的年代,无论是用于消费类电子设备的移动系统,还是用于 PC 的中规中矩的桌面系统,人们都已不再满足于千篇一律的桌面。打造一个全新的个性化桌面,绝不只是停留在更改个背景图、换个主题这个层面,我们需要更大的革新。但是如果对桌面环境的基本原理都不甚了解,那又何谈去开发打造具有创造性的用户交互。
因此,在本章中我们带领读者从头构建一个基本的桌面环境,包括窗口管理器、任务条以及一个显示桌面背景的组件。为了使读者更能深刻体会 X 的客户/服务器模型,窗口管理器基于 Xlib 编写,而任务条等组件则展示了使用 GTK 图形库的编程方法。
限于篇幅,我们没有将全部源代码全部贴到书中,所以请读者结合随书光盘中附带的源代码进行阅读。另外,本章虽然涉及 Xlib 和 GTK 编程,但是为了不干扰主线 —— 构建桌面环境,我们不会过多讨论它们的编程,其中涉及的 API ,如有必要请参考 Xlib 和 GTK 各自的参考手册。
一、窗口管理器
本质上,窗口就是显示器上对应的一块区域。对于一个运行多任务的操作系统来讲,在一个有限的屏幕上可以同时存在多个窗口,因此,用户希望多个窗口之间可以协调布局和平共享同一个屏幕。可以将特定窗口切换为当前活动窗口;可以按需改变窗口尺寸;可以最大化、最小化以及关闭窗口。但是 X 的设计哲学是只提供机制,不提供策略,X 服务器只提供窗口操作相关的函数,但不管如何去操作窗口。于是诞生了另外一个特殊的 X 应用:窗口管理器。
1、基本原理
1. X 的窗口
X 将所有窗口组织为一棵树。X 服务器启动后,将默认创建一个窗口,这个窗口充满整个屏幕,作为整个窗口树的根,称为根窗口(Root Window),所有应用的顶层窗口(Top-level Window)都是根窗口的子窗口。
假设在 X 中运行两个应用 A 和 B ,A 包含 2 个窗口,B 应包含 3 个窗口,窗口之间的布局如图 7-1 所示。
它们之间的树形关系如图 7-2 所示。
窗口管理器仅管理应用的顶层窗口,即如图 7-2 中的 “Top Window A” 和 “Top Window B” 。一个应用可能有多个顶层窗口,除了应用的主窗口之外,对话框一般也是一个顶层窗口。而对于顶层窗口的子窗口,则由应用自己管理。
2. 窗口装饰
在第 6 章中,我们看到,无论是基于 Xlib 的程序,还是使用 GTK 编写的程序,在没有窗口管理器的情况下,它们的窗口都以 “素颜” 示人,只是一个 “裸” 窗口。一个典型的桌面应用的窗口,一般而言,包括一个标题栏,标题栏上还可能显示窗口的名称、最大化、最小化和关闭按钮。另外,窗口一般还有一个边框。用户可以通过标题栏移动窗口,可以在边框处拖动鼠标改变窗口尺寸,可以分别通过最大化、最小化和关闭按钮最大化、最小化、关闭窗口。这些组件除了具备功能外,还具备美化的作用,比如可以设置窗口边框的颜色、阴影效果等,因此,它们也被称为窗口装饰。
显然,窗口装饰不应该由各个应用负责,暂且不提重复劳动,单单一致性就是个大问题。如果任由应用自己绘制,最后将导致窗口标题栏等装饰五花八门。因此,在 X 中,将窗口装饰提取为公共部分,由窗口管理器统一负责。通常的实现方式是:窗口管理器创建一个窗口,我们称这个窗口为 Frame ,作为根窗口的子窗口,但是作为应用的顶层窗口的父窗口。其他装饰,或者直接绘制在 Frame 窗口上,或者创建新的装饰窗口,但是这些装饰窗口也作为 Frame 的子窗口,本章我们开发的窗口管理器采用后者。应用的顶层窗口和 Frame 窗口之间的关系如图 7-3 所示。