DBus による Cairo-Dock の制御やアプレットの自作

Cairo-Dock には、外部のプログラムや端末、スクリプトからドックの様々な操作が行えるようにするためのリモート操作インターフェイスが用意されています。

このリモート操作インターフェイスを利用すると、Cairo-Dock の C 言語の API を使用する必要なく、簡単に新しいアプレットを作成することもできます。

このページは、公式サイトの Wiki に書かれている説明を元にしています。

http://www.glx-dock.org/ww_page.php?p=Control_your_dock_with_DBus&lang=en

なお、説明は Cairo-Dock Ver.2.1.1 以降を前提にしています。

DBus 自体についての説明はとりあえずこちらなどを参考に。

http://ja.wikipedia.org/wiki/D-Bus


はじめに

Cairo-Dock の DBus インターフェイスを利用するには、Cairo-Dock の DBus プラグインの有効化が必要です。

Cairo-Dock のプラグイン/アプレットを集めた cairo-dock-plug-ins パッケージがインストール済みであることが前提。

Cairo-Dock の設定パネルから DBus プラグインにチェックを入れて有効にします。

インターフェイスについて

サービス

Bus には色々なプログラムが接続されています。その中の特定のプログラムと通信するには、まずそのプログラムの Bus 上のサービス名を指定する必要があります。

Cairo-Dock の場合、サービス名は以下になります。

org.cairodock.CairoDock

オブジェクト

各プログラムは、Bus 上のリモート・オブジェクトをロードします。他のアプリケーションは、そのリモート・オブジェクトを掴み、そのプログラムとやり取りするために使用することができます。

リモート・オブジェクトは与えられるパスに格納されますが、Cairo-Dock ではメイン・オブジェクトを1つ、以下のパスに格納します。

/org/cairodock/CairoDock

* 実際は、Cairo-Dock により提供されるオブジェクトは上の1つだけではなく、後述のリモート・アプレットに関連するオブジェクトも提供されます。それについては「DBus アプレットの作成」の項を参照してください。

インターフェイス

さらに、各オブジェクトは1つまたは複数のインターフェイスを持っています。インターフェイスは、メソッド(プログラムに送信できるメッセージ)とシグナル(プログラムから送信されるメッセージ)の集まりで構成されます。

Cairo-Dock のメイン・オブジェクトについては、固有の名前のインターフェイスが1つあります。

org.cairodock.CairoDock

これから、 Cairo-Dock の DBus インターフェイスが用意しているメソッドなどについて個別に説明していきます。

各説明には Bash での用例も併記しているので、端末にその用例のコマンドをコピーして貼り付けて実行するだけで、実際の動作を簡単に試してみることができます。

Bus にメッセージを送信する基本コマンドは、

dbus-send

Cairo-Dock にメッセージを送るコマンドの基本形は以下のようになります。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.xxx type1:arg1 type2:arg2 ...

xxx と書かれた部分が送信するメソッドの名前であり、type はそれに続く引数の内容の種類(引数が文字列値の場合は string、整数値は int32、真偽値は boolean、 等)、arg(argument)は引数の内容(”文字列”, 123, true、 等)。


ドックに働きかけるメソッド

Reboot(再起動):

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.Reboot

Quit(終了):

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.Quit

ReloadModule(モジュールの再読み込み):

ドックの設定パネルから特定のモジュールの設定画面に移動して「適用」ボタンを押したときと同じ動作。

ゴミ箱(dustbin)モジュールを再読み込みさせる例。
dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.ReloadModule string:dustbin

ShowDock(ドックの表示/一時的に隠す):

コマンドラインの最後に引数として記述した真偽値(真 : true または 偽 : false )に応じてドックを表示(true)したり、隠したり(false)します。

ドックが複数の場合、すべてのドックが対象になります。

ドックを隠す場合の例。
dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.ShowDock boolean:false

ShowDesklet(デスクレットの表示):

