如何在GTK +中保持瞬态窗口的顶部

时间:2012-04-26 10:13:15

标签: gtk

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

感谢您的帮助

理查德

6 个答案:

答案 0 :(得分:3)

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

gtk_window_present (GTK_WINDOW (popwindow));

答案 1 :(得分:2)

答案 2 :(得分:1)

到目前为止,这实际上取决于窗口管理器:您的代码在我的系统上运行(xfwm)。

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

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

这有一个额外的好处,即在关闭我的应用程序后避免桌面行李并关闭系统。

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

答案 3 :(得分: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()

答案 4 :(得分:1)

Try

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);