4

大規模な (100 以上のファイル) 8 年前の GTK+ アプリケーションを Red Hat 2.4 から Ubuntu Lucid に移植しています。これは産業用コントロール パネル用のフル スクリーン アプリケーションであり、オペレータは基盤となる OS にアクセスできません。

メイン アプリケーションの前に表示されるさまざまなポップアップ (タッチ キーボードなど) があります。ただし、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 に答える