【问题标题】:Is tiled window state not supported on other platforms other than GNOME desktop?GNOME 桌面以外的其他平台是否不支持平铺窗口状态?
【发布时间】:2020-08-27 11:34:52
【问题描述】:

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

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

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

Debian GNOME

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

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

窗口

  1. 浮动窗口

与 Linux 相同的预期输出

  1. 平铺(非预期输出)

下面是示例代码:

#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, expand, 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() 代码,因为即使没有它们,程序仍然可以在我的主系统上正常运行。取消注释两个 cmets 之一(this 对象或 box 对象)并构建它,我仍然没有看到 Windows 上平铺行为的相同预期输出。

【问题讨论】:

    标签: c++ gtkmm3


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 2021-01-21
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多