【发布时间】:2020-08-27 11:34:52
【问题描述】:
我正在尝试实现一个跨平台 GTKMM 应用程序,其中 Gtk::Box 布局根据窗口状态事件发生变化,即将 Gtk::Box 布局更改为:
- 水平布局 - 最大化和浮动窗口状态
- 或垂直布局 - 用于平铺状态
我的主要操作系统是 Debian GNOME 桌面,但我也在通过 VM 在 Windows 上测试代码。到目前为止,我的程序在 GNOME 桌面上运行良好,但在 Windows 上没有看到相同的预期行为。为演示提供的屏幕截图:
Debian GNOME
-
浮动窗口(预期输出)
-
平铺窗口(预期输出)
窗口
-
浮动窗口
与 Linux 相同的预期输出
-
平铺(非预期输出)
下面是示例代码:
#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 上平铺行为的相同预期输出。
【问题讨论】: