linux 图形界面 启动 原理

图形界面目录 [隐藏]
1 简介
2 架构及原理 
2.1 Xserver
2.2 Xclient
2.3 Xprotocol
3 窗口管理器
4 启动流程 
4.1 Startx
4.2 GDM会话
5 配置文件 
5.1 X服务器
5.2 X客户端
6 字体 
6.1 freetype 渲染引擎
6.2 X核心字体
6.3 XFT字体

[编辑]
简介
Xwindow 是工作站图形系统的工业标准,它有多种不同的实现,多数 Linux 系统中使用 Xorg

当然,Xwindow 有悠久的历史和传统,不过那不在我们讨论的范围。有两点得强调一下: 
Xwindow 和 Xbox 中的“X”意义是不同的, X 只是 W 之后的一个字母,差不多应该这样理解,Xwindow 是 Window 的接班人 (注意,不是 Windows) 
同样,也不要把 Xwindow 说成是 Xwindows,那是一种亵渎!一切伟大的创造,都应得到应有的理解和尊重 
[编辑]
架构及原理

Xwindow 使用服务器-客户端架构。 

无论本地图形界面,还是远程图形界面,都以同样的方式工作。 

这样便不需要分别进行设计和维护 
本地X客户端 ┐                         ┌ 键盘
远程X客户端 ┼ X协议 ─ X服务器 ─ 驱动程序 ┼ 鼠标
远程X客户端 ┘                         └ 显示器    
[编辑]
Xserver

Xwindow 系统服务器端,通过驱动程序(硬件规范)来管理硬件资源。 

例如:当我们移动鼠标时,通过驱动程序(大多数鼠标无需专门的驱动程序,它们符合某一硬件规范,例如:有四个移动方向和三个键) ,向 Xserver 发送信息: 
“向右移动200点,向上移动100点”(向右上移动);“按下左键”……


Xserver 作出如下响应: 
上一次鼠标停止的坐标为 600,500 
向右 200,向上 100。现在鼠标位于坐标 800,600 
坐标 800,600 处,为窗口 Firefox 的“关闭”按钮 
根据预设动作,将 “点击 Firefox 窗口的关闭按钮” 翻译为 “关闭窗口 Firefox” 
向X客户端 Firefox 发送一个“退出”消息 
Xserver 通过显示子系统(显卡、显示器),全程显示鼠标的位置和移动 
事实上,向程序发送“退出”信号,通常窗口管理器完成。为了描述方便,这里暂不区分。稍后,我们将向您介绍 窗口管理器 的其它一些细节。 
[编辑]
Xclient

Xwindow 系统客户端,通过 X协议,实现与 Xserver 的交互。例如: 
Xclient (假设 Firefox) 接收 Xserver 的消息: 输入焦点在地址栏的范围内,“linuxtoy.org”,回车 
Firefox 根据预设动作,将这些消息识别为 “打开链接 linuxtoy.org” 
Firefox 向域名服务器请求 链接 “linuxtoy.org”。域名服务器将这个请求转换为 “http://linuxtoy.org/” 和 IP地址211.148.131.7,发送回 Firefox 
Firefox 将 “http://linuxtoy.org/” 显示在地址栏(向 Xserver 发送请求,在地址栏位置显示这个地址) 
Firefox 向地址 211.148.131.7 请示显示页面 
Firefox 将服务器发送回的页面显示在主窗口中 
[编辑]
Xprotocol

Xwindow 系统协议,Xserver 和 Xclient 之间进行通信的规则 
[编辑]
窗口管理器

Window Manager 是一种特殊的 Xclient。 

使用窗口管理器时,Xserver 并不直接与其它 Xclient 通信,而是通过 WM 中转,当一些消息被定义为 WM 指令时,它们会被拦截。例如 Alt+F4 关闭窗口、拖动标题栏…… 

消息“打开链接 linuxtoy.org”,具体内容如下: 


输入焦点在地址栏的范围内,“linuxtoy.org”,回车 

Xserver 并不能直接判断焦点,而是这样: 
Xserver 向 WM 发送位置和点击的信息,WM 根据当前的“焦点策略”确定激活(最上层)的窗口为 Firefox 
Xserver 将 Firefox 显示在最上层,高亮显示它的标题栏 
在窗口 Firefox 内点击地址栏,或者 Ctrl+L,Xserver 将位置信息发送给 WM,WM 再发送给 Firefox 
Firefox 判断当前焦点后,显示一个闪动的文字输入光标 
Firefox 将输入光标通过 WM 发送给 Xserver,Xserver 在屏幕相应位置进行显示 


那么,“窗口管理器”到底能作些什么呢? 

