GNOME桌面以外的其他平台是否不支持平铺窗口状态?

问题描述

我正在尝试实现一个跨平台的GTKMM应用程序,其中Gtk::Box布局会根据窗口状态事件而变化,即将Gtk::Box布局更改为以下任一情况:

  • 水平布局-用于最大化和浮动窗口状态
  • 垂直布局-用于平铺状态

我的主要操作系统是Debian GNOME桌面,但我也在通过VM在Windows上测试代码。到目前为止,我的程序在GNOME桌面上运行良好,但在Windows上没有看到相同的预期行为。提供用于演示的屏幕截图:

Debian GNOME

  1. 浮动窗口(预期输出)

Floating window

  1. 平铺窗口(预期输出)

tiled window

Windows

  1. 浮动窗口

与Linux预期输出相同

  1. 平铺(非预期输出)

tiled on windows

下面是示例代码:

#include <gtkmm.h>

using Gtk::Application;
using Gtk::Window;
using Gtk::Box;
using Gtk::Button;
using Gtk::Label;

class WindowStateEvent : public Window
{
    Box    box;
    Button button;
    Label  label;

public:
    WindowStateEvent();

    bool on_window_state_changed(GdkEventWindowState *,Box &);
};

WindowStateEvent::WindowStateEvent()
    : button("Clickable button"),label("Hello World!")
{
    set_default_size(320,240);

    bool expand(true),fill(true);
    box.pack_start(label,expand,fill);
    box.pack_end(button,fill);

    add(box);

    show_all();

    /* GTK doc says something about enabling Gdk::STRUCTURE_MASK to use the below signal
     * Doesn't work or I didn't really get what it's talking about
     */
    //box.add_events(Gdk::STRUCTURE_MASK);
    //add_events(Gdk::STRUCTURE_MASK);
    signal_window_state_event().connect(
                sigc::bind<Box &>(
                    sigc::mem_fun(*this,&WindowStateEvent::on_window_state_changed),box)
                );
}


bool
WindowStateEvent::on_window_state_changed(GdkEventWindowState *event,Box &box)
{
    bool is_window_tiled = event->new_window_state &
            (Gdk::WINDOW_STATE_RIGHT_TILED | Gdk::WINDOW_STATE_LEFT_TILED);
    bool is_window_maximized = event->new_window_state &
            Gdk::WINDOW_STATE_MAXIMIZED;

    if (is_window_tiled and !is_window_maximized)
        box.set_orientation(Gtk::ORIENTATION_VERTICAL);
    else
        box.set_orientation(Gtk::ORIENTATION_HORIZONTAL);

    return true;
}

int main()
{
    auto app = Application::create("io.test.window-state-event");

    WindowStateEvent test;

    return app->run(test);
}

您可以使用以下代码编译以上示例代码:

g++ -o window-state-event-test main.cpp `pkg-config gtkmm-3.0 --cflags --libs`

signal_window_state_event是否不是跨平台的?还是我使用错了?

您还可以注意到,我故意将add_events()代码注释掉了,因为即使没有它们,该程序仍可以在我的主系统上正常运行。取消注释两个注释(this对象或box对象)之一并进行构建,我仍然看不到Windows上平铺行为的预期输出。

解决方法

报告gtk development site上的错误问题之后,似乎仅GNOME桌面支持该功能。 Windows支持即将推出。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...