这个测试程序编译和链接没有问题,但只有在sudo ./test中以超级用户身份运行时才会使窗口处于中心位置我试图做一个小的例子来说明(并希望解决)我的问题。我使用的是Ubuntu 22.04和GTK 3.34
// test.c
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Center");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_show(window);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return 0;
}
makefile
# compiler
CC := gcc
# warnings
WARN := -Wall -Wno-deprecated-declarations
CCFLAGS=$(WARN)
GTKLIB=`pkg-config --cflags --libs gtk+-3.0`
# linker
LD=gcc
LDFLAGS= $(GTKLIB)
test: test.o
$(LD) -o test test.o $(LDFLAGS)
test.o: test.c
$(CC) -c $(CCFLAGS) test.c $(GTKLIB) -o test.o
clean:
rm -f *.o test
如果您在Wayland会话中运行示例,那么这是完全预期的:gtk_window_set_position()
函数是在工具包端实现的,并且要求窗口系统提供对全局屏幕坐标的访问-这是Wayland没有的。
如果在sudo
"works"那么这可能是GTK选择X11后端的情况,因为Wayland在sudo
下无法真正工作。作为规则,你应该永远不要在sudo
下运行GTK应用程序,因为代码没有经过审计,也不可审计,并且您可能会打开一个与整个会话大小相当的安全漏洞。
在实践中,应用程序应该而不是在桌面上定位窗口;这是窗口管理器的工作。