【问题标题】:How to keep transient window on top in GTK+如何在 GTK+ 中保持瞬态窗口位于顶部
【发布时间】: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


【解决方案1】:

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

gtk_window_present (GTK_WINDOW (popwindow));

【讨论】:

  • 感谢您的建议,但我已经尝试过了。不行,我的弹窗还在主窗口后面
【解决方案2】:
【解决方案3】:

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

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

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

这还有一个额外的好处,那就是避免桌面包袱,并在关闭我的应用程序后关闭系统。

补充说明:GTK+2 本身模仿了一个(非常原始)窗口管理器,所以你可以尝试直接启动myapplication

【讨论】:

    【解决方案4】:

    使用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()
    

    【讨论】:

      【解决方案5】:

      Try

      gtk_window_set_type_hint(GTK_WINDOW(popwindow), GDK_WINDOW_TYPE_HINT_DIALOG)
      

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

      【讨论】:

        【解决方案6】:

        只需

        gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-09-16
          • 1970-01-01
          • 1970-01-01
          • 2012-12-07
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 2011-03-15
          相关资源
          最近更新 更多