这个测试程序编译和链接没有问题,但只有当我以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;
}
生成文件
# 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
1条答案
按热度按时间g6ll5ycj1#
如果您在Wayland会话中运行该示例,则完全可以预料到:
gtk_window_set_position()
函数是在工具箱端实现的,它要求窗口系统提供对全局屏幕坐标的访问-Wayland没有这种功能。如果在
sudo
下运行“工作”,那么这可能是GTK选择X11后端的情况,因为Wayland在sudo
下不能真正工作。作为一个规则,你永远不应该在sudo
下运行GTK应用程序,因为代码没有被审计,也不是可审计的,你可能会打开一个整个会话大小的安全漏洞。实际上,应用程序不应该将窗口放在桌面上;这是窗口管理器的工作。