デスクトップの表示(ShowDesktop)アプレットを中クリックしたときと同じ動作(デスクレット以外のウィンドウを対象にした”デスクトップの表示”)。

真偽値の引数によって、Compiz のウィジット・レイヤ上に配置したデスクレットも表示対象に含めるか否かを指定。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.ShowDesklet boolean:true

LoadLauncherFromFile(ファイルからランチャーの読み込み):

.desktop ファイルを読み込んで、ドックにランチャーを作成します。

.desktop ファイルのパスを引数に取ります。

下は Nautilus ファイル・ブラウザのランチャーを作成する例。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.LoadLauncherFromFile string:/usr/share/applications/nautilus.desktop

ただし、このようにして作成したランチャーはドックを終了させるまでのみ有効な一時的なもので、プロパティの編集を行うこともできません。

ドック再起動後も利用できるランチャーを作成したい場合は、下のように Cairo-Dock の現在のテーマのフォルダに .desktop ファイルをコピーします。
$ cp /usr/share/applications/nautilus.desktop ~/.config/cairo-dock/current_theme/launchers

CreateLauncherFromScratch(カスタム・ランチャーの作成):

ランチャーの名前やアイコン画像、コマンド、帰属先コンテナの名前( “none” の場合は _MainDock_)を指定した一時的なランチャーの作成。

下は「マイランチャー」という名前で、画像のパスが path/to/image 、コマンドが xterm -e ‘echo テスト’ のランチャーをメイン・ドックに配置する例。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.CreateLauncherFromScratch string:"/path/to/image" string:"マイランチャー" string:"xterm -e 'echo テスト'" string:none

ドック再起動後も利用できるランチャーを作成したい場合は、必要な値を記述した .desktop ファイルを作成して ~/.config/cairo-dock/current_theme/launchers に置く必要があります。


アイコンに働きかけるメソッド

ランチャーのアイコンの場合はそのプロパティに記載されている名前かつ(または)コマンドによって、アプレットのアイコンの場合はそのモジュール名によって、働きかけの対象を指定します。

以下に列挙したメソッドは、各メソッド独自の引数の後に、3つの文字列値(string)の引数を共通して受け取ります。

メソッド共通の3つの文字列の引数の記述順序は、「アイコンの名前(ラベル)、アイコンのコマンド、モジュール(アプレット)の名前」で、これによって対象のアイコンが指定されます。

個別の名前やコマンドを指定する以外に “none” または “any” を使用することもできます。

例えば Firefox のランチャーに該当させる場合、引数を「 any、 firefox、none 」のように与えます。

これはつまり、あらゆる(any)名前/ラベルに該当し、かつコマンドが firefox となっている、モジュール/アプレットではない(none)通常のランチャーのアイコン、ということになります。

ゴミ箱(dustbin)アプレットに該当させたい場合は、名前/ラベルの内容は問わず(any)、ランチャーと違ってコマンドはなし(none)で、ゴミ 箱アプレットの名前(dustbin)を最後に記述すればよく、「 any、 none、 dustbin 」の順に引数として与えます。

SetQuickInfo(クイック情報の設定):

指定したアイコン上にクイック情報を設定。アイコンの上に小さな文字を表示します。

以下はゴミ箱(dustbin)アプレットのアイコンの上に「123」と表示させる例。ゴミ箱に中身のファイル数を表示するようにしている場合はそれに代えて表示されます。

ラベルとして表示させる文字列の引数「123」の後に、前述の「アイコンの名前(ラベル)、アイコンのコマンド、モジュール(アプレット)の名前」の3つの引数が続いています。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.SetQuickInfo string:123 string:none string:none string:dustbin

SetLabel(ラベルの設定):

ラベル(アイコンの名前)を設定して、既存のものの代わりにそれを表示。

以下は Gnome 端末のランチャーに「Fabounet」(Cairo-Dock 製作者のハンドル名)という名前を設定する例。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.SetLabel string:"Fabounet" string:any string:gnome-terminal string:none

SetIcon(アイコン画像の設定):

