【发布时间】:2019-04-01 21:28:38
【问题描述】:
我正在将一个大型(100 多个文件)具有 8 年历史的 GTK+ 应用程序从 Red Hat 2.4 移植到 Ubuntu Lucid。它是工业控制面板的全屏应用程序,操作员无法访问底层操作系统。
它有各种弹出窗口(例如触摸键盘),可以出现在主应用程序的前面。但是,当我在 Ubuntu Lucid 上编译和运行它时,弹出窗口仍然隐藏在主屏幕后面。
这个使用与应用程序相同的 GTK+ 调用的程序演示了这个问题:
#include <gtk/gtk.h>
#include <glib.h>
#include <glib/gprintf.h>
int main(int argc, char *argv[])
{
GtkWidget *mainwindow;
GtkWidget *popwindow;
GtkWidget *label;
gtk_init(&argc, &argv);
mainwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(mainwindow), GTK_WIN_POS_CENTER);
gtk_window_set_decorated(GTK_WINDOW(mainwindow), FALSE);
gtk_window_fullscreen(GTK_WINDOW(mainwindow));
gtk_widget_show_all(mainwindow);
popwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_keep_above(GTK_WINDOW(popwindow), TRUE);
gtk_window_set_modal(GTK_WINDOW(popwindow), TRUE);
gtk_window_set_decorated (GTK_WINDOW (popwindow), FALSE);
gtk_window_set_resizable (GTK_WINDOW(popwindow), FALSE);
gtk_window_set_position( GTK_WINDOW (popwindow), (GtkWindowPosition)GTK_WIN_POS_CENTER);
gtk_window_set_transient_for(GTK_WINDOW(popwindow),GTK_WINDOW(mainwindow));
label = gtk_label_new(g_strdup_printf ("My GTK version is %d.%d.%d", gtk_major_version, gtk_minor_version, gtk_micro_version));
gtk_container_add(GTK_CONTAINER(popwindow), label);
gtk_widget_show(label);
gtk_widget_show(popwindow);
gtk_main();
return 0;
}
弹出窗口保持隐藏状态,只有在您使用 Alt-Tab 键切换到其他窗口(而非主窗口)时才能看到它。 如果我删除对 gtk_window_set_transient_for() 的调用,则会出现弹出窗口,但桌面面板也会出现,从而可以访问底层操作系统。
有什么方法可以得到想要的行为? Ubuntu Lucid 使用 GTK+ 2.20.1
感谢您的帮助
理查德
【问题讨论】:
-
您是否尝试过使用 GTK_WINDOW_POPUP 创建弹出窗口?
-
我被developer.gnome.org/gtk/stable/… 的文档推迟了使用 GTK_WINDOW_POPUP,但我刚刚尝试过,它似乎对我来说很好 - 谢谢!
-
通过将窗口保持在顶部来拒绝访问是一种非常薄弱的安全措施。相反,您根本不应该启动桌面,而是让您的应用程序成为唯一运行的 X 应用程序。对于全屏界面,我也不会使用弹出窗口,而是使用堆栈和覆盖小部件在单个窗口中完成所有操作。
标签: gtk