记录实际项目中x11开发相关的笔记。
xrandr
xrandr(x11 resize and rotate)是x11中的一个非常实用的工具,实现为x11中的一个extension。使用xrandr工具可以修改输出分辨率、配置输出gamma值、开关显示器输出端口等等功能。
xrandr的使用
xrandr最常使用的功能莫过于设置显示分辨率了,执行下面的命令可以设置显示分辨率为1080p:
$xrandr --output HDMI1 --crtc 0 --mode 1920x1080
要理解上面命令的含义,需要对显示系统有大概的了解,比如什么是crtc,关于这方面内容见这篇文章, 我们还可以同时设置多个屏幕的分辨率,命令如下:
$xrandr --output HDMI1 --crtc 0 --mode 1920x1080 --output DP1 --crtc 1 --mode 1280x1024 --right-of HDMI1
同时设置多个屏幕分辨率时,需要设置两个屏幕的位置关系,这样可以定义鼠标向哪个方向可以移动到其他屏幕上去。上面通过--right-of HDMI
,定义第二个屏幕在第一个屏幕的右边,这样当我们移动屏幕一中的鼠标向右时,可以移动到屏幕二上。
xrandr代码分析
获取分辨率的代码流程
执行”xrandr”命令默认是获取当前分辨率信息,整个x11系统内部代码运行流程如下:
设置分辨率时的代码流程
执行”xrandr –output HDMI1 –crtc 0 –mode 1920x1080”命令后,整个x11系统内部代码以及部分内核代码运行流程如下:
x11中鼠标
放大x11中的cursor
x11的默认鼠标在大分辨率(比如4k)的显示器下看上去太小,一开始想通过参考gnome中的Tweaks Tool
来实现cursor的放大的,研究相关代码发现这是一个不太可能成功的方法。后来一想,鼠标在x11架构中应该是完全由x11 server控制的,那说明直接从x11入手才是正路。下面记录参考这篇文章实现的过程。
-
1.从ftp://ftp.x.org/pub中去寻址
cursor.bdf
文件。 -
2.在bing或者谷歌上搜索
bdfresize
这个软件包,编译方法是通常的方法:./configure make
-
3.执行如下3条命令
mkdir $HOME/fonts
bdfresize -f 2 curosr.bdf > $HOME/fonts
mkfontdir $HOME/fonts
其中,
bdfresize
是上面编译获得的工具,mkfontdir
是x11系统自待的工具。 -
4.在启动任何一个x client之前,执行如下命令
xset +fp $HOME/fonts
xsetroot -cursor_name X_cursor
其中,
xset
和xsetroot
一看就知道是x11自带的工具,后面章节将会研究这些命令的作用。 -
启动程序查看效果,鼠标应该比原来大了一倍。
这种放大方法,实测发现放大后的鼠标锯齿比较明显。
替换x11中鼠标的theme
x11默认的鼠标主题非常的丑,下面记录参考这篇文章实现的过程。
- 1.首先在网上下载主题包,有的主题包需要进行编译安装,有的直接已经包含了编译好之后的主题文件,我们需要的只有一个文件(
index.theme
)和一个目录(cursors
),它们一般的目录架构如下:
-
2.将
index.theme
和cursrs
放进一个目录中,比如这个目录叫theme
,然后将theme拷贝到/usr/share/icons
。 -
3.执行
mv /usr/share/icons/default /usr/share/icons/default_bak
,对原来默认的主题进行备份。 -
4.在
/usr/share/icons
目录下执行ln -s theme default
创建软链接即可。 -
5.启动程序,发现主题已经替换成功。
更换鼠标主题后,使用上面介绍的放大字体的方法就不起作用了,得研究其他的方法。
x11鼠标背后的实现原理和机制
通过上面两个实操,感性地接触了x11中的鼠标,下面来深究x11鼠标的实现。