GNOME notification area

clipoli の Linux 版を作ろうと思う。
GNOME でランチャなんて馬鹿馬鹿しいけどクリップボード機能は欲しいので。

Windows で言うタスクトレイは Linux では通知スペースと言うらしい。
ココにアイコンを表示させてランチャ形式にすればいいかな。

1月 ? 2011 ? ゴミ箱の中のメモ帳

方法は日本語でアッサリ見つかった。
GtkStatusIcon というのを作ってメニューを突っ込めばいいのね。

ini 読み込みコードは後で作るとして。
yield でタプルを戻すだけでいいから C# より簡単だ。

次にクリップボードとランチャの振り分け。
まあ実験段階なのでこんな感じで実験してみよう。

#! /usr/bin/python
# -*- encoding: utf-8 -*-

import pygtk
pygtk.require("2.0")
import gtk
import os

class TrayItem(gtk.Menu):
    def __init__( self, trayIcon):
        gtk.Menu.__init__( self)
        self.tray = trayIcon
        labels = [
            ("Launcher", "Totem", "totem"),
            ("Launcher", "Firefox", "firefox"),
            ("Launcher", "sasakima site", "xdg-open http://palepoli.skr.jp/"),
            ("Clipboard", "Clip", "てきすと") ]
        for l in labels:
            m = gtk.MenuItem(l[1])
            m.set_name(l[2])
            if l[0] == "Launcher":
                m.connect("activate", self.on_launcher)
            elif l[0] == "Clipboard":
                m.connect("activate", self.on_clipboard)
            self.append(m)
        self.append(gtk.SeparatorMenuItem())
        q = gtk.MenuItem("終了")
        q.connect("activate", self.on_quit)
        self.append(q)
        self.show_all()

    def on_launcher(self, widget):
        l = widget.get_name()
        os.system("%s &" % l)

    def on_clipboard(self, widget):
        c = gtk.Clipboard()
        c.set_text(widget.get_name())

    def on_quit(self, widget):
        gtk.main_quit()

    def show_menu(self, widget, button, time):
        self.popup( None, None, gtk.status_icon_position_menu, 0, time, self.tray)

    def show_menu_act(self, widget):
        self.popup( None, None, gtk.status_icon_position_menu, 0, 0, self.tray)

tray = gtk.StatusIcon()
trayMenu = TrayItem( tray)
tray.set_from_stock( gtk.STOCK_DIALOG_INFO)
tray.connect( "popup-menu", trayMenu.show_menu)
tray.connect( "activate", trayMenu.show_menu_act)
gtk.main()

GtkWidget も Name に文字列を突っ込むという無茶が可能なのね。
こんなことをしようと考えてしまうのは私くらいだろうけど。

.NET の Process.Start() みたく URL なら全自動ってならないや。
xdg-open に渡すしかないか、ちょっといまいちかも。
それとランチャはバックグラウンドで動かす用の & 指定も忘れずに。

gtk.status_icon_position_menu を指定すればこうなるのか。
None だと普通にカーソルがあった位置に出るんだよね。

えらく簡単にココまで作れてしまったなぁ。
やっぱり Linux のほうが何をするにも便利だよ。