You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:39:52