目次


KDE 4 Plasmoid 入門

KDE 4 のデスクトップ・シェル Plasma は、その単純な Plasma アプレット (Plasmoid) でデスクトップ・エクスペリエンスを改善します

Comments

KDE (K Desktop Environment) は、UNIX® ライクなシステムのデスクトップ環境をベースとした無料のソフトウェア・プロジェクトです。KDE は日常的に必要とされる基本的なデスクトップ機能とアプリケーションだけでなく、開発者がシステム用のスタンドアロン・アプリケーションを作成するためのツールとマニュアルも提供します。KDE ソフトウェアは Qt ツールキットをベースとしています。KDE で 4 番目となるシリーズで最大の呼び物となっているのは再設計されたデスクトップとパネルで、これらはまとめて Plasma と総称されます。Plasma は Kicker、KDesktop、および SuperKaramba の機能を 1 つに統合した技術です。

KDE 4 がもたらす新しい希望

2008年1月に KDE (K Desktop Environment) の4 番目のメジャー・バージョンがリリースされましたが、それに対してはさまざまな反応がありました。このリリースでは、以下のように大掛かりな見直しが行われたのです。

  • KDE 3 コード・ベースの大部分を完全に作成し直す。
  • 多数の新しい技術を作成する。
  • コード・ベースのほとんどを何らかの方法、形状、形式でリファクタリングする。

最初の 4.0 リリースは大きな可能性を示したものの、変更がここまで広範囲にわたるとなると、このリリースで KDE 3と同等の機能が実現されることは望めません。その結果、このリリースは特定の領域では安定していないと広く報じられ、一部のユーザーは新規リリースへ即座に切り替えるのをためらっていました。欠陥の多くは 4.1 リリースで対処されましたが、それでもまだ、いくつかの機能の手抜かりが目立っていました。

しかし 2009年1月の KDE 4.2 のリリースではこれらの懸念事項のほとんどが解消されたことから、多くのユーザーがメインのデスクトップ環境として 4.2 リリースを使用するようになりました。

大勢のユーザーが KDE 4 の新しい機能と技術を使用するようになった今、その詳細を調べるにはちょうどよい時期です。

KDE 4.2 によるデスクトップの復活

この記事では、最も画期的な新しい技術のうち、Plasma と Plasma アプレット (大抵 Plasmoid と呼ばれます) に焦点を絞ります。

Plasma の背後にある概念は単純です。Plasma では、コンテナと呼ばれる表示可能な要素を 1 つ以上使用することができます。このコンテナには、ウィジェット/Plasmoid や他の Plasma コンテナなどの個々のアイテムを含めることができます。

この概念は特別新しいもののようには聞こえません。しかし、KDE 4 ではデスクトップ・シェル全体 (ユーザーに表示されるメイン・デスクトップ) が実は Plasma コンテナであるということがわかった途端、その考えは変わるはずです。つまり、タスク・バーや、タスク・リスト、時計、タスク・スイッチャー、k メニュー、クイック起動アイコンなどといったお馴染みのコントロールはすべて、Plasma アプレット (時計など) または Plasma コンテナ (タスク・バー) として実装されています。

これは極めて画期的な概念です。この概念により、KDE 4 のユーザーには驚くほど柔軟なカスタマイズの可能性が与えられます。開発者や個々のユーザーは、がデスクトップ・エクスペリエンスのほとんどすべての側面を変更し、その振る舞いを必要に応じて一新できるようになります。例えば、デフォルトのものよりも機能性の高い非常に強力なアプリケーション・ランチャーが必要だとしたら、現在開発中の Lancelot といったランチャーを使用することができます。また、表示域が限られている場合には、右クリックで単純なポップアップが表示される従来の軽量な DE (XFCE など) に見られるようなアプリケーション・ランチャーを作成し、正規のランチャーを削除して画面の表示域を増やすことも可能です。

この単純な概念は、KDE 4 を 1 つで何にでも対応できる万能のデスクトップに成長させるに違いありません。なぜなら、KDE の構成は、ディストリビューションやユーザーに応じて多種多様なものにすることができるためです。例えば高性能のマシンであれば、大規模で複雑なアプレットとすべてのオプション機能を活用できる一方、性能の低いマシンであれば、不要なコンポーネントを削除して必須コンポーネントだけに単純化した軽量バージョンにすることができます。したがって、KDE 4 をより特殊化された軽量の DE に置き換える必要はもはやありません。

