1

GtkEntry( sscce code here )の下にウィンドウを開くプログラムがあります。プログラムが実行されると、これがそのウィンドウです。

クリックする前のプログラムのウィンドウ

「開く」ボタンをクリックすると、装飾されていないウィンドウがエントリの真下に開き、左側がエントリの左側に揃えられます。

サブウィンドウが開きました

これは、コールバック パラメータとしてエントリを受け取る、ボタンの次のコールバック メソッドの結果です。

bool on_button_clicked(GtkWidget *button, gpointer data) {
    GtkWidget *entry = data,
            *subwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL),
            *sublabel = gtk_label_new("This is a rather long message\n"
                    "with many lines whose mere purpose is\n"
                    "to test some stuff. It will appear in \n"
                    "the RIGHT PLACE.");
    gtk_container_add(GTK_CONTAINER(subwindow), sublabel);
    gtk_window_set_decorated(GTK_WINDOW(subwindow), FALSE);
    gtk_window_set_modal(GTK_WINDOW(subwindow), TRUE);


    GtkWidget *window = gtk_widget_get_toplevel(entry);
    gtk_window_set_transient_for(
            GTK_WINDOW(subwindow), GTK_WINDOW(window));

    gint dx, dy;
    gtk_window_get_position(GTK_WINDOW(window), &dx, &dy);

    GtkAllocation allocation;
    gtk_widget_get_allocation(entry, &allocation);

    gtk_window_move(
            GTK_WINDOW(subwindow), 
            allocation.x+dx, allocation.y+allocation.height*2+dy);

    gtk_widget_show_all(subwindow);
    return false;
}

特にセルが2番目の列にある場合、テーブルビューからセルを編集し始めるときに同様のことをしたいと思います。装飾されていないウィンドウが編集セルのすぐ下に表示され、左側に揃えられます。そこで、コールバックのパラメーターがウィジェットである"editing-started"と仮定して、イベントへのコールバックを作成しました。editable

static bool on_cell_renderer_text_editing_started(
        GtkCellRenderer *renderer, GtkCellEditable *editable, 
        gchar *path, gpointer data) {
    GtkWidget *subwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL),
            *sublabel = gtk_label_new("This is a rather long message\n"
                    "with many lines whose mere purpose is\n"
                    "to test some stuff. It will appear in\n"
                    "the WRONG PLACE!");
    gtk_container_add(GTK_CONTAINER(subwindow), sublabel);
    gtk_window_set_decorated(GTK_WINDOW(subwindow), FALSE);
    gtk_window_set_modal(GTK_WINDOW(subwindow), TRUE);

    GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(editable));
    gtk_window_set_transient_for(
            GTK_WINDOW(subwindow), GTK_WINDOW(window));

    gint dx, dy;
    gtk_window_get_position(GTK_WINDOW(window), &dx, &dy);

    GtkAllocation allocation;
    gtk_widget_get_allocation(GTK_WIDGET(editable), &allocation);

    gtk_window_move(
            GTK_WINDOW(subwindow),
           allocation.x+dx, allocation.y+allocation.height*2+dy);
    gtk_widget_show_all(subwindow);
    return false;
}

結果は私が期待したものではありません。装飾されていないウィンドウはさまざまな場所に表示されますが、通常は画面の左上に表示されます。

新しいウィンドウがウィンドウの左上に表示されます

また、私はこの(かなり有益ですが行き止まりの)警告を受け取ります:

(teste-subwindow-under-entry:32300): Gtk-CRITICAL **: IA__gtk_window_get_position: アサーション `GTK_IS_WINDOW (ウィンドウ)' が失敗しました

私はいくつかの他のアプローチを試みました (例えば、最初のウィンドウの寸法を で取得するなどgdk_window_get_geometry()) が、どれもうまくいきませんでした (そして、それらは盲目的な試みであるため、私は驚きません)。

では、特定のセル レンダラーの下で装飾されていないウィンドウを開くにはどうすればよいでしょうか。

4

0 に答える 0