如何从命令行更改鼠标指针主题?

如何从命令行更改鼠标指针主题?

过去,我曾尝试使用 Unity Tweak Tool 来更改鼠标指针主题。但是,我也想从终端更改它。如何在 Ubuntu 16.04 上执行此操作?

答案1

后台设置如何工作

每个用户的个人资料都由数据库管理DConf。您可以阅读我对这个问题的回答以了解更多信息:基于 GUI 的应用程序是否在后台执行 shell 命令? 每个特定设置都有与之关联的模式(有点像 URL)和键(特定设置的名称)。

dconf watch /让我们通过运行然后在 UTT 中更改指针主题来找出当我们更改光标主题时 Unity Tweak Tool 会改变哪些设置:

$ dconf watch /
/org/gnome/desktop/interface/cursor-theme
  'crystalblue_classic'

太好了,现在我们知道要改变什么模式和密钥了!

gsettings 工具 - 调整者的朋友

幸运的是,有一个名为的命令行实用程序gsettings,我们可以使用它来更改所需的设置。此工具通常用于 shell 脚本。对于其他类型的语言(例如 Python 或 C),存在 GSettings 库,允许我们执行相同的操作。在这里我们特别想使用它,gsettings因为它可以在命令行上使用。

需要注意的区别是,与 不同dconf,模式是用点分隔的,而不是用斜线分隔的。因此,gsettings可以理解org.gnome.desktop.interface模式。

因此,我们可以这样做:

$ gsettings set  org.gnome.desktop.interface cursor-theme 'redglass'

请注意,在这个例子中,我使用的Redglass是我已经安装的主题之一,您可能没有,因此请使用您在 UTT 中列出的一些值。

查找架构的值

通常,可以使用以下选项来查找gsettings架构上的所有可能选项range

$ gsettings range com.canonical.Unity.Launcher launcher-position                                                                                                                        
enum
'Left'
'Bottom'

不幸的是,我们需要用来改变光标主题的模式没有enum值:

$ gsettings range  org.gnome.desktop.interface cursor-theme                                                                                                                             
type s

因此,或者,您可以做的(以及 UTT 显然所做的)是列出/usr/share/icons文件夹中包含cursors文件夹的所有目录,如下所示:

$ ls -d /usr/share/icons/*/cursors                                                                                                                                                      
/usr/share/icons/crystalblue_classic/cursors/      /usr/share/icons/crystalgray_nonanim/cursors/       /usr/share/icons/crystalwhiteleft_nonanim/cursors/

... more output here

然后只需选择每个主题的文件夹名称作为新值。

进一步了解 - 编写 Shell 脚本

当然,我们不想反复处理多个命令。相反,让我们通过 shell 脚本来简化它,在这个特定情况下 - 一个bash脚本(因为我们想利用数组等高级功能,并且因为我们不追求可移植性到 Ubuntu 以外的系统)将列出可用的主题并允许我们选择我们想要的主题。

#!/usr/bin/env bash

fifo="/tmp/themes_script.fifo"
mkfifo "$fifo"

declare -a themes
find /usr/share/icons -maxdepth 2 -type d  -name "cursors" -printf "%P\n" > "$fifo" &

while IFS= read -r line
do
        themes+=("${line%/*}")
done < "$fifo"
rm "$fifo"

echo ">>> Please enter the number of new theme for cursor"
select opt in "${themes[@]}"
do
     if [ $REPLY -le ${#themes} ]
     then
          gsettings set org.gnome.desktop.interface cursor-theme  \'$opt\' &&
          exit 0
     else
          echo "Improper argument" > /dev/stderr
          exit 1
     fi
done

测试运行:

bash-4.3$ ./change_cursor_theme.sh 
>>> Please enter the number of new theme for cursor
 1) crystalblueleft_nonanim   14) crystalgray_nonanim
 2) crystalgreenleft_classic  15) DMZ-Black
 3) crystalwhite_nonanim      16) crystalgrayleft
 4) handhelds             17) crystalblueleft_classic
 5) crystalgreen          18) Deepin-sapphire
 6) whiteglass            19) crystalwhiteleft
 7) crystalgray           20) crystalgreenleft_nonanim
 8) crystalwhiteleft_nonanim  21) crystalgrayleft_nonanim
 9) redglass              22) DMZ-White
10) crystalblue           23) crystalblueleft
11) crystalwhite          24) crystalblue_nonanim
12) crystalblue_classic       25) crystalgreenleft
13) crystalgreen_nonanim      26) crystalgreen_classic
#? 9
bash-4.3$ 

答案2

除了上述 Sergiy Kolodyazhnyy 的回答之外,还值得检查用户的本地目录,因为大多数主题默认安装在那里:

#!/usr/bin/env bash

fifo="/tmp/themes_script.fifo"
mkfifo "$fifo"

declare -a themes
find /usr/share/icons -maxdepth 2 -type d  -name "cursors" -printf "%P\n" > "$fifo" &
find ~/.icons -maxdepth 2 -type d  -name "cursors" -printf "%P\n" >> "$fifo" &

while IFS= read -r line
do
        themes+=("${line%/*}")
done < "$fifo"
rm "$fifo"

echo ">>> Please enter the number of new theme for cursor"
select opt in "${themes[@]}"
do
     if [ $REPLY -le ${#themes} ]
     then
          gsettings set org.gnome.desktop.interface cursor-theme  \'$opt\' &&
          exit 0
     else
          echo "Improper argument" > /dev/stderr
          exit 1
     fi
done

相关内容