Мои интернеты на сабж выдают два решения:
1) Использовать GtkFixed или аналогичный самописный контейнер.
2) Помещать виджет в отдельное окно и мудохаться с его позиционированием.
Честно говоря, оба варианта никакого восторга не вызывают. Но сегодня пришло озарение.
parent_window # GdkWindow родителя, куда будет помещен плавающий виджет
widget # Собственно виджет
window = gtk.Window(gtk.WINDOW_POPUP)
window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP)
window.add(widget)
widget.show_all()
window.realize()
# Внимание, сейчас вылетит птичка!
window.window.reparent(parent_window, pos_x, pos_y)
window.show()
В итоге получаем как бы плавающий виджет с такими плюшками:
* Не надо вмешиваться в структуру лейаутов.
* Мы можем использовать GTK_WINDOW_POPUP, который адекватно воспринимается всеми(?) wm и при этом не следить за перекрытиями родительского окна или его потерями/приобретениями фокуса.
* Такой плавающий виджет привязан к окну, то есть перемещения родителя никак не повлияют на позицию. Надо следить только за ресайзом.
Метод проверен на open/flux-боксах и в awesome — работает там просто прекрасно. Посему вопрос: кто нибудь трогал репарентинг гдкашных окон, будут ли сюрпризы в офтопике (ну это я скоро сам проверю) или макоси? Или всё хорошо и эта часть полностью абстрагирована от бэкенда?