gtk - включить / установить темную тему для каждого приложения

<p>есть ли способ установить gtk-application-предпочитать-темную-тему для приложения?</p><p>обычно это устанавливается в коде приложением. такие приложения, как eye of gnome и totem, включают его. я хочу, чтобы пользователь включил его для каждого приложения.</p><p>для gnome-терминала я обычно использую белую текстовую схему на черном фоне, а наличие темной границы окна улучшит общий вид.</p><p>я также хочу включить его для vlc.</p>

<p>с <code>gtk+ ≥ 3.12</code> вы можете загрузить определенную тему и ее вариант (темный, светлый) для каждого приложения<sup>1</sup> база через переменную окружения <code>gtk\_theme=theme:variant</code>. в соответствии с <a href="https://developer.gnome.org/gtk3/stable/gtk-running.html"><code>gtk+</code> справочное руководство</a> :</p><pre><code>gtk\_theme. if set, makes gtk+ use the named theme instead of the theme that is specified by the gtk-theme-name setting [...] it is also possible to specify a theme variant to load, by appending the variant name with a colon, like this: gtk\_theme=adwaita:dark. </code></pre><p>итак, чтобы загрузить<sup>2</sup> <em> темный </em> вариант, который вы запустите:</p><pre><code>gtk\_theme=adwaita:dark gedit </code></pre><p>аналогично, для достижения противоположного (когда тема по умолчанию темная), вы загружаете <em> вариант light </em>:</p><pre><code>gtk\_theme=adwaita:light gedit </code></pre><p>обратите внимание, что если вы хотите использовать его через пользовательский модуль запуска (<code>.desktop</code> файл) вам нужно будет добавить <code>env</code> к команде в строке <code>exec</code>:</p><pre><code>exec=env gtk\_theme=adwaita:dark eog %u </code></pre><p><sup>1: стоит отметить, что - согласно решению разработчиков - новее <code>gnome-terminal</code> имеет собственную конфигурацию через меню> настройки и игнорирует тему. кроме того, поскольку это довольно новая вещь, некоторые приложения gtk + 3 могут (пока) не соблюдать <code>gtk\_theme</code> переменная окружения.<br> 2: это не работает, если у вас уже есть работающий экземпляр этого приложения, например если <code>nautilus</code> уже работает в темном режиме, тогда выполняется <code>gtk\_theme=adwaita:light nautilus</code> откроет новое окно <code>nautilus</code>, но все еще в темном режиме. я не знаю, если это особенность или ошибка ...</sup></p>

<p>для приложений gtk + -3 вы можете применить вариант темной темы, используя файл settings.ini gtksettings:</p><pre><code>$ mkdir -p $home/.config/gnome-terminal/gtk-3.0 # the path before gtk-3.0 is arbitrary $ cat >> $home/.config/gnome-terminal/gtk-3.0/settings.ini << eof [settings] gtk-application-prefer-dark-theme=true eof $ echo 'alias gnome-terminal="xdg_config_home=$home/.config/gnome-terminal gnome-terminal" >> $home/.bashrc для не-gtk + приложений, таких как vnc, вы по-прежнему можете использовать декорации темных окон, установив _gtk_theme_variant x свойство типа utf8_string до dark. чтобы сделать это с помощью xprop, введите следующую команду и затем щелкните окно:$ xprop -f \_gtk\_theme\_variant 8u -set \_gtk\_theme\_variant "dark" </code></pre><p><code>xprop</code> также может выбирать окна по <code>wm\_name</code> свойство (метка строки заголовка) или по идентификатору окна:</p><pre><code>$ xprop -f _gtk_theme_variant 8u -set _gtk_theme_variant "dark" -name "spotify premium - linux preview" $ xprop -f \_gtk\_theme\_variant 8u -set \_gtk\_theme\_variant "dark" -id 0x380002b </code></pre><p>чтобы получить идентификаторы и имена окон, используйте <code>xlsclients -l</code>.</p>

<p>вот скрипт bash, который я использовал для запуска приложения с другой темой. я не использовал его годами, поэтому я не знаю, будет ли он работать с текущим gtk.</p><pre><code>#!/bin/bash # lauch a gtk application with a different theme # set gtkrcfile variable to your favourite theme gtkrcfile=clearlooks gtk2\_rc\_files=/usr/share/themes/"$gtkrcfile"/gtk-2.0/gtkrc "$@" </code></pre><p>вот немного информации, которую я получил из архивов ubuntu fourms. не уверен, что это будет проблемой. ( <a href="http://ubuntuforums.org/archive/index.php/t-688098.html">здесь</a> ) есть также пост в блоге, в котором подробно описывается этот метод. ( <a href="http://furryface.co.cc/1970/01/01/override-gtk-theme">здесь</a> ) и ( <a href="http://urukrama.wordpress.com/2008/07/13/setting-a-custom-gtk-theme-for-specific-applications/">здесь</a> ). на этом сайте также есть похожий вопрос, на который уже дан ответ. ( <a href="https://unix.stackexchange.com/questions/2355/how-do-i-execute-a-program-in-gnome-and-make-it-use-another-gtk-theme-other-than">здесь</a> )</p><blockquote> <p>в gnome приложения получают свою тему от демона gnome-settings-daemon. это мгновенно применяет любое изменение темы ко всем активным приложениям, делая невозможным изменение темы для каждого приложения.</p> </blockquote>

<p>специально для <code>gnome-terminal</code>, вы можете использовать следующее, чтобы сделать конкретное приложение темным:</p><pre class="lang-bsh prettyprint-override"><code>gsettings set org.gnome.terminal.legacy.settings theme-variant 'dark' </code></pre>

<p>я написал небольшой скрипт для этого:</p><pre class="lang-bsh prettyprint-override"><code>#!/bin/bash if [ $# -eq 0 ]; then xprop -f _gtk_theme_variant 8u -set _gtk_theme_variant "dark" exit $? fi gtk\_theme="$(gsettings get org.gnome.desktop.interface gtk-theme)" export gtk_theme="${a%%:*}:dark" export gtk\_theme\_variant="dark" "$@" & pid="$!" echo "started darkening for pid=$pid" cnt=0 while :; do if [ $cnt -lt 1000 ]; then sleep .1 let 'x=x-1' else sleep 5 fi if ! kill -0 $pid 2>/dev/null; then echo "darkening for pid=$pid done" exit 0 fi regex="$(echo $pid | cat - <(command ps -o pid:1 --no-headers --ppid $pid) | paste -sd "|" -)" wmctrl -lp  | rg -i "^(0x[a-f0-9]+)s+d+s+($regex)\s" -o --replace '$1' \ | xargs -i @ xprop -f \_gtk\_theme\_variant 8u -set \_gtk\_theme\_variant "dark" -id @ done </code></pre><p>он использует <a href="https://github.com/burntsushi/ripgrep">https://github.com/burntsushi/ripgrep</a> для regex</p>