アイコンの画像を設定して、既存のものの代わりに表示。

アイコンのテーマのディレクトリに存在する画像ファイルの場合は、ファイルのパスによる指定の他、ファイルの名前のみによって指定することもできます。

以下のコマンドラインは、Nautilus のランチャーに Firefox の画像を設定する例。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.SetIcon string:firefox-3.0 string:none string:nautilus string:none

Animate(アニメーション表示):

指定したアニメーションの種類と表示回数で、アイコンをアニメーション表示。

以下は「デフォルト」のアニメーションを「2回」、Firefox のアイコンに適用する例。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.Animate string:default int32:2 string:any string:firefox string:none

以下は「炎」のアニメーションを「1~2分間」、Clock アプレットに適用する例。Clock アプレットのアイコンが燃え上がりますが、マウスカーソルをアイコン上に持っていった時点で、表示中のアニメーションは中止されます。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.Animate string:fire int32:60 string:none string:none string:clock

ShowDialog(ダイアログ表示):

指定したアイコンにメッセージを表示する吹き出し状のダイアログをポップアップさせます。

指定アイコンが見つからない場合、ドック全般のメッセージとして表示します。ダイアログはクリックすれば閉じることができます。

以下は「Cairo-Dock はスゴイ!」というダイアログを「5秒間」ポップアップ表示させるコマンド。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.ShowDialog string:"Cairo-Dock はスゴイ!" int32:5 string:none string:none string:none


DBus アプレットの作成

Cairo-Dock には、上述のメソッド群で構成された1番目のインターフェイス org.cairodock.CairoDock の他に、2番目のインターフェイス org.cairodock.CairoDock.applet があります。

このインターフェイスには、外部アプレット(ドックの外部から読み込まれたアプレット)とやり取りを行うためのメソッドやシグナルが用意されています。

これによって、別のプロセスからドックに読み込まれる完全機能のアプレットを作成することができます。

そのためには以下の3段階で構成された手順が必要です。:

  1. 新しいモジュールを登録して、それを有効化する。→ これにより、ドックにアプレット(またはデスクレット)が作成される。
  2. このアプレットに関連付けられたリモート・オブジェクトを取得する。→ これにより、このアプレットのインターフェイス( org.cairodock.CairoDock.applet )の使用が可能になる。
  3. アプレット上のイベント(クリック、再読み込み、等々)を検知するシグナルに接続して、アプレットに働きかけるメソッド(アイコン画像の変更、アイコンのアニメ表示、等々)を使用する。

RegisterNewModule(新規モジュール登録):
新しいモジュールを登録するためのメソッド。
モジュールに関する以下のような内容の4つの引数を、このメソッドに渡す必要があります。

これによって新しいモジュールを登録すると、.confi ファイルの設定に従い、アイコンが作成されてコンテナ(ドック)に加わります。

備考: .conf ファイルは他のデータ・ファイルと同じパスに置く必要があります。このファイルにデフォルトのパラメータ値を記入しておけば、アプレットがすぐ使える状態になります。アプレットの名前が xxx だとすると、ファイル名は xxx.conf にしなければなりません。and it should contain at least the groups “Icon” and “Desklet”, as any other applet (ログアウト・アプレットの logout.conf ファイルをコピーしてテンプレートとして使用することができます。)
また、デフォルトとして使用されるアイコン画像ファイル(どんな画像形式でも構いません。)も同じフォルダに配置する必要があります。アプレットの設定パネルに表示される preview 画像ファイルについても同様です。

以下は「demo」という名のモジュールを登録する例。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.RegisterNewModule string:"demo" int32:2 string:"これは Fabounet が製作した\n外部アプレットです。" string:"$HOME/demo"

このモジュールは「アクセサリ」カテゴリに属することになり、そのファイルは $HOME/demo に存在します。さらに追加的に以下のファイルも存在します。:

外部アプレットをドックによって自動実行する方法 :
アプレットのフォルダを ~/.config/cairo-dock/third-party/ にコピー

