2015/05/28

Xfceの設定項目を自動で変更したり独自のランチャで切り替えたりする方法とその仕組み

Xfceの設定マネージャーで設定可能な(Xfceデスクトップ環境上の)設定項目は “xfconf” と呼ばれる設定システム上で管理されている。

この仕組みを用いて操作をすることで、頻繁に設定値を変更する設定項目がある場合などに設定マネージャーをいちいち起動せずに簡単に設定値の変更が行え、処理を自動化することも簡単にできる。

  1. 設定データの構造と型
    1. 設定箇所の識別
    2. データ型
  2. GUI設定ツールによる設定値の参照と変更
  3. コマンドによる設定値の参照と変更
    1. チャンネルとプロパティの一覧確認
    2. 個別の設定値の参照
    3. 設定値の変更
    4. 設定変更を行うランチャ例
  4. ライブラリを用いたCプログラムによる設定値の参照と変更

設定データの構造と型

設定箇所の識別

個別の “設定箇所” は以下の2つの要素を組み合わせたものとして識別される。

  • チャンネル[1] (設定対象のアプリケーションなどを示すもの)
  • プロパティ (どの部分や機能に関係したものかを示すもので、 “/” から始まり、同文字で区切られた階層構造を持つ)

データ型

設定の値は色々な形をとり、これに合わせて

  • 整数
    • 符号あり32bit
    • 符号なし32bit
    • 符号なし64bit
  • 倍精度浮動小数点数
  • 真偽値
  • 文字列
  • 構造体
  • 配列[2]

といったデータ型を扱える仕組みになっている。

データの読み書きをする際にはこのデータ型を指定する。

GUI設定ツールによる設定値の参照と変更

設定マネージャーに含まれている設定エディター(xfce4-settings-editorコマンド)では視覚的にこの設定システム上の設定値を参照・変更することができる。

Xfceの設定エディター

左側でチャンネルを選択すると右側のプロパティの一覧がそのチャンネルのものに切り替わり、プロパティごとの現在の設定値が一覧できる。値の部分では実際に設定値を変更することができ、変更は即座に反映される。

コマンドによる設定値の参照と変更

xfconf-queryというコマンドがあり、現在の設定値を取得したり、新しい設定値を適用したりできる。

以下に幾つかの出力例を載せているが、設定内容などによって出力内容は異なる。

チャンネルとプロパティの一覧確認

-lオプションのみを付けて実行すると全てのチャンネル名の一覧が得られる。

(チャンネルの一覧を表示)
$ xfconf-query -l
チャンネル:
  thunar-volman
  xfce4-power-manager
  ...
  xfce4-notifyd

この中に表示されている内の1つ(有効なチャンネル名)を-cオプションで指定して-lオプションを付けるとプロパティの一覧が得られ、更に-vオプションを付けることで現在の設定値と同時に表示できる。

(チャンネル xfwm4 内のプロパティ一覧を値と同時に表示)
$ xfconf-query -c xfwm4 -lv
/general/activate_action                 bring
/general/borderless_maximize             false
...
/general/zoom_desktop                    true

個別の設定値の参照

-cオプションに加え、対象のプロパティ名を-pオプションで指定して実行すると、その値が得られる。

(xfwm4 の /general/use_compositing の値を取得して表示)
$ xfconf-query -c xfwm4 -p /general/use_compositing
true

(xfwm4 の /general/workspace_names の値を取得して表示)
$ xfconf-query -c xfwm4 -p /general/workspace_names
値が 4 項目の配列になっています:

ワークスペース 1
ワークスペース 2
ワークスペース 3
ワークスペース 4

設定値の変更

  • 値が単一のものは “-s [新しい値]” オプションで新しい値を指定
  • 真偽値型のプロパティでは “-s [true もしくは false]” を指定する代わりに-Tオプションを指定することで現在と逆の値にできる
  • 配列型のプロパティでは “-t [型名の文字列]” を要素の分だけ順に並べた後で “-s [新しい値]” を要素の分だけ順に並べる
(xsettings の /Xft/Antialias の値を 1 にする)
$ xfconf-query -c xsettings -p /Xft/Antialias -s 1

(xfwm4 の /general/use_compositing の値を 真 にする)
$ xfconf-query -c xfwm4 -p /general/use_compositing -s true

(xfwm4 の /general/use_compositing の値を現在と逆にする)
$ xfconf-query -c xfwm4 -p /general/use_compositing -T

(xfwm4 の /general/workspace_names の配列値を4つの文字列型で指定)
$ xfconf-query -c xfwm4 -p /general/workspace_names -t string -t string -t string -t string -s "さくら" -s "ひまわり" -s "こすもす" -s "うめ"

