x11开发笔记

Sep 11, 2017


记录实际项目中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_0


设置分辨率时的代码流程

执行”xrandr –output HDMI1 –crtc 0 –mode 1920x1080”命令后,整个x11系统内部代码以及部分内核代码运行流程如下:

xrandr_1


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

    其中,xsetxsetroot一看就知道是x11自带的工具,后面章节将会研究这些命令的作用。

  • 启动程序查看效果,鼠标应该比原来大了一倍。

这种放大方法,实测发现放大后的鼠标锯齿比较明显。


替换x11中鼠标的theme

x11默认的鼠标主题非常的丑,下面记录参考这篇文章实现的过程。

  • 1.首先在网上下载主题包,有的主题包需要进行编译安装,有的直接已经包含了编译好之后的主题文件,我们需要的只有一个文件(index.theme)和一个目录(cursors),它们一般的目录架构如下:

curosr

  • 2.将index.themecursrs放进一个目录中,比如这个目录叫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鼠标的实现。