オブジェクトの取得

モジュールが登録されると、Cairo-Dock は Bus にリモート・オブジェクトを作成します。
/org/cairodock/CairoDock/アプレットの名前

今回の例の「demo」モジュールでは、パスがこのようになります。:

/org/cairodock/CairoDock/demo

このオブジェクトは、org.cairodock.CarioDock.applet というユニークな名前のインターフェイスが用意されます。

以下のコマンドによって、bash スクリプトからこのインターフェイスにアクセスすることができます。:

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.xxx type1:arg1 type2:arg2 ...

xxx と書かれた部分は送信するメソッドの名前であり、type はそれに続く引数の種類(string, int32, boolean 等)、arg(argument)は引数の内容(”文字列”, 123, true 等)


外部アプレットに働きかけるメソッド

以下は、アプレットに働きかけを行うためにインターフェイスによって提供されているメソッドの一覧ですが、どのアイコンに対しても働くわけではなく、上記の「DBus アプレットの作成」の手順により外部アプレットとして登録したアプレットのアイコンに対してのみ有効です。

SetQuickInfo(クイック情報の表示):
クイック情報をアイコン上に表示。(アイコン上に小さなテキストが表示されます。)
dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.SetQuickInfo string:123

SetLabel(ラベルの設定):
アイコンにラベル(名前)をセット。既存のものは上書きされます。
dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.SetLabel string:"Fabounet"

SetIcon(アイコンの設定):
アイコンに画像をセット。既存のものは上書きされます。
使用するアイコン画像はフルパスで指定したり、アイコンのテーマにある画像の場合はそのファイル名による指定も可能です。
dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.SetIcon string:firefox-3.0

Animate(アニメーション表示):
指定のアニメーションやその回数で、アイコンをアニメ表示。

「デフォルト」のアニメ効果を2回の場合。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.Animate string:default int32:2

「炎」のアニメ効果を60回の場合。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.Animate string:fire int32:60

ShowDialog(ダイアログの表示):
指定のメッセージや秒数で、アイコンの上に吹き出し状のダイアログをポップアップ表示。
$ dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.ShowDialog string:"Cairo-Dock is great \!" int32:5

AddDataRenderer(データの描画):
数値データのグラフやゲージによる描画をメソッド。
データ描画の種類(gauge(ゲージ)、graph(グラフ))や描画する値の個数、テーマを指定します。

$ dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.AddDataRenderer string:gauge int32:2 string:"Turbo-night-fuel"

RenderValues(値の描画):
アイコン上に何らかの値を描画。 これを利用するには、上のメソッドによって事前に Data Renderer を追加しておく必要があります。
また、ドックに送信する値の個数は上のメソッドで指定した数になります。値には 0 から 1 までの間の数値を与えます。
$ dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.RenderValues array:double:.7,.2

ControlAppli(アプリケーションの操作):
タスクバーの代わりにアプレット上から、外部アプリケーションのウィンドウを操作可能にするためのメソッド。(Logout や MusicPlayer、システムモニタ アプレットはこの機能を利用しています。)

パラメータは、操作したいアプリケーションのクラス名を指定するか(大抵の場合、そのアプリケーションの名前がクラス名に使用されていますが、例外もあるので “xprop | grep CLASS” コマンドを使用して確認してください。)、”none” を指定してアプリケーションの操作を中止。
dbus-send –session –dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.ControlAppli string:pidgin

PopulateMenu(右クリックメニューへの選択項目の追加):
アプレットのアイコンを右クリックしたときにポップアップ表示されるメニューに項目を追加するためのメソッド。(したがって、このメソッドは on_build_menu シグナルを受け取った後にのみ使用できます。)
このメソッドは、NULLで終端とみなす文字列の配列をパラメータとして受け取ります。
ユーザーがメニューに追加された項目を選択すると、”on_menu_select” シグナルと一緒に、その選択項目に割り振られた番号が得られます。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.PopulateMenu array:string:"選択肢","もう1つの選択肢"