Plasma アプレットは多少複雑になることもありますが、これらのアプレットは完全なアプリケーションではなく、ユーティリティー・スタイルの常時開いておきたい小規模なアプリケーションとなるように意図されています。Plasma アプレットは通常、デスクトップやタスク・バーに組み込まれます。その典型的な例は、システム・モニター、インスタント・メッセンジャー、ソーシャル・ネットワーキング・ツールなどです。

設計に共通するもう 1 つの特徴としては、画面で使用する表示域が比較的小さいという点も挙げられます。デスクトップ上に多数の Plasmoid が重なることなく常に開かれているといった状態は避けたいものです。Plasmoid はウィンドウ・マネージャーには個々のウィンドウとして現れないため、即時に Plasmoid 間を切り替えたり最小化したりすることはできません。

基本の Plasma コンテナ技術に加え、KDE の開発者たちが特に力を注いだのは、強力な Plasma アプレットをできる限り簡単かつ柔軟に作成できるようにすることです。そのため KDE 4 には以下の特徴があります。

  • すべての GUI 要素に対する SVG (Scalar Vector Graphics) の第一級のサポート。すべてのアプリケーション/アプレットは、解像度に依存することなくスムーズにスケーリングすることができます。同じ 1 つのアプリケーションが、30 インチの高解像度モニターと 8 インチのネットブック画面の両方で同じく正常に表示され、同じく有効に動作します。開発者が追加で作業を行う必要はありません。
  • 充実したテーマ設定サポート。相対パスを使用してあらゆるリソース (アイコン、背景など) を参照するように積極的に開発者に促しています。これにより、KDE は実行時に現在選択されているテーマをベースにリソースを自動的に見つけられるようになります。このため、開発者に追加作業の負担をかけることなく、すべての KDE 4 アプリケーションが、どのテーマでも一貫した外観を利用できるようになります。
  • 複数の言語のサポート。KDE 4 Plasmoid は (一般の KDE アプリケーションと同じく)、多種多様なプログラミング言語で作成することができます。この記事では C++ に重点を置いて説明しますが、Ruby、Python、Javascript などの他の言語でも作成することができます。
  • コンポーネントの再利用。KDE は、コンポーネントが提供するサービスをコンポーネント相互で再利用できるようにするための優れたサポートが備わっています。

Plasma の背景を少し説明したところで、ここからは早速、KDE 4.2 デスクトップに追加する単純な Plasmoid の作成に取り掛かります。

KDevelop 4 IDE

以下の手順は、KDE 4.2 デスクトップを実行していることを前提とします。一部あるいはすべての手順は KDE 4.1 にも適用できる可能性がありますが、その確認は行っていません。

まず最も重要なことから取り掛かることにしましょう。最初に KDE 開発ライブラリー、ヘッダーなどをすべてインストールする必要があります。

私が使用している現時点での安定版リリース、Kubuntu 8.10 (Intrepid Ibex) はデフォルトで KDE 4.1 に付属しているので、KDE 4.2 およびヘッダーを取得するために PPA リポジトリーを有効にしなければなりませんでした (詳細は「参考文献」を参照)。このステップは、Kubuntu 9.04 のユーザーには必要ありません (ただし、g++ や kdesdk などをインストールする場合には必要になります)。KDE 4.1 は現在 Canonical ではサポートされていないため、お使いのメイン・マシンではなく開発環境を使用するのが最善です。

PPA リポジトリーが追加された後、私は単純に、kdesdk、g++、cmake、そしていくつかの kde-dev パッケージを以下のようにインストールしました。

リスト 1. KDE 開発環境の構築
sudo apt-get update
sudo apt-get install kdesdk
install cmake
sudo apt-get install g++
sudo apt-get install libphonon-dev libplasma-dev

これで、必要なすべてのものがマシンに組み込まれました。別のディストリビューションを使用している場合は、上記のパッケージをインストールする方法を自分で探すことになります。

KDevelop 4 には、基本的な Plasmoid を自動的に生成する便利なテンプレートがあります。あいにく、この記事を執筆している時点での KDevelop 4 はまだベータ版なので、Intrepid に利用できるバイナリー・リリースはありません。そのため、この後の手順に従うにはソースからビルドする必要があります (手順については「参考文献」を参照)。

図 1 に示すように KDevelop が実行中の状態になったら、Project メニューを開いて New From Template を選択します。ダイアログが表示されたら C++ を展開し、次に KDE ブランチを展開して Plasma Applet Template を選択します。このテンプレートを選択した上で Application Name に新規アプリケーションの名前を入力し (dwPlasmoid と入力することを推奨)、NextFinish の順にクリックします。

