4

我正在将一个大型(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

谢谢你的帮助

理查德

4

6 回答 6

3

使用gtk_window_present()按堆叠顺序实际提升弹出窗口:

gtk_window_present (GTK_WINDOW (popwindow));
于 2012-04-26T11:11:20.187 回答
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

于 2012-04-27T10:57:11.897 回答
1

使用set_keep_above()

示例(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()
于 2014-09-03T11:34:46.157 回答
1

如前所述,这实际上取决于窗口管理器:您的代码可以在我的系统(xfwm)上运行。

我建议禁用它,而不是隐藏东西。尽管面板可以被窗口覆盖,但快捷方式(以及该面板所需的任何内容)仍将启用。这是在默认用户主目录中编写自定义.xinitrc的问题,例如:

#! /bin/sh
openbox &
myapplication
shutdown -h

这具有避免桌面包袱并在关闭 myapplication 后关闭系统的额外好处。

附加说明:GTK+2 本身模仿了一个(非常原始的)窗口管理器,因此您可以尝试直接启动myapplication

于 2012-04-29T13:35:14.220 回答
1

尝试

gtk_window_set_type_hint(GTK_WINDOW(popwindow), GDK_WINDOW_TYPE_HINT_DIALOG)

应该将弹出窗口保持在主窗口之上!

于 2018-01-31T10:35:49.127 回答
0

简单地用

gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);
于 2019-04-01T13:28:38.373 回答