シグナル

DBus インターフェイスには、いくつかのシグナルが用意されています。
シグナルに接続しておけば、ユーザーがアイコンをクリックしたときなど、ドック内で特定のイベントが発生すると、Cairo-Dock はそれを通知するシグナルを発信します。

on_click_icon
ユーザーがアイコンを左クリックしたときに発信されるシグナル。
修飾キーを押しながらクリックした場合、押された修飾キーに応じた整数値が引数として得られます。
自分が試した限りでは、修飾キーを押さない場合 256 shift=257 super=320

on_middle_click_icon
ユーザーがアイコンを中クリックしたときに発信されるシグナル。
引数なし。

on_scroll_icon
ユーザーがアイコン上でマウススクロールしたときに発信されるシグナル。
上スクロールは真 true、下スクロールは偽 false の真偽値が得られます。

on_build_menu

ユーザーがアイコンを右クリックしたときに発行されるシグナル。

引数なし。

ちなみに PopulateMenu メソッドを利用すれば、コンテキストメニューを表示させることができます。

demo という名前のアプレットのコンテキストメニューとして「選択肢 1」と「選択肢 2」の2つの選択項目を表示する例:

$ dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo org.cairodock.CairoDock.applet.PopulateMenu array:string:"選択肢 0","選択肢 1"

on_menu_select
コンテキストメニューの内容から1つ選択されたときに発信されるシグナル。
引数はメニューの一番上の項目を 0 とする整数値。

on_drop_data
アイコン上にファイルなどをドロップしたときに発信されるシグナル。
テキストまたは URL が引数として得られます。

on_reload_module
モジュールが再読み込みされたときに発信されるシグナル。
モジュールの設定が変更された場合には真 true、リサイズのみのときのように単純な再読み込みの場合は偽 false の真偽値が得られます。

on_init_module
モジュールが始動したとき(モジュールの最初の読み込みのとき、またはユーザーが一度モジュールを無効にした後、再びモジュールを有効にしたとき)に発信されるシグナル。
引数なし。

on_stop_module
モジュールが停止したとき(ドックを終了させたとき、またはユーザーがモジュールを無効にしたとき)に発信されるシグナル。
引数なし。


サブ・ドック(サブ・アプレット)について

サブ・アイコンを含んだサブ・ドック(ユーザーがアプレットの分離を選択している場合は、サブ・アイコンを含んだデスクレット)を作成することもできます。

メイン・ドックのメイン・アイコンと同様の方法でサブ・アイコンに関するやり取りもできるようにするために、Cairo-Dock は第2番目のオブジェクトを作成します。

すべてのサブ・アイコンのリモート・オブジェクトのリストを常に最新の状態で保持するのは非常に手間がかかるため、全部のサブ・アイコンを管理するためのオブジェクトが1つだけ作成されます。

個々のサブ・アイコンを一意に識別するために、アイコンの読み込みの際に各アイコンに ID を与えることになります。

この ID は、サブ・アイコンに関する全てのメソッドとシグナルで使用されます。

ビュー形式については、サブ・ドックにデフォルトとして設定されているものが適用されます。デスクレットの場合は 3D の「Caroussel」が適用されます。

オブジェクトは以下のパスに格納されます。

/org/cairodock/CairoDock/アプレットの名前/subicons

したがって、「demo」という名前のアプレットの場合は、

/org/cairodock/CairoDock/demo/subicons

このオブジェクトは以下の固有の名前のインターフェイスを持ちます。

org.cairodock.CairoDock.subapplet

AddSubIcons(サブ・アイコンの追加):
1つまたは複数のサブ・アイコンを読み込んで、外部アプレットに追加。
パラメータとして、NULLで終端とみなす文字列の配列(array)を受け取ります。
配列は3つごとの文字列を1セットとして読み込みます。:
「名前、アイコン、ID」… 名前はサブ・アイコンの名前、アイコンはアイコンに設定する画像、ID はサブ・アイコンを識別するための固有のID。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo/sub_icons org.cairodock.CairoDock.subapplet.AddSubIcons array:string:"第1のアイコン","firefox","id1","第2のアイコン","nautilus","id2"