図 1. プロジェクトの作成
プロジェクトの作成
プロジェクトの作成

最後に表示されるダイアログ・ボックスでは、Installation Prefix ディレクトリー ($HOME/plasmoids を推奨) とビルド・タイプ (Release または Debug を選択) を選択するように求められます。

これで、プロジェクトが作成されます。ここで時間をかけて、十分なコメントが挿入されている .cpp ファイルと .h ファイルに目をとおしてください。さらに、「Getting started」チュートリアル (「参考文献」にリンクを記載) でもコードの内容について詳しく説明しています。

プロジェクトは作成できたので、次はこのプロジェクトをビルドします。それには、Project を開いて build を選択します (または F8 を押します)。1 回目はこの操作によって configure が呼び出されますが、それ以降は単にビルドするだけです。

ビルドが正常に完了したとすると、次は Project メニューから Install を選択します。これにより、インストール・ファイルが前のステップで選択したディレクトリーにコピーされます。コピーが問題なく完了したら、次はテストをする準備は完了です。

新しい Plasmoid を実行するには、あらかじめ KDE にその存在を知らせなければなりません。まず、KDE に Plasmoid がインストールされているディレクトリー ($HOME/plasmoids) を認識させます。それには、端末エミュレーター konsole を開いて KDEDIRS 環境変数を設定し、その上で kbuildsyscocoa4 コマンドを実行します。端末エミュレーターを開いてリスト 2 の行を入力してください。

リスト 2. KDE に Plasmoid の場所を認識させる方法
export KDEDIRS=$KDEDIRS:$HOME/plasmoids
kbuildsyscocoa4

これで KDE が Plasmoid の場所を認識したので、Plasmoid を実行してみることができます。このテストには、plasmoidviewer という便利なユーティリティーを使用することができます。plasmoidviewer dwplasmoid と入力してこのユーティリティーを取得すると、図 2 に示すようにサンプル Plasmoid がウィンドウに表示されます。

図 2. 基本的な Plasmoid
基本的な Plasmoid

これは Plasmoid であるため、デスクトップに組み込むこともできます。しかし、この時点でデスクトップの Add widgets メニュー項目を使用して Plasmoid を追加しようとすると、Plasmoid のリストに dwPlasmoid は表示されるものの、追加することはできません。kbuildsyscocoa4 を実行したときには KDEDIRS が正しく設定されていましたが、Plasma デスクトップの起動時には正しく設定されていなかったためです。今の状態ではすべての必要なファイルを見つけることはできません。

この問題を修正するには、現在実行中の Plasma インスタンスを終了し、コマンドラインから再起動します (KDEDIRS が正しく設定されたままになるように、前に使用したコマンドを使用してください。そうでないと、以下のコマンドを実行する前に再設定しなければならなくなります)。以下のコマンドは Plasma をグレースフルにシャットダウンしてリスタートするため、この一連の動作を中断させるような操作を行わないよう注意してください (例えば、他の Plasmoid で保存されていない作業を保存するなど)。リスト 3 を実行して、現行の Plasma インスタンスを終了します。

リスト 3. 現行の Plasma インスタンスを終了する方法
kquitapp plasma && kstart plasma

これで、Plasmoid をデスクトップに追加することができるはずです。Plasmoid を追加すると、その単純なアイコンとメッセージが常時、デスクトップに表示されたままになります。さらに、この Plasmoid を 3 つ追加して、図 3 のように組み込みスケーリング機能と回転機能を利用することもできます。

図 3. デスクトップに組み込まれた Plasmoid の複数のインスタンス
デスクトップに組み込まれた Plasmoid の複数のインスタンス
デスクトップに組み込まれた Plasmoid の複数のインスタンス

これまで説明した操作の代わりに、インストール・ディレクトリーを /usr (このディレクトリーが、システム上で KDE がインストールされているディレクトリーであるという前提) に設定するという方法もあります。このように設定すると、KDevelop をスーパーユーザーとして実行しない限り (または、スーパーユーザーとしてビルド・ディレクトリー $HOME/projects/dwPlasmoid/build に移動し、sudo make install を実行することで、インストールを手動で実行しない限り)、インストール・ステップは失敗することになります。

注: これらの Plasmoid をデスクトップに保持し、リブートした後も Plasma を停止して再び起動することなく機能させるようにするには、KDE 4 に対し、起動時に Plasmoid ディレクトリーを調べるよう指示する必要があります。そのための方法の 1 つは、リスト 4 の行を kde4rc ファイル (/etc/kde4rc) に追加することです。

