OpenSuse 15.5 64位GTK3.0环境下gtk_window_move()失效求助
解决OpenSuse 15.5下GTK3的gtk_window_move()失效问题
问题原因
使用GtkApplication时,activate信号触发阶段窗口尚未完成与窗口管理器的绑定,此时调用gtk_window_move()的请求易被忽略;另外GTK默认会保存并恢复窗口上次位置,会覆盖手动设置的坐标。
解决方案
方案1:在窗口map信号中执行移动操作
窗口的map信号会在窗口被绘制到屏幕时触发,此时窗口已完成初始化,移动请求能被窗口管理器正确处理。修改代码如下:
#include <gtk/gtk.h> static void on_window_mapped(GtkWidget *window, gpointer user_data) { gtk_window_move(GTK_WINDOW(window), 100, 100); } static void activate(GtkApplication *app, gpointer user_data) { GtkWidget *window = gtk_application_window_new(app); gtk_window_set_title(GTK_WINDOW(window), "GTK3"); gtk_window_set_default_size(GTK_WINDOW(window), 400, 100); // 绑定map信号,窗口显示后执行移动 g_signal_connect(window, "map", G_CALLBACK(on_window_mapped), NULL); gtk_widget_show_all(window); } int main(int argc, char **argv) { GtkApplication *app; int status; app = gtk_application_new("org.example.windowposition", G_APPLICATION_FLAGS_NONE); g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); status = g_application_run(G_APPLICATION(app), argc, argv); g_object_unref(app); return status; }
方案2:禁用GTK的窗口位置记忆
阻止GTK自动恢复窗口上次位置,确保手动设置的坐标生效,在创建窗口后添加以下代码:
// 取消GTK自动定位规则 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE); // 针对GNOME桌面,禁用位置记忆(KDE等桌面需对应调整) GSettings *settings = g_settings_new("org.gnome.desktop.wm.preferences"); g_settings_set_boolean(settings, "remember-window-position", FALSE); g_object_unref(settings);
方案3:调整窗口管理器设置
OpenSuse默认窗口管理器(如KWin)可能有强制窗口居中或自动排列的规则,需进入窗口管理器设置面板,关闭"自动排列窗口""强制窗口居中"等选项,允许应用自定义窗口位置。
编译命令保持不变:
gcc `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0` test.c -otest
内容的提问来源于stack exchange,提问作者Antonio Linares Cañas
相关产品推荐
相关产品推荐

