第204回でも紹介したように、
そこで今回は、
UnityとDashとLensのおさらい
今一度、
UnityとLens
UnityはUbuntu 11.
その中でも重要な位置を占めるのが、
LensはDash内部に検索条件や結果を表示するためのインターフェースとなります。何かを検索するときに特定の条件を付加したいことがあります。例えばファイルだったら
Ubuntu 11.
ScopeとD-Bus
ユーザーが意識することはあまりありませんが、
YouTube LensならYouTubeのAPIを使って、
Unity、
Lensのファイル構造
Lensのファイル構成は非常にシンプルです。したがってちょっとしたプログラミング経験がある人なら誰でも簡単にLensを作ることができます。
幸い、
Lensの作成方法や概念については一通りUbuntu Wikiでも詳細に説明されているので、
ちなみに今回はPythonで記述しますが、
サンプルコードの構造
実際にサンプルコードをブランチしてみましょう。
$ bzr branch lp:~unity-team/unity-lens-sample/python-4.0
Ubuntu 11.
以下の3つのファイルが重要になります。
- python.
lens - UnityにLensとD-Bus通信を行うための各種情報を伝えるためのファイルです。ファイル名は個々のLensで一意なIDである必要があります。
- phtyon-lens.
svg - Dashの下部に表示するためのアイコンです。.lensファイルのIconでこのファイル名を指定します。
- unity-lens-python.
py - Lensの本体
(Lensデーモン) です。検索結果のレイアウトや、 フィルターはすべてここに記述します。このサンプルの場合、 Scopeも内部に内包しています。
サンプルのインストールと実行
上記ファイルをREADMEに書かれている手順で適切な場所に保存することで、
$ sudo mkdir /usr/share/unity/lenses/python $ sudo cp python-lens.svg /usr/share/unity/lenses/python/ $ sudo cp python.lens /usr/share/unity/lenses/python/
すべてのLensファイルは、
今回の場合、
次にLensを起動します。
$ ./unity-lens-python.py
Dashから適切なLensを開いたら、
最後に、
$ setsid unity
Unityの再起動は.lensが更新されたときのみ必要です。Lensデーモン側
これにより、
このサンプルはユーザーが入力した文字を大文字、

新たにLensを作る
今度はサンプルをベースに新規にLensを作ってみましょう。
冒頭でも述べたように、
なお、
$ bzr branch lp:~cosmos-door/+junk/nicolens
LensIDを決める
まず最初に以下の3つを決める必要があります。
- LensID
- 前述のとおり、
.lensファイルのファイル名に使用します。すべてのLensにおいて一意である必要があります。 - DBusName
- D-Busデーモンがそのプロセスを特定するために使う名前です。値は任意ではありますが、
システム全体に渡って一意である必要があります。"net. launchpad. Lens. LensID"にしておけば、 かぶることはないでしょう。 - DBusPath
- Unityなど別プロセスのアプリケーションが、
D-Bus経由でLensオブジェクトにアクセスするために必要なパス名です。これもDBusName同様、 システム全体で一意なら任意な値でかまいません。
上記が決まったら、
[Lens]
DBusName=net.launchpad.Lens.NicoLens
DBusPath=/net/launchpad/lens/nicolens
Name=NicoNico Video Lens
Icon=/usr/share/unity/lenses/nicolens/nicolens.svg
Description=NicoNico Video search lens
SearchHint=Search NicoNico video
Shortcut=n
[Desktop Entry]
X-Ubuntu-Gettext-Domain=unity-lens-nicolens
ショートカットもなんとなく"Super+n"に変更し、
Lens本体を修正する
.lensファイルの内容にあわせて、
unity-lens-nicolens.
変更した箇所だけ抜粋すると以下のようになります。
BUS_NAME = "net.launchpad.Lens.NicoLens"
self._lens = Unity.Lens.new ("/net/launchpad/lens/nicolens", "nicolens")
self._scope = Unity.Scope.new ("/net/launchpad/lens/nicolens/scope")
最後はScopeのDBusPathです。今回はScopeを外部プロセス化しないのであまり関係ありません。
この時点で、
これ以降はLensデーモンの修正だけなので、
カテゴリーを設定する
サンプルを実行すると、
cats.append (Unity.Category.new ("lowercase Letters",
Gio.ThemedIcon.new("keyboard"),
Unity.CategoryRenderer.VERTICAL_TILE))
引数の一つ目がカテゴリータイトル、
VERTICAL_
cats.append (Unity.Category.new ("ニコニコ動画",
Gio.ThemedIcon.new("browser"),
Unity.CategoryRenderer.HORIZONTAL_TILE))
検索ルーチンを実装する
Dashの検索ボックスに入力されたら、
def _on_search_changed (self, scope, param_spec):
tag = self.get_search_string()
results = scope.props.results_model
if len(tag) > 0:
print "Search changed to: '%s'" % tag
search = self.search_tag(tag)
self._update_results_model (search, results)
self.search_finished()
search_
- http://
www. nicovideo. jp/ tag/検索語?rss=2. 0
また、
検索結果をレイアウトする
検索結果をレイアウトするのは、
def _update_results_model (self, search, model):
model.clear ()
for item in search:
model.append (item["link"], # uri
item["thumbnail"], # string formatted GIcon
0, # numeric category id
"text/html", # mimetype
item["title"], # display name
item["description"], # comment
item["link"]) # DnD uri
一つ目の引数は選択時に起動するアプリケーションやファイルを指定します。今回は動画のURLです。二つ目はアイコンとして、
試してみる
ここまで設定が完了すれば、
$ ./unity-lens-nicolens.py
こちらで用意したnicolens.

もし動かないようなら以下を確認してみてください。
- Dashの下段にあるアイコン列に作成したLensが存在しない
- D-Busのパスや名前が間違っているか、
.lensファイルのインストール先がLensIDに一致していないと思われます。 - Lensに検索単語を入力しても検索結果が現れない
- デーモンが動いていないか、
検索中に何らかの理由でエラーになった可能性があります。
Lensデーモンを自動起動する
これまではLensデーモンを手動で起動していました。しかし、
まずはunity-lens-nicolens.
[D-BUS Service] Name=net.launchpad.Lens.NicoLens Exec=/usr/local/lib/unity-lens-nicolens/unity-lens-nicolens.py
ここでNameは.lensファイルのDBusNameと一致させるようにしてください。LensデーモンはExecにあるような場所に保存することにしました。
このファイルを、
$ sudo cp unity-lens-nicolens.service /usr/share/dbus-1/services/unity-lens-nicolens.service
これで次回起動時から、
まとめ
このように、
今回は触れませんでしたが、
これを機に、
ちなみに、
しかしながら、