其实它作的事只有一件──管理窗口。例如: 
最上层的窗口会把其它窗口挡住 
它通常是一个“已激活窗口”,根据不同的“焦点策略”,窗口管理器确定被激活的窗口。 
激活窗口标题栏高亮显示,接收大部分的键盘消息和窗口内的鼠标点击消息。 
为了美观和容易分辨,大多数窗口都要有标题栏和边框。 
为了方便,标题栏上还要有一些按钮,比如:最小化,最大化,关闭(这些按钮是窗口管理器请求的小窗口) 
一个窗口可以在另一个窗口旁边显示,而不一定完全被遮挡。为了实现这一点,就要控制窗口显示的位置 
为了控制窗口的显示位置,需要将整个屏幕用座标描述,最好的办法是绘制一个填充整个屏幕的窗口,也就是根窗口。 
因为根窗口是最大的,所以它可以严严实实的遮挡任何窗口,为了避免这一点,根窗口永远在最底层。这很形象的说明了为什么它叫作“根窗口” ……root 
根窗口不一定只有一个,大多数的窗口管理器可以使用 “工作区” ,来切换显示多个根窗口 
根窗口固定位置上通常放置一些其它 Xclient 的窗口,例如底部面板,顶部面板,侧面板,程序启动图标 
面板上又可以放一些其它的 Xclient 窗口,如任务条,启动栏,菜单…… 
任务条可以以图标显示正在运行的任务,还可以作其它的杂活,像自动挂载 USB设备…… 
[编辑]
启动流程

我们知道 init 是 linux 的根进程,是所有进程的父进程。同样, xinit 是所有 Xwindow 进程的根进程 
[编辑]
Startx

startx 可以在命令行下启动图形界面。执行startx 命令时,实际执行这一命令: 
xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc    

根据脚本 /etc/X11/xinit/xserverrc 启动 Xserver,同时根据脚本 /etc/X11/xinit/xinitrc 启动指定 Xclient 进程,例如窗口管理器 

/etc/X11/xinit/xserverrc 以预设的参数运行程序 /usr/bin/X11/X 

/etc/X11/xinit/xinitrc 脚本则指向 /etc/X11/Xsession ,依次启动 /etc/X11/Xsession.d 目录中的脚本 
您可以在用户配置文件 ~/.Xsession 中定义使用的 WM,它的优先级高于全局配置文件(对于 GDM会话 不起作用) 
startx 启动时,并不会再进行身份认证。因为它启动的是 /etc/X11/Xsession.d/gnome-session ,而不是 GDM会话 


[编辑]
GDM会话

许多 Linux 系统启动时自动进入图形界面,不需要运行 startx 命令 

在某些启动级别中,包含了 gdm 的启动脚本,例如 : /etc/rc2.d/S13gdm 
指向 /etc/gdm/gdm-cdd.conf 文件,加载预设视觉主题,启动 /usr/lib/gdm/gdmgreeter(登录屏幕) 
用户身份认证完成后,启动 /etc/X11/default-display-manager 这个文件中设定的默认窗口管理器 /usr/sbin/gdm 

gdm 在启动时,会要求用户名和密码,也就是我们看到的登录屏幕(gdmgreeter) 
/usr/share/xsessions 目录下为所有可用登录会话的脚本 
[编辑]
配置文件
[编辑]
X服务器

X服务器的主要配置文件为 /etc/X11/xorg.conf 

(最近的 Xserver 已经支持即插即用,不太需要这个配置文件) 
Section "ServerLayout"                #布局 
Identifier     "Xorg Configured"      #布局标识
Screen     0   "Default Screen" 0 0   #屏幕标识
InputDevice    "Generic Keyboard"     #键盘标识
InputDevice    "Configured Mouse"     #鼠标标识
EndSection
 
Section "Module"                      #模块
        Load  "ddc"  
        Load  "dbe"
        Load  "dri"
        Load  "extmod"
        Load  "glx"        
        Load  "bitmap" 
        Load  "type1"
        Load  "freetype"
        Load  "record"
EndSection
 
Section "Files"                       #X核心字体路径
        FontPath     "/usr/share/X11/fonts/75dpi"     
        FontPath     "/usr/share/X11/fonts/100dpi"
        FontPath     "/usr/share/X11/fonts/misc"
        FontPath     "/usr/share/X11/fonts/cyrillic"
        FontPath     "/usr/share/X11/fonts/100dpi/:unscaled"
        FontPath     "/usr/share/X11/fonts/75dpi/:unscaled"
        FontPath     "/usr/share/X11/fonts/Type1"
        FontPath     "/usr/share/fonts/Chinese/wqy-bitmapfont"
EndSection
 