RemoveSubIcon(サブ・アイコンの削除):

上記のメソッドによって追加されたサブ・アイコンの1つまたは全部を削除。
特定のサブ・アイコンを削除するにはその ID を指定、すべてのサブ・アイコンを削除するには NULL または “any” を指定します。

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo/sub_icons org.cairodock.CairoDock.subapplet.RemoveSubIcon string:"id2"

サブ・アイコンに関するメソッドとシグナル

サブ・アイコンに関するメソッドとシグナルは、基本的にメイン・アイコンとほぼ同様です。

メイン・アイコンに関するメソッドやシグナルと唯一違うのは、パラメータの最後にアイコンの ID を受け取ることです。

使用可能なメソッド: SetQuickInfo, SetLabel, SetIcon, Animate, ShowDialog
使用可能なシグナル: on_click_sub_icon, on_middle_click_sub_icon, on_scroll_sub_icon, on_build_menu_sub_icon, on_menu_select_sub_icon, on_drop_data_sub_icon

dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock/demo/sub_icons org.cairodock.CairoDock.subapplet.SetLabel string:"new_label" string:"id1"

PouplateMenu メソッドについては、クリックされたアイコン自体と結びつける形で実装されているわけではないため、同じ方法を取るわけにはいきません。
“on_menu_select_sub_icon” シグナルを受け取るために右クリックメニューに任意選択項目を表示させたい場合には、サブ・ドックのオブジェクトのインターフェイスではなく、アプレット・オブジェクトのインターフェイスを使用します。


TIPS

Dbus コマンドを cron で実行させたい場合は、コマンドの前に “DISPLAY=:0” を追加します。:

* * * * * DISPLAY=:0 /usr/bin/dbus-send --session --dest=org.cairodock.CairoDock /org/cairodock/CairoDock org.cairodock.CairoDock.Animate string:default int32:2 string:any string:firefox string:none


外部アプレットのデモ

以下の demo と demo.conf を同じディレクトリに配置して demo スクリプトを実行すると、外部アプレットの参考例を試すことができます。

ドックの起動とともにスクリプトを実行させたい場合は、~/.config/cairo-dock/third-party ディレクトリに例えば demo という名前のフォルダを作成して、そのフォルダ内に両方のファイルを配置します。

なお、その他のデモや外部アプレットを以下から入手することもできます。

http://bazaar.launchpad.net/~cairo-dock-team/cairo-dock-plug-ins-extras/third-party/files/head%3A/

リモート・アプレットのスクリプト demo

#!/usr/bin/python
### We assume the name of this applet is "demo_python"
### Copy this folder into ~/.config/cairo-dock/third-party.
### In the folder we have :
### demo_python (the executable script), demo_python.conf (the default config file), "icon" (the default icon of the applet) and "preview" (a preview of this applet)

### import ###
import sys
import gobject
import glib
import gtk
import dbus
import os.path
from dbus.mainloop.glib import DBusGMainLoop

### let's connect to the dock. ###
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
try:
    dock_object = bus.get_object("org.cairodock.CairoDock",
            "/org/cairodock/CairoDock")
except dbus.DBusException:
    print "Cairo-Dock not found on bus (did you activate its 'DBus' plug-in ?)"
    sys.exit(1)
dock = dbus.Interface(dock_object, "org.cairodock.CairoDock")

### let's register our applet ! ###
applet_name=os.path.basename(os.path.abspath("."))
applet_share_data_dir=os.path.abspath(".")
print ">>> registering our applet..."
dock.RegisterNewModule(applet_name,
    "This is a distant applet\nIt simulates a counter:\n Scroll up/down to increase/decrease the counter,\n Click/middle-click to increase/decrease the counter by 10\n Drop some text to set it as the label.", # description
    "Fabounet", # author
    "0.0.1", # version of the applet
    3, # category "accessories"
    applet_share_data_dir) # folder containing the data of the applet (script, icon, preview, etc)
