x11 作为图形显示方式,i3 作为窗口管理程序。使用的软件尽量少,配置尽可能简单。不考虑好看,对人眼友好即可。
台式机和笔记本电脑通用:
笔记本电脑专用:
首先需要明确,用户配置应写在 ~/.xsession 中而不是 ~/.xinitrc。
简单说来,~/.xinitrc 被 xinit 调用,而 xinit 被 startx 启动。如果 startx 找到了 ~/.xinitrc,那么系统级的 /etc/X11/xinit/xinitrc 就不被执行。而这个系统级的启动脚本又调用 /etc/X11/Xsession 做了一些其它的操作,包括调用用户级的 ~/.xsession 配置脚本,配置 DBUS 路径的环境变量等。
有时,基于 chromium 的程序无法调用 fcitx5 输入法的原因就是指明 DBUS 路径的环境变量 DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u) /bus"
不存在。
所以,要在避免系统级的启动脚本被覆盖的同时,还要执行用户级的配置脚本的话,就要把用户级的配置写在 ~/.xsession 中。
此外,startx 通常在用户通过 console 登入后启动图形界面时被调用。但如果用户通过 DM(display manager)登入,那么只有在使用用户自定义 session 时,DM 才会去执行 ~/.xsession 文件。具体可以看 /usr/bin/startx 这个脚本的实现逻辑。
在 /etc/X11/xorg.conf.d/intel.conf 中写:
Section "Device"
Identifier "Intel Graphics"
Driver "intel"
Option "TearFree" "true"
EndSection
给触摸板配置单指单击模拟鼠标左键,双指单击模拟鼠标右键。
卸载 xserver-xorg-input-synaptics 安装 xserver-xorg-input-libinput。
并在 /etc/X11/xorg.conf.d/ 目录下创建文件 40-libinput.conf,内容为:
Section "InputClass"
Identifier "libinput touchpad catchall"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "Tapping" "on"
EndSection
没有办法完全让标题栏消失,只能通过将标题栏的高度设置为 1px 的方式来让标题栏在视觉上被忽略。配置为:
# ~/.config/i3/config
for_window [class='^."] border pixel 1
$mod+Return
会执行 /usr/bin/i3-sensible-terminal 这个脚本,这个脚本内写有如何选择 terminal 程序的逻辑。
这个脚本先判断 $TERMINAL
环境变量是否有设置,如果设置了,先尝试使用环境变量中指定的程序,所以只要设置这个环境变量的值为对应的 terminal 程序即可。而这个环境变量可以在 ~/.bashrc, ~/.xsession 和 ~/.config/i3/config 被设置,但考虑到如果没有i3 环境,就只剩 tty 了,而 tty 不需要 terminal 程序,所以最终决定将环境变量的配置写在 ~/.config/i3/config 中,即,在 i3 启动或重启时,设置环境变量:
# ~/.config/i3/config
exec_always --no-startup-id export TERMINAL=urxvt
Fcitx5 的主题配置放在 ~/.local/share/fcitx5/themes 中,每个主题使用一个子目录。使用 fcitx5-configtool
可以调出 Fcitx5 的配置界面。
Rime 输入法的方案配置放在 ~/.local/share/fcitx5/rime 目录中。
rime_deployer
是 Rime 输入法的部署命令,部署使用 --build 参数,后面接 user_data_dir,fcitx5 默认为 ~/.local/share/fcitx5/rime,所以 staging_dir 是 ~/.local/share/fcitx5/rime/build;shared_data_dir 是存放 rime 默认 schema 数据的地方,默认是 /usr/share/rime-data。部署指令就是:
rime_deployer --build \
~/.local/share/fcitx5/rime/ \
/usr/share/rime-data \
~/.local/share/fcitx5/rime/build
(rime_deployer - h
可查看全部参数)
要让 fcitx5 在多个图形环境中正常工作还要在 ~/.xsession 中导出以下环境变量:
export INPUT_METHOD=fcitx5
export GTK_IM_MODULE=fcitx5
export QT_IM_MODULE=fcitx5
export XMODIFIERS=@im=fcitx5
要让 fcitx5 随 i3 启动,还要在 i3 配置文件 ~/.config/i3/config 中写入 fcitx5 的启动命令:
exec_always --no-startup-id fcitx5
PulseAudio 用户级配置的目录为 $XDG_CONFIG_HOME/config 即 ~/.config/pulse。
默认配置中,PulseAudo daemon 在所有 client 断开到它的连接后,一段时间内没有新的 client 连入时,会自动退出。需要 daemon 的时候 client 会通过 dbus 再启动它。这个功能可以在 daemon.conf 中关闭。
pacmd list-sinks | grep -e 'name:' -e 'index:'
输出的 name 字段的值就是各设备的设备名,可以用它来识别设备。
如果键盘支持的话,调整音量可以通过功能键来完成。这在 i3 配置中可以这样写:
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id \
pactl set-sink-volume @@DEFAULT_SINK@@ +5% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id \
pactl set-sink-volume @@DEFAULT_SINK@@ -5% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id \
pactl set-sink-mute @@DEFAULT_SINK@@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id \
pactl set-source-mute @@DEFAULT_SOURCE@@ toggle && $refresh_i3status
X 提供了两种屏幕空白模式: BlankTime 和 DPMS (display power management signaling)。
BlankTime 是 "假的" 屏幕空白: 屏幕变黑,但背光和电源仍然保持开启。这并不会减少电力消耗。可以将其视为一种非常单调的屏幕保护程序。默认的超时时间是 10 分钟。
在现在的 Xorg 版本中,BlankTime 已经消失,取而代之的是 Screen Saver。可配置项有 prefer blanking, allow exposures, timeout 和 cycle。
Screen Saver 的工作方式和 BlankTime 不同:
DPMS 仅适用于支持此类电源管理的显示器,多数现代显示器都支持。它包括三个配置项:
可以通过 xset -q
查询这两种设置。输出中的这两段就是它们对应的配置:
...
Screen Saver:
prefer blanking: yes allow exposures: yes
timeout: 0 cycle: 600
...
DPMS (Energy Star):
Standby: 0 Suspend: 3600 Off: 3600
DPMS is Enabled
Monitor is On
注: 单执行 xset
可以看到全部的可配置项。
从功能上来说,只需要 DPMS 即可实现长时间无活动自动息屏的动作,但有些老硬件并不支持 DPMS。所以,需要测试。
sleep 1; xset s activate
延迟一秒后进入使屏幕保护模式,如果有屏幕保护程序的话,激活它。如果使用了老版本的 x11,sleep 不能不写,因为早先的 X 在事件顺序上有些混乱,它会 blank 屏幕后立即取消 blank,因为 xset s active
命令先使得屏幕进入保护模式后,这个命令又被识别成了活动操作,所以马上又退出了屏幕保护模式。
sleep 1; xset dpms force off
将在延迟一秒后关闭屏幕。也能用 standby, suspend 或 on 来代替 off。到暗光环境观察,屏幕关闭了吗?完全关闭了吗?没有背光?如果没有背光,那么当前硬件支持 DPMS。在有些硬件环境中,Xorg 使用 DPMS 时并没有真正使 DPMS 生效,它只是使屏幕变黑,背光仍然亮着。
如果当前硬件支持 DPMS,那么先使用 xset dpms 0 3600 3600
设置屏幕息屏时间,后用 xset s off
关闭 Screen Saver 模块。0 3600 3600 分别对应 Standby: 0, Suspend: 3600, Off: 3600。把 Suspend 和 Off 都用 3600 是因为,触发 Suspend 的时候,背光已经没有了,而背光消耗了多数电量,关背光后进不进 Off 状态已经没那么重要了,索性就让显示器直接关闭所有电源。
如果当前硬件不支持 DPMS,此时只能用 Screen Saver 模块了。先用 xset -dpms
来关闭 DPMS 模块 (xset +dpms
是开启 DPMS 模块),再用 xset s 3600 600
配置 3600 秒没有活动就关闭屏幕,每 10 分钟切一次屏幕保护程序的模式。
如果显示器支持 DPMS,那么把 DPMS 的配置 xset dpms 0 3600 3600
和关闭 Screen Saver 的配置 xset s off
写进 i3 的配置文件即可:
exec_always --no-startup-id xset s off
exec_always --no-startup-id xset dpms 0 3600 3600