Section "Screen"                      #屏幕
    Identifier "Default Screen"
    Device     "Card0"          #指定显卡
        Monitor    "Monitor0"         #指定显示器
    DefaultDepth     24           #默认色深为24
    SubSection "Display"          #可用分辨率
    Depth     24              #24位色深下可用分辨率
    Modes    "1280x1024"① "1152x864" "1024x768" "800x600" "720x400" "640x480"
    ………………
    EndSubSection
EndSection
 
Section "Device"                       #显卡
    Identifier  "Card0"
        Driver      "vesa"           #驱动
    VendorName  "All"
    BoardName   "All"
EndSection
① 默认分辨率为默认色深下的第一个分辨率 


配置文件内部结构 
/
├/ "ServerLayout"               布局
│├ "InputDevice" keyboard       键盘
│├ "InputDevice" mouse          鼠标
││
│└/ "Screen"                    显示子系统
│ ├ "Monitor"                   显示器
│ ├ "Device"  videocard         显卡


├ "Files"                        字体
└ "Module"                       模块
[编辑]
X客户端

在 /etc/X11/Xsession 文件中可以发现下列内容 
OPTIONFILE=/etc/X11/Xsession.options # 设定X进程的启动参数。例如允许用户进程 allow-user-xsession
# X资源文件。许多程序保留了X接口,允许X服务器管理一些视觉选项,例如窗口内的字体,配色等
SYSRESOURCES=/etc/X11/Xresources 
USRRESOURCES=$HOME/.Xresources
# X进程。可以设置一些启动时自动运行的程序,也可以用来设定自己的窗口管理器(窗口管理器和桌面环境或者登录管理器是无关的)
SYSSESSIONDIR=/etc/X11/Xsession.d 
USERXSESSION=$HOME/.xsession 
ALTUSERXSESSION=$HOME/.Xsession
ERRFILE=$HOME/.xsession-errors
[编辑]
字体
[编辑]
freetype 渲染引擎

作为 Xorg 服务器的一个模块,freetype 的功能包括读取 Truetype 字体信息,如大小、分辨率、编码等,并以之为依据渲染字体 - freetype2.x 相对于 freetype1.x 增加了抗锯齿等功能 - ( /etc/X11/xorg.conf 的 Module 字段中,可以选择字体渲染模块 ) 

freetype 只负责渲染字体。而查找字体,则可以由 X服务器、X客户端 或者 字体服务器来 完成。找到字体后,使用 freetype 引擎进行渲染 

X核心字体 
X服务器根据X客户端的请求(字符编码),查找字体并进行渲染,然后显示 

Xft字体 
X客户端自行查找字体并进行渲染,X服务器只负责显示。由于 Xft字体 的渲染在客户端完成,所以它可以动态的加载,而不需要随同X服务器一同启动 

字体服务器 
当客户端请求字体时,X服务器将请求转发到字体服务器,由字体服务器查找字体,并使用 freetype 引擎渲染,将结果传回X服务器,X服务器进行显示 
[编辑]
X核心字体

/etc/X11/xorg.conf 中可以配置X核心字体的搜索路径 
Section "Files"
FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
EndSection
当X客户端向X服务器请求显示文字的时候,X服务器会按上面列表的先后顺序查找字体。显示中文时,如果第一个路径中的字体不包含中文,则查找下面的路径,直到发现中文字体 
请将您偏好的字体放在靠前的位置 

要使安装的字体能够作为X核心字体使用,将字体的安装路径添加到上面的列表中,使用 mkfontscale 、 mkfontdir 扫瞄文件夹中的字体,并生成索引,就可以了(建议使用 ttmkfdir 生成 fonts.scale ,将其复制为 fonts.dir ) 

字体的选择及显示风格,可以修改 GTK1 的配置文件,或者在Xresources文件中对程序单独进行定义 

事实上,在我们的日常应用中,X核心字体环境并不常见,使用 GTK1 图形库的程序、某些类型的终端…… 
[编辑]
XFT字体

Xft字体相关选项在 /etc/fonts/fonts.conf 文件中配置 
<dir>/usr/share/X11/fonts</dir>
<dir>/usr/share/fonts</dir>
<dir>/usr/local/share/fonts</dir>
<dir>~/.fonts</dir>

可以使用 fc-cache 命令,递归扫瞄上面目录中的字体(包括子文件夹中的字体),建立字体缓存 

多数支持 GTK2 或者 Qt 图形库的X客户端能够使用 Xft字体 渲染技术 

安装字体,只要将字体拷贝到以上任意目录, fc-cache -fv 刷新字体缓存即可 (选项: -f 强制刷新; -v 显示过程)

使用命令 fc-list 列出所有可用字体。 


字体的选择及显示风格,可以修改 GTK2 或者 Qt 的配置文件, 

建议使用图形界面配置,例如 gnome-font-properties
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值