仅处理平铺事件而不处理最大化事件

Process only tiled event and not maximize event

我正在使用 GTKMM 构建一个非常基本的计算器程序

Basic Calculator screenshot

布局采用横向模式(按钮和显示标签处于水平方向)

当用户 snaps/tiles window 向右或向左时,我想将这两个设置为纵向模式(即 垂直

下面是我使用的示例代码:

bool
BasicCalculator::on_calculator_window_state_changed(
        GdkEventWindowState     *window_state_event,
            Gtk::Box            *box)
{
        if (
                window_state_event->new_window_state &
                (Gdk::WINDOW_STATE_RIGHT_TILED | Gdk::WINDOW_STATE_LEFT_TILED)
        )
                box->set_orientation(Gtk::ORIENTATION_VERTICAL);
        else
                box->set_orientation(Gtk::ORIENTATION_HORIZONTAL);
        return true;
}

代码有效,但我的 window 在最大化时垂直定向,这不是我的本意。我希望它处于水平方向

如何只处理平铺事件而不处理最大化事件?



PS:My project repo 如果您想构建和测试

在对 GdkEventWindowState 枚举进行了一些修改之后,我认为我可以将平铺状态与 window 最大化状态一起进行比较

即,确保仅当 window 平铺且未最大化时才将方向切换为垂直

因为代码

...
        if (
                window_state_event->new_window_state &
                (Gdk::WINDOW_STATE_RIGHT_TILED | Gdk::WINDOW_STATE_LEFT_TILED)
        )
                ...

returns TRUE 不仅适用于平铺状态,也适用于最大化状态

下面是有效的改进代码:

bool
BasicCalculator::on_calculator_window_state_changed(
        GdkEventWindowState     *window_state_event,
            Gtk::Box            *box)
{
        bool is_window_tiled = window_state_event->new_window_state &
                        (Gdk::WINDOW_STATE_RIGHT_TILED | Gdk::WINDOW_STATE_LEFT_TILED);
        bool is_window_maximized = window_state_event->new_window_state &
                        Gdk::WINDOW_STATE_MAXIMIZED;

        if (is_window_tiled && !is_window_maximized)
                box->set_orientation(Gtk::ORIENTATION_VERTICAL);
        else
                box->set_orientation(Gtk::ORIENTATION_HORIZONTAL);

        return true;
}

现在 window 即使最大化也保持其默认水平方向:)