ubuntu 除非使用sudo启动程序,否则GTK窗口居中无法工作

woobm2wo  于 2022-11-22  发布在  其他
关注(0)|答案(1)|浏览(241)

这个测试程序编译和链接没有问题,但只有当我以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
g6ll5ycj

g6ll5ycj1#

如果您在Wayland会话中运行该示例,则完全可以预料到:gtk_window_set_position()函数是在工具箱端实现的,它要求窗口系统提供对全局屏幕坐标的访问-Wayland没有这种功能。
如果在sudo下运行“工作”,那么这可能是GTK选择X11后端的情况,因为Wayland在sudo下不能真正工作。作为一个规则,你永远不应该在sudo下运行GTK应用程序,因为代码没有被审计,也不是可审计的,你可能会打开一个整个会话大小的安全漏洞。
实际上,应用程序不应该将窗口放在桌面上;这是窗口管理器的工作。

相关问题