我正在将一个大型(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
感谢您的帮助
理查德
答案 0 :(得分:3)
使用gtk_window_present()实际提升堆叠顺序中的弹出窗口:
gtk_window_present (GTK_WINDOW (popwindow));
答案 1 :(得分:2)
看起来这是故意的:全屏窗口始终位于顶部,但这取决于您的窗口管理器。
https://answers.launchpad.net/awn/+question/126562
http://mail.gnome.org/archives/gtk-perl-list/2007-April/msg00071.html
http://mail.gnome.org/archives/gtk-list/2003-November/msg00059.html
答案 2 :(得分:1)
到目前为止,这实际上取决于窗口管理器:您的代码在我的系统上运行(xfwm)。
我建议禁用它,而不是隐藏内容。尽管可以通过窗口覆盖面板,但仍将启用快捷方式(以及该面板所需的任何内容)。这是在默认用户主目录中编写自定义.xinitrc的问题,例如:
#! /bin/sh
openbox &
myapplication
shutdown -h
这有一个额外的好处,即在关闭我的应用程序后避免桌面行李并关闭系统。
附加说明:GTK + 2本身模仿(非常原始的)窗口管理器,因此您可以尝试直接启动 myapplication 。
答案 3 :(得分:1)
示例(Python):
# Create dialog
d = gtk.Dialog("RT600", buttons=("OK",True,"Cancel",False))
# Centering dialog
d.set_position(gtk.WIN_POS_CENTER)
# Keep dialog above main window !
d.set_keep_above(True)
# run the dialog
result = d.run()
答案 4 :(得分:1)
gtk_window_set_type_hint(GTK_WINDOW(popwindow), GDK_WINDOW_TYPE_HINT_DIALOG)
This应该将popwindow保持在主窗口之上!
答案 5 :(得分:0)
简单地
gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);