リスト 4. KDE に対して起動時に Plasmoid ディレクトリーを調べるように指示する方法
[Directories]
prefixes=/home/martynh/plasmoids

サンプルの変更

単純な Plasmoid が用意できたところで、今度は Plasmoid に静的なテキストを表示させるだけでなく、もう少し面白いことをさせてみましょう。ここでは Plasmoid を単純なメモリー・モニターに変換します。

まず、Plasmoid のウィンドウをすっきりさせるために、アイコンと背景を削除します。それにはコンストラクター (dwPlasmoid::dwPlasmoid) で、背景を設定するコードをコメント・アウトします (リスト 5 を参照)。

リスト 5. 背景を設定するコードのコメント・アウト
//    setBackgroundHints(DefaultBackground);
//    m_svg.setImagePath("widgets/background");

次に、描画インターフェース・メソッド (dwPlasmoid::paintInterface) のアイコンを追加する部分をコメント・アウトします (リスト 6 を参照)。

リスト 6. アイコンを設定するコードのコメント・アウト
//    p->ldrawPixmap(7, 0, m_icon.pixmap((int)contentsRect.width(),
      (int)contentsRect.width()-14));
//    p->save();

プロジェクトを前と同じようにリビルドして再度実行すると、黒一色のウィンドウに「Hello Plasmoid」というテキストが表示されるだけになります (図 4 を参照)。

図 4. 背景とアイコンが削除された Plasmoid
背景とアイコンが削除された Plasmoid

次は表示するテキストをもう少し意味のある内容にするため、テキストをシステム・メモリーの使用量に関するリアルタイムの情報に置き換えます。

Linux® を使い慣れているとしたら、/proc ディレクトリーの下には、実行中のシステムに関するリアルタイムの情報を提供する特殊なファイルがいくつもあることをご存知でしょう。この例で対象となるファイルは、/proc/meminfo に置かれています。このファイルの内容を調べるには、cat /proc/meminfo というコマンドを入力してください。このコマンドによって、システム・メモリーの現状に関する大量の情報が表示されます。

これから、このファイルを定期的に読み取って、Plasmoid に情報を表示するようにプログラムを変更します。まず取り掛かるのは、ファイルを読み取って情報を抽出するための変更です。この作業は、ありがたいことに Qt ツールキットを使用すると比較的楽になります。

次に行う作業は、新しいメソッドを作成して、いくつかの新規メンバー変数をクラスに追加することです。ヘッダー・ファイルでは、リスト 7 に示すように、このメソッドをスロットとして追加します (その理由はこの後すぐにわかります)。

リスト 7. スロットとしてのメソッドの追加
    public slots:
        void updateMemoryCount();

次に、新しい private メンバー変数をいくつか追加します (リスト 8 を参照)。

リスト 8. 新規 private メンバー変数の追加
     private:
        Plasma::Svg m_svg;
        KIcon m_icon;
        int m_totalMemory;
        int m_freeMemory;
        int m_swapMemory;
        int m_freeSwapMemory;

続いて、このメソッドの実装を cpp ファイルに含めます (リスト 9 を参照)。

リスト 9. cpp ファイルへの実装の追加
#include <QFile>
...
void dwPlasmoid::updateMemoryCount()
{
   // open the file
   QFile file("/proc/meminfo");
   if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
   {
        exit(-1);
   }

   QTextStream in(&file);
   QString line = in.readAll();

   // remove any extraneous characters
   line = line.simplified();

   // extract the information we are interested in using a regular expression
   QRegExp regex("MemTotal: (\\d+).*MemFree: (\\d+).*SwapTotal: (\\d+)"
    ".*SwapFree: (\\d+)");   regex.indexIn(line);
   m_totalMemory = (regex.cap(1).toInt());
   m_freeMemory = (regex.cap(2).toInt());
   m_swapMemory = (regex.cap(3).toInt());
   m_freeSwapMemory = (regex.cap(4).toInt());

   // force a re-draw
   update();
}

このメソッドはファイルを開いてその内容を読み出した後、正規表現を使用して対象の値を抽出します。

次に必要となるのは、描画メソッド (dwPlasmoid::paintInterface) を変更して、既存のメッセージの代わりにシステム・メモリーの使用量に関する情報を追加するという作業です (リスト 10 を参照)。

