GTK检测窗口从用户调整大小

时间:2009-06-29 19:27:14

标签: gtk signals resize

在GTK(或pygtk或gtkmm ......)

如何通过拖动窗口的边缘来检测应用程序窗口是否已被手动调整大小?

我需要找到一种方法来区分手动调整大小和源自gtk的调整大小,例如窗口内容的更改。

5 个答案:

答案 0 :(得分:8)

您是否尝试过连接到GDK_CONFIGURE事件?

查看下面的this example “移动窗口”部分。该示例显示了在移动窗口时执行某些操作的回调,但configure事件是移动,调整大小和堆栈顺序事件的全部内容。

答案 1 :(得分:7)

我设法通过观察size_allocate上的size_requestGtkWindow信号来解决此问题。如果size_request变得越来越小,我打电话给resize(1,1)。如果size_allocate比预期的要大,我会关闭系统。

我确定要处理的一件事是size_request返回大,然后小,并且size_allocate大而小。我不知道这是否可行,但我通过确保在size_allocate得到较小size_allocate时确保仅降低size_request的预期值来修复它,而不是当我得到较小的size_request时}。

确保您的{{1}}处理程序位于基类'处理程序之后,以便获得正确的值。我通过重写方法然后首先调用基类方法来做到这一点。

我已经在1维和2维中尝试过这种方法,但它似乎都有效。

答案 2 :(得分:3)

在PyGTK中,我总是看到expose_event窗口调整大小,然后使用get_allocation方法获取新大小。

答案 3 :(得分:3)

在我的情况下,我试图区分用户调整Gtk.Paned的大小与用户调整整个窗口的大小。两者都发出了notify::position信号。

我的解决方案是,因为我无法知道用户是否正在从窗口小部件调整窗口大小,反转我想知道的内容。记录用户是否已重新定位窗口小部件,如果用户未在我的窗口小部件上启动它们,则忽略更新。

也就是说,我没有测试“如果窗口正在调整大小”,而是在本地录制了button-press-eventbutton-release-event,所以我可以测试“如果窗口小部件被重新定位”

from gi.repository import Gtk

class MyPaned(Gtk.Paned):
    _user_activated = False

    def on_position(self, _, gparamspec):
        if self._user_activated:
            # widget touched

        else:
            # window resized (probably)

    def on_button_press(self, *_):
        self._user_activated = True

    def on_button_release(self, *_):
        self._user_activated = False


    dev __init__(self, *args):
        super(MyPaned, self).__init__(*args)
        self.connect('notify::position', self.on_position)
        self.connect('button-press-event', self.on_button_press)
        self.connect('button-release-event', self.on_button_release)

有效地通过在用户开始和结束直接与我的小部件交互时记录,我可以假设剩下的时间是由于窗口被调整大小。 (直到我找到更多案例)

答案 4 :(得分:0)

您可以使用gdk_window_get_root_origin来获取窗口的左上角和gdk_window_get_geometry来获取宽度和高度。然后你可以将回调挂钩到GDK_BUTTON_PRESS_MASK并检查按钮按下是否发生在窗口的一个边缘附近/上。

当然,这似乎非常hackish,我真的很困扰我在GdkWindow的文档中找不到一些简单的方法来做到这一点。有一个gdk_window_begin_resize_drag函数真的让我觉得有一种更清晰的方法可以做到这一点,但我没有看到比我的答案更明显的事情。