コマンドは自動化に向いているため、例えばGPU資源を消費するコンポジット機能をゲームの動作時にのみ無効化するなど、設定の切り替えを自動的に行うようにすると便利なことがある。

(WineでRPG_RT.exeを実行するときだけアンチエイリアシングとコンポジットを無効化する例)
$ xfconf-query -c xfwm4 -p /general/use_compositing -s false; xfconf-query -c xsettings -p /Xft/Antialias -s 0; wine /path/to/RPG_RT.exe; xfconf-query -c xsettings -p /Xft/Antialias -s 1; xfconf-query -c xfwm4 -p /general/use_compositing -T

設定変更を行うランチャ例

真偽値型になっている設定項目を頻繁に手動で切り替える場合など、Xfceのデスクトップに値切り替え用のコマンドを記述したランチャを用意しておくと便利。

コンポジットの有効/無効を切り替えるランチャの設定例

初めて実行するときには確認が出るので許可する必要がある。

ランチャの実行確認ダイアログ

用途コマンド
コンポジット切り替えxfconf-query -c xfwm4 -p /general/use_compositing -T
アンチエイリアシング切り替えsh -c '[ "$(xfconf-query -c xsettings -p /Xft/Antialias)" = 0 ] && xfconf-query -c xsettings -p /Xft/Antialias -s 1 || xfconf-query -c xsettings -p /Xft/Antialias -s 0'

ライブラリを用いたCプログラムによる設定値の参照と変更

xfconfの設定システム上の操作に関する機能は “libxfconf” と呼ばれるライブラリが提供しており、前述のツール群からも利用されている。

このライブラリをC言語で直接用いることでも設定システム上の操作が行える。ソースをコンパイルするには同ライブラリの開発パッケージが必要。

  • はじめにxfconf_init()で初期化操作を行う
  • チャンネルはxfconf_channel_get()で得る
  • チャンネルに対してxfconf_channel_get_[型の名前]()で、関数ごとの型として現在の内容を読み込む
  • チャンネルに対してxfconf_channel_set_[型の名前]()で、関数ごとの型として新しい内容を書き込む
  • プログラムの最後でxfconf_shutdown()を呼んで後始末処理を行う
コンポジット機能の設定(オン/オフ)を切り替える例
[任意]ファイル名:xfconf-toggle-compositing.c ライセンス:パブリックドメイン
/*
 * xfconf-toggle-compositing - toggle xfwm4 compositing
 * Public Domain
 *
 * gcc -O2 -Wall -Wextra $(pkg-config --cflags libxfconf-0) xfconf-toggle-compositing.c -o xfconf-toggle-compositing $(pkg-config --libs libxfconf-0)
 */

#include <xfconf/xfconf.h>
#include <stdlib.h>

int
main ()
{
  const gchar *prop = "/general/use_compositing";
  XfconfChannel *ch;
  gboolean val;
  GError *err = NULL;

  if (! xfconf_init (&err))
  {
    g_printerr ("Failed to initialize xfconf: %s\n", err->message);

    return EXIT_FAILURE;
  }

  ch = xfconf_channel_get ("xfwm4");
  val = xfconf_channel_get_bool (ch, prop, FALSE);
  xfconf_channel_set_bool (ch, prop, (val ? FALSE : TRUE));

  xfconf_shutdown ();

  return EXIT_SUCCESS;
}
アンチエイリアシングの設定(オン/オフ)を切り替える例
[任意]ファイル名:xfconf-toggle-aa.c ライセンス:パブリックドメイン
/*
 * xfconf-toggle-aa - toggle Xft AA
 * Public Domain
 *
 * gcc -O2 -Wall -Wextra $(pkg-config --cflags libxfconf-0) xfconf-toggle-aa.c -o xfconf-toggle-aa $(pkg-config --libs libxfconf-0)
 */

#include <xfconf/xfconf.h>
#include <stdlib.h>

int
main ()
{
  const gchar *prop = "/Xft/Antialias";
  XfconfChannel *ch;
  gint val;
  GError *err = NULL;

  if (! xfconf_init (&err))
  {
    g_printerr ("Failed to initialize xfconf: %s\n", err->message);

    return EXIT_FAILURE;
  }

  ch = xfconf_channel_get ("xsettings");
  val = xfconf_channel_get_int (ch, prop, 0);
  xfconf_channel_set_int (ch, prop, (val ? 0 : 1));

  xfconf_shutdown ();

  return EXIT_SUCCESS;
}
使用したバージョン:
  • libxfconf 4.12.0
  • xfconf 4.12.0
  • xfdesktop 4.12.0
[1]: “チャネル” とも呼ばれることがある
[2]: 要素の型としては文字列のみの場合が多く、整数のみの場合もあるが、仕組みとしては “整数, 文字列” のように異なる型が入るようにもできる