リスト 10. 描画メソッドの変更
   int percentageFreeMem = (m_freeMemory * 100) / m_totalMemory;
   int percentageFreeSwap = (m_freeSwapMemory * 100) / m_swapMemory;

   char message[256];

   sprintf(message,"Total Memory: %d\nFree Memory: %d\nPercent free mem: %d\n"
                   "Total Swap: %d\nFree Swap: %d\nPercent free swap: %d",
                   m_totalMemory, m_freeMemory, percentageFreeMem,
                   m_swapMemory, m_freeSwapMemory, percentageFreeSwap);

    p->setPen(Qt::white);
    p->drawText(contentsRect,
                Qt::AlignTop | Qt::AlignHCenter,
                message);
    p->restore();

最後に、各メモリー量の初期値を読み取るために、updateMemoryCount の呼び出しをコンストラクターに組み込みます (updateMemoryCount();)。

このコードをコンパイルして実行すると、Plasmoid が起動した時点での正確なメモリー使用量が表示されます (図 5 を参照)。

図 5. 静的メモリー・モニター
静的メモリー・モニター

確かに進歩はしましたが、システム・メモリーの使用量を静的に表示しても、それほど興味深い情報にはなりません。パズルを完成させる最後のピースは、そのライフサイクルをとおして Plasmoid を定期的に更新し、最新の読み取り値を表示するように変更することです。update メソッドはスロットとして宣言されているので、この変更を行うのは簡単です。リスト 11 のコードを init メソッドに追加すればよいだけのことです。

リスト 11. Plasmoid を定期的に更新させるためのコード
#include <QTimer>
...
  // kick off a refresh timer
  QTimer* m_timer = new QTimer(this);
  connect(m_timer, SIGNAL(timeout()), this, SLOT(updateMemoryCount()));
  m_timer->start(1000);

このコードでは、1 秒ごとに起動して updateMemoryCount スロットを呼び出すタイマーを開始します。

このコードをコンパイルして実行すると、Plasmoid が毎秒、自動的に更新されることがわかります。

図 6. デスクトップに組み込まれた動的に更新されるメモリー使用量の Plasmoid
デスクトップに組み込まれた動的に更新されるメモリー使用量の Plasmoid
デスクトップに組み込まれた動的に更新されるメモリー使用量の Plasmoid

表示される値は必ずしも同期していないことに注意してください。これらの Plasmoid のインスタンスはすべて同時に追加されてはいないため、タイマーを開始した時刻はインスタンスによって異なります。

まとめ

以上の手順からわかるように、ほんのわずかな時間で、適度に高機能のメモリー・モニターを作成してデスクトップに組み込むことができます。

Plasmoid 技術によって強力な汎用ユーティリティー/モニターを作成できることはもちろんですが、同じく重要な点は、Plasmoid はごく単純なため、自分にしか有益でない極めて特殊化したユーティリティーを作成してデスクトップ環境に完全に組み込むことも可能だということです。

この記事がきっかけとなって、読者の皆さんが独自の興味深い Plasmoid 作成に取り掛かる気になったことを願います。記事の終わりにあるコメント・セクションを使用して、皆さんの体験談と結果を私や他の読者に報告してください。


ダウンロード可能なリソース


関連トピック

  • PPA リポジトリーを有効にして KDE 4.2 とヘッダーを取得する方法についての詳細は、kubuntu.org を参照してください。
  • KDevelop 4 をソースからビルドするには、比較的簡単な KDevelop 4 のコンパイル手順に従ってください。
  • KDE TechBase の Plasma ウィキは、「KDE の柱」の 1 つ、Plasma デスクトップ・インターフェースについて学ぶには最適な出発点です。ここには、初めての Plasmoid の作成手順を極めて分かりやすく詳細に説明している「Getting started」チュートリアルも用意されています。
  • KDevelop Project は当初、KDE 用の使いやすい IDE を構築することを目的としていました。
  • 5 回連載の「IBM open collaboration client solution: An overview」(developerWorks、2008年10月) の第 1 回の記事で、IBM の最も優れた Linux 対応コラボレーション・ソフトウェア、OCCS とその関連サービスを計画および実装する方法を学んでください。
  • developerWorks の広範な KDE 関連記事のリストを調べてください。
  • developerWorks Linux ゾーンに豊富に揃った Linux 開発者向けの資料を調べてください。記事とチュートリアルの人気ランキングも要チェックです。
  • developerWorks に掲載されているすべての「Linux のヒント」シリーズの記事と Linux チュートリアルを参照してください。
  • Kubuntu は、KDE および受賞に輝いた Ubuntu をベースとした無料のユーザー・フレンドリーなオペレーティング・システムです。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=407068
ArticleTitle=KDE 4 Plasmoid 入門
publish-date=06142009