print ">>> applet registered."

### get our applet ! (if it doesn't exist, it means the user does not want to use it, so we quit) ###
try:
    applet_object = bus.get_object("org.cairodock.CairoDock",
            "/org/cairodock/CairoDock/"+applet_name)
except dbus.DBusException:
    print ">>> the '"+applet_name+"' module has not been started"
    sys.exit(2)
myIcon = dbus.Interface(applet_object, "org.cairodock.CairoDock.applet")

### we'll have a sub-docks, so we also get the sub-icons object ###
sub_icons_object = bus.get_object("org.cairodock.CairoDock",
            "/org/cairodock/CairoDock/"+applet_name+"/sub_icons")
mySubIcons = dbus.Interface(sub_icons_object, "org.cairodock.CairoDock.subapplet")

### init ###
def init():
    # register to the notifications on our applet
    print ">>> INIT"
    myIcon.connect_to_signal("on_click", action_on_click)
    myIcon.connect_to_signal("on_middle_click", action_on_middle_click)
    myIcon.connect_to_signal("on_build_menu", action_on_build_menu)
    myIcon.connect_to_signal("on_menu_select", action_on_menu_select)
    myIcon.connect_to_signal("on_scroll", action_on_scroll)
    myIcon.connect_to_signal("on_drop_data", action_on_drop_data)
    myIcon.connect_to_signal("on_init_module", action_on_init)
    myIcon.connect_to_signal("on_stop_module", action_on_stop)
    myIcon.connect_to_signal("on_reload_module", action_on_reload)
    mySubIcons.connect_to_signal("on_click_sub_icon", on_click_sub_icon)

### stop ###
def stop():
    print ">>> STOP"
    #dock.UnregisterModule(applet_name)
    # clean up memory
    #del dock_object
    #del dock
    #del applet_object
    #del myIcon

################################################
### Add your own code to the functions below ###
################################################
### global vars ###
count=0

### callbacks ###
def action_on_click(iState):
    global count
    print ">>> clic !"
    count += 10
    myIcon.SetQuickInfo(format(count, "d"))
    myIcon.RenderValues([count/100.])

def action_on_middle_click():
    global count
    print ">>> middle clic !"
    count -= 10
    myIcon.SetQuickInfo(format(count, "d"))
    myIcon.RenderValues([count/100.])

def action_on_build_menu():
    print ">>> build menu !"
    myIcon.PopulateMenu(["set min value", "set medium value", "set max value"])

def action_on_menu_select(iNumEntry):
    global count
    print ">>> choice",iNumEntry,"has been selected !"
    if iNumEntry == 0:
        count = 0
    elif iNumEntry == 1:
        count = 50
    elif iNumEntry == 2:
        count = 100
    myIcon.SetQuickInfo(format(count, "d"))
    myIcon.RenderValues([count/100.])

def action_on_scroll(bScrollUp):
    print ">>> scroll !"
    global count
    if bScrollUp:
        count += 1
    else:
        count -= 1
    myIcon.SetQuickInfo(format(count, "d"))
    myIcon.RenderValues([count/100.])

def action_on_drop_data(cReceivedData):
    print ">>> received",cReceivedData
    myIcon.SetLabel(cReceivedData)

def on_click_sub_icon(iState, cIconID):
    global count
    print "clic on the sub-icon '"+cIconID+"' !"

