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