No frame GtkWindow

Gtk.Window は Gtk.WindowType.POPUP 指定で作成すると枠無しになる。
でもタスクバーには現れないしフォーカスも持てない。

結局アクセサリとしてしか使い道が無いのかなと思っていた。
そういえば google-chrome はどうやって枠を無くしているんだろう?
気になったので調べてみた。

GtkWindow のプロパティをよく見ると decorated がある。
False にすると枠無しにできるっぽい、ならば実験。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk, Gdk

class Win(Gtk.Window):
    def __init__(self):
        """
            Switch the frame
        """
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        # Mouse Click
        self.set_events(Gdk.EventMask.BUTTON_PRESS_MASK)
        self.connect("button-press-event", self.on_button_press_event)
        self.show_all()

    def on_button_press_event(self, widget, event, data=None):
        """
            Double-click on each switch.
            Have the focus.
            Moving without the frame.
        """
        if event.type == Gdk.EventType.BUTTON_PRESS:
            self.begin_move_drag( event.button, event.x_root, event.y_root, event.time)
        elif event.type == Gdk.EventType.DOUBLE_BUTTON_PRESS:
            self.props.decorated = self.props.decorated == False

Win()
Gtk.main()

ダブルクリックで切り替わる。
ついでにクライアントエリアをマウスで掴んで移動できるようにしてみた。
よししっかり切り替わるしフォーカスも持てるし移動もできる。

これで google-chrome みたいなウインドウが作れるね。

ついでに気がついた、 GTK+ 3.6 からみたいだけど
GDK_DOUBLE_BUTTON_PRESS, GDK_TRIPLE_BUTTON_PRESS
というエイリアスが追加されていたのを知った。

Python のアトリビュートは数値で始めることができないからって
Gdk.EventType._2BUTTON_PRESS って何か変だったし。

ということで覚書ページも更新っと。
ウインドウを作る – L’Isola di Niente