Y901x はステータスバーを GtkVBox で自作しているわけなんだが…
今まで GtkWidget 上のマウスカーソルを変更するのに expose-event シグナルを利用していた。
Widget 表示後に変更しないと例外でスローされてしまうからである。
でもそれって realize シグナルでイケたのね…
class CStatusBar(gtk.VBox):
"""
Instead GtkStatusbar
"""
def __init__(self, num, window, arg=None):
#
# etc...
#
##self._first_show = False
##grip.connect("expose-event", self.__on_expose)
grip.connect("realize", self.__on_realize)
#
# etc...
#
def __on_realize(self, widget, event=None):
"""
cursor change
"""
cur_grip = gtk.gdk.Cursor(gtk.gdk.BOTTOM_RIGHT_CORNER)
widget.window.set_cursor(cur_grip)
"""def __on_expose(self, widget, event):
if not self._first_show:
cur_grip = gtk.gdk.Cursor(gtk.gdk.BOTTOM_RIGHT_CORNER)
self._im.window.set_cursor(cur_grip)
self._first_show = True"""
余計な自前フラグも不要だし圧倒的に簡単じゃないですか。
realize はマウスカーソルを変更したい Widget 自体のシグナルを利用しませう。
もう一つ実は気にしていてほったらかしていた部分。
Resize Grip を画像で表示していたこと、結構違和感がある。
せめてデフォルトの Grip Image を表示できないものか。
gtk.Style
色々探して GtkStyle に paint_resize_grip というメソッドを発見。
コレだとよく解らないので Devhelp から gtk_paint_resize_grip を検索。
しかし思うんだが C 言語が解らないで PyGtk アプリを作るなんて不可能だ。
最低 Devhelp が理解できないと誰かが書いたコードのコピペしかやれない。
まあそれはよくて、ということは下記でイケそうだ。
class CStatusBar(gtk.VBox):
"""
Instead GtkStatusbar
"""
def __init__(self, num, window, arg=None):
#
# etc...
#
"""self._im = gtk.Image()
path = os.path.dirname( __file__ ) + "/img/grip.xpm"
self._im.set_from_file(path)
grip = gtk.EventBox()
grip.add(self._im)"""
grip = gtk.DrawingArea()
grip.set_size_request(16, 16)
grip.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.BUTTON_PRESS_MASK)
grip.connect("expose-event", self.__on_grip_expose)
#
# etc...
#
def __on_grip_expose(self, widget, event):
"""
Draw Resize Grip
"""
widget.style.paint_resize_grip( widget.window,
gtk.STATE_NORMAL,
None,
None,
None,
gtk.gdk.WINDOW_EDGE_SOUTH_EAST,
event.area.width - 16,
event.area.height - 16,
16,
16)
GtkDrawingArea では GtkEventBox とは違い set_events する必要がある。
grip のサイズを 16×16 に限定しているけどコレでいい?
というかこれだけだと Dust とかのテーマでは Grip Image が追従しない。
と思ったけど Firefox も同じじゃん、それならコレでいいやという感じ。
素直に GtkStatusbar を使えば Gtk+ が勝手にやってくれる。
けど Gedit のように境界線が途切れてしまうし、Gtk+ も困ったものだ。
最後に何だかよく解らなかったので *.pyc のキャッシュは毎回同梱していた。
けど無駄にも程があるので今回から省いて配布するようにした。
ということで Y901x 0.1.8 の公開です。
単なるお知らせだけじゃツマランのでコードも貼ってみました。