分类: LINUX
2008-05-05 10:39:06
X Client 和 X Server
X Window 为 一 Client-Server 架 构 之 GUI 。 Client 指 的 是 在 X Window 下 执 行 的 应 用 程 式, 需 要 X Server 为 其 服 务 ; Server 指 的是 整 个 管 理 你 的 桌 面 的 X Window 系 统 , 称 为 X Server 。 X Server 除 了 负 责 GUI 介 面 之 管 理 和 提 供 Client 端 的 服 务 之 外 , 并 且 还 管 理 系 统 资 源 ( Resource ) 和 事 件 ( Event ) 之 发 生 和 传 递 。
Display 和 Screen
在 一 个 X Wintow System 可 以 包 含 多 个 Screen , 而 Screen 则 是 一 个实 际 的 Monitor 或 是 Device 。 每 个 Display 则 可 以 包 含 多 个 Screen 。 Display 指 的 是 一 群 Screen 和 一 个 pointer ( 一 般 是 滑 鼠 )加 上一 个 键 盘 的 集 合 。
Event 和 Request
当 Client 需 要 在 显 示 幕 上 开 一 个 window 或 是 显 示 一 段 文 字 或图 形 时 , 则 Client ( 即 X 下 的 应 用 程 式 ) 向 Server 提 出 一 个 Request ; Server 收 到 Request 之 後 , 则 依 据 Request 的 内 容 , 提 供 相 对 应 的 服 务 。当 使 用 者 在 属 於 某 一 Client 的 window 内 , 按 了 一 下 滑 鼠 的 右 键 , 或 是 敲 了 键 盘 上 的 一 个 Key , 则 Server 会 发 送 一 个 Event 给 该 Client 。 而 Client 只 要 依 据 Server 送 回 来 的 Event, 即可 判 断 有 何 事 件 发 生 , 然 後 依 据 所 发 生 的 Event 发 生 相 对 应的 动 作 。
X Window 的 网 路 特 性
Client 和 Server 不 一 定 要 在 同 一 部 电 脑 上 执 行 ; Client 和 Server 可 以 是 接 在 网 路 上 的 两 台 电 脑 。 当 Client 要 向 Server 发 出 Request 时 , 可 以 透 过 网 路 向 执 行 Server 的 机 器 发 出 Request , 然 後 送 达 给 Server 处 理 。 同 样 的 , 当 Server 要 向 Client 通 知 Event 的 发 生 时 , 也 可 以 透 过 网 路 向 Client 传 送 。 因 此 你 可 以在 A 地 的 电 脑 上 执 行 某 一 X Window 应 用 程 式 , 而 在 B 地 透 过 X Server 观 察 程 式 执 行 的 结 果 。
一 个 X Window 的 程 式 , 也 就 是 Client , 在 同 一 时 间 可 以 和 一 个 以 上 的 Server 沟 通 。 也 可 以 同 时 和 多 个 Server 建 立 连 接 , 在 多个 Server 上 显 示 , 并 接 受 多 个 Server 的 讯 息 。 而 X Server 也 可 以在 同 时 间 内 , 接 受 多 个 Client 送 来 的 讯 息 , 并 做 对 应 的 处 理。
Window 的 阶 层 性
X Window 内 的 window 是 有 阶 层 关 的 , 这 阶 层 关 可 以 画 成 一树 状 图 。 在 树 状 的 最 上 层 是 root window , 这 个 window 是 Server 所特 有 的 。 除 了 root window 之 外 , 每 个 window 都 有 一 个 parent window , 即 是 在 树 状 图 上 的 上 一 层 window 。 在 树 状 图 的 下 一 层 window 称 为 child window 。 每 个 window 可 以有 多 个 child , 但 不 一 定 每 个 window 都 有 child 。 而 child window 下面 还 可 以 有 child 。 Win 1 和 Win 2 皆 为 root 的 child, root 则 为 Win 1 和 Win 2 的 parent 。 Win 2-1 和 Win 2-2 和 Win 2-3 则 为 Win 2 的 child , Win 2 则 为 Win 2-1 和 Win 2-2 和 Win 2-3 的 parent。而 root 和 Win 1 和 Win 2 则 皆 为 Win 2-1 和 Win 2-2 和 Win 2-3 的 ancestor。而 root 则 为 Win 1 和 Win 2 的 ancestor。
在 显 示 幕 上 , child 永 远 在 parent 上 面 ( 即 parent 被 child 盖 住 ) 。 而 child window 可 以 比 parent window 大 , 但 超 过 parent 的 部 份 , 会 被 截 掉 而 不 显 示 在 显 示 幕 上 。
蓝 色 部 分 为 parent window , 而 草 绿 色 部 分 则 为 child window 和 parent window 重 叠 的 部 分 。 在 parent window 外 面 灰 色 部 分 也 为 child window 的 一 部 分 , 但 其 为 超 过 parent window 视 窗 围 之 外 的 部 分 , 所 以 不 会 被 显 示 出 来 。 草 绿 色 部 分 则 是 显 示 child window 的 内 容 。
当 显 示 幕 上 有 多 个 window 存 在 时 , 可 能 会 发 生 window 重 叠 的 现象 。 而 在 下 面 的 window 会 被 在 上 面 的 window 盖 掉 ; 当 上 面 的 window 移 离 目 前 位 子 , 而 使 原 本 被 盖 的 部 分 重 新 暴 露 出 来 , 这 时 就 必 需 重 画 露 出 来 的 部 分 。 但 X 并 不 保 证 会 保 存 你 原 本显 示 在 window 上 的 资 料 。 因 此 这 时 Client 就 必 需 负 起 重 画 的 责 任 了 。 当 X Server 没 保 存 重 新 被 暴 露 出 来 的 部 份 的 资 料 时 , X Server 会 送 出 Expose Event 给 Client, 通 知 Client 那 些 部 分 需 要 重 画。 然 後 Client 就 必 需 决 定 是 否 要 重 画 , 或 是 采 取 其 它 的 处 理 方 式 。
X Window 的 外 观
在 很 多 的 GUI 中 , 如 OS/2 等 , 都 会 提 供 Button, Scroll Bar, Menu 等 等 的 基 本 元 件 , 以 方 便 建 构 程 式 的 外 观 。 但 在 X 中 并 不 提供 这 样 的 元 件 ; 相 反 的 , X Window 提 供 的 是 一 套 建 立 外 观 风 格 的 机 制 。 利 用 这 套 机 制 , 我 们 可以 建 立 各 种 不 同 风 格 的 元 件 。 这 样 我 们 即 不 必 限 制 在 系 统 内定 的 风 格 中 , 而 无 法 做 改 变 。 这 套 机 制 是 用 大 小 不 同 的 window , 组 合 建 立 如 Button , Scroll Bar 等 等 的 元 件 , 充 满 了 弹 性 。
Window Manager
在 X 中 有 一 种 极 为 特 殊 的 程 式 , 称 为 Window Manager 。 其 作 用 是管 理 Desktop 上 的 各 应 用 程 式 的 window , 并 提 供 特 殊 风 格 的 window 外 观 。 不 同 的 Window Manager 有 不 同 的 外 观 风 格 。 因 此 ,我 们 可 以 更 换 不 同 的 Window Manager , 以 得 到 不 同 风 格 的 window 外 观 。 而 一 般 的 Client 则 必 需 和 Window Manager 合 作 , 以 得 到 良好 而 一 致 风 格 的 window。 Window Manager 也 是 一 Client 程 式 , 和 一 般 的 Client 相 同 。 只 是 Window Manager 负 有 特 别 的 任 务 ; 管理 Desktop 和 window 外 观 。
为 了 得 到 良 好 而 风 格 一 致 的 window, Client 和 Window Manager 必 需合 作 。 其 合 作 方 式 是 透 过 由 Client 传 送 Hint 给 Window Manager , 而 Window Manager 以 後 , 则 会 参 考 Hint 的 内 容 , 给 予 应 用 程 式 所开 出 的 window 适 当 的 外 观 。 但 Window Manager 不 一 定 会 依 据 Hint 指 示 处 理 , 纯 为 参 考 。