def action_on_init():
    global count
    print ">>> our module is started"
    count=1
    myIcon.ShowDialog("I'm connected to Cairo-Dock !", 4)
    myIcon.SetQuickInfo(format(count, "d"))
    myIcon.AddDataRenderer("gauge", 1, "Turbo-night")
    myIcon.RenderValues([0.])
    mySubIcons.AddSubIcons(["icon 1", "firefox-3.0", "id1", "icon 2", "trash", "id2", "icon 3", "thunderbird", "id3", "icon 4", "nautilus", "id4"])
    mySubIcons.RemoveSubIcon("id2")
    mySubIcons.SetQuickInfo("1", "id1")
    mySubIcons.SetQuickInfo("2", "id2")
    mySubIcons.SetQuickInfo("3", "id3")
    mySubIcons.SetQuickInfo("4", "id4")

def action_on_stop():
    global count
    print ">>> our module is stopped"
    stop()
    gtk.main_quit()

def action_on_reload(bConfigHasChanged):
    print ">>> our module is reloaded"
    if bConfigHasChanged:
        print ">>> and our config has changed"
        myIcon.AddDataRenderer("gauge", 1, "Turbo-night")
        myIcon.RenderValues([count/100.])
        mySubIcons.RemoveSubIcon("any")
        mySubIcons.AddSubIcons(["icon 1", "firefox-3.0", "echo pouet", "icon 2", "trash", "abc", "icon 3", "thunderbird", "def"])

### main ###
if __name__ == '__main__':
    init()
    gtk.main()
    stop()
    print ">>> bye"
    sys.exit(0)

リモート・アプレットの設定ファイル demo.conf

#!en;0.0.1

#[gtk-about]
[Icon]
#j+[0;128] Desired icon size for this applet
#{Set to 0Â to use the default applet size}
icon size = 0;0

#s Name of the icon as it will appear in its label in the dock :
name = Dbus Applet

#S+ Image's filename :
#{Let empty to use the default one.}
icon =

#d Name of the dock it belongs to:
dock name =

order=

#[gtk-convert]
[Desklet]

#j+[48;512] Desklet's dimension (width x height) :
#{Depending on your WindowManager, you can resize it with ALT + middle_click or ALT + left_click for exemple.}
size = 96;96

#i[-2048;2048] Desklet's position (x ; y) :
#{Depending on your WindowManager, you can move it with ALT + left_click}
x position=0
#i[-2048;2048] ...
y position=0

#b Is detached from the dock ?
initially detached=false
#l[Normal;Keep above;Keep below;On Widget Layer;Reserve space] Accessibility :
#{for CompizFusion's "widget layer", set behaviour in Compiz to: (class=Cairo-dock & type=utility)}
accessibility=0
#b Should be visible on all desktops ?
sticky=true

#b Lock position ?
#{If locked, the desklet can't be moved by simply dragging it with the left mouse button. Of course you can still move it with ALT + left_click.}
locked = false

#I[-180;180] Rotation :
#{in degrees.}
rotation = 0

use size=

#F[Decorations;gtk-orientation-portrait]
frame_deco=

#o+ Choose a decoration theme for this desklet :
#{Choose the 'personnal' one to define your own decorations below.}
decorations = default

#v
sep_deco =

#S+ Background image :
#{It's an image that will be displayed below the drawings, like a frame for exemple. Let empty to not use any.}
bg desklet =
#e+[0;1] Background tansparency :
bg alpha = 1
#i+[0;256] Left offset :
#{in pixels. Use this to adjust the left position of the drawings.}
left offset = 0
#i+[0;256] Top offset :
#{in pixels. Use this to adjust the top position of the drawings.}
top offset = 0
#i+[0;256] Right offset :
#{in pixels. Use this to adjust the right position of the drawings.}
right offset = 0
#i+[0;256] Bottom offset :
#{in pixels. Use this to adjust the bottom position of the drawings.}
bottom offset = 0
#S+ Foreground image :
#{It's an image that will be displayed above the drawings, like a reflect for exemple. Let empty to not use any.}
fg desklet =
#e+[0;1] Foreground tansparency :
fg alpha = 1

#[gtk-preferences]
[Configuration]

#s This is an option :
#{Let empty to use the default value.}
option =

#b Yes / No ?
yesno = false

#i[0;10] This is a value :
value = 1

コメントを残す