LINUX.ORG.RU

GTK+: зависание на gtk_window_set_transient_for


0

0

Создаю обычное окно-родитель gtk_window_new(GTK_WINDOW_TOPLEVEL), затем такое же окно-потомок. Мне нужно, чтобы потомок не давал родительскому окну управление и всегда был поверх него. Для потомка выполняю:

gtk_window_set_modal(my_window, true);

gtk_window_set_transient_for(my_window, parent_window);

Модальным окно становится, а на gtk_window_set_transient_for виснет.

anonymous

Ответ на: комментарий от anonymous

У меня такой код работает. WM - window manager, если под GNOME, то metacity, наверное, хотя всякое может быть.

#include <gtk/gtk.h>

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *parent_window;
    GtkWidget *button;
    GtkWidget *parent_button;
    
    gtk_init (&argc, &argv);
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    parent_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    button = gtk_button_new_with_label ("Hello world in window");
    parent_button = gtk_button_new_with_label ("Hello world in parent window");
    
    gtk_container_add (GTK_CONTAINER (window), button);
    gtk_container_add (GTK_CONTAINER (parent_window), parent_button);

    gtk_widget_show_all  (parent_window);
    gtk_widget_show_all  (window);
    
    gtk_window_set_modal (GTK_WINDOW (window), TRUE);
    gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (parent_window));
    
    gtk_main ();
    
    return 0;
}

welkam ★★
()
Ответ на: комментарий от welkam

У меня вроде тоже всегда работает. Подвисает если сделать set_transient_for(wnd, parent); set_transient_for(parent, wnd);

Такое с диалогами иногда бывает (случайно :) )

У меня другой вопрос. Кто-нибудь сталкивался с таким явлением - под *NIX GTK приложение работает нормально, а под Win32 при закрытии дочернего окна родитель теряет фокус. Проявляется только при установленном transient_for. Версии GTK: 2.6.10, 2.8.18.

rymis ★★
()
Ответ на: комментарий от welkam

  Действительно, работает =), но как-то странно. Окно-потомок всегда находится выше родителя, но при этом родителя можно перетаскивать, ресайзить, сворачивать и разворачивать. Нельзя только закрыть. А можно ли сделать, знаете, как в виндах: выскакивает окошко (например, сообщение об ошибке), и пока ему не скажешь "Окай", оно не даёт НИКАК взаимодействовать с родительским окном (а иногда и с остальными)?

anonymous
()
Ответ на: комментарий от welkam

  Извините за форматирование, ещё раз:
  Действительно, работает =), но как-то странно. Окно-потомок всегда находится выше
родителя, но при этом родителя можно перетаскивать, ресайзить, сворачивать и
разворачивать. Нельзя только закрыть. А можно ли сделать, знаете, как в виндах:
выскакивает окошко (например, сообщение об ошибке), и пока ему не скажешь "Окай",
оно не даёт НИКАК взаимодействовать с родительским окном (а иногда и с остальными)?

anonymous
()
Ответ на: комментарий от welkam

  Оказывается, моя проблема была не совсем там... попробуй развернуть родителя на полный экран:

#include <gtk/gtk.h>

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *parent_window;
    GtkWidget *button;
    GtkWidget *parent_button;
    
    gtk_init (&argc, &argv);
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    parent_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    button = gtk_button_new_with_label ("Hello world in window");
    parent_button = gtk_button_new_with_label ("Hello world in parent window");
    
    gtk_container_add (GTK_CONTAINER (window), button);
    gtk_container_add (GTK_CONTAINER (parent_window), parent_button);

    gtk_widget_show_all  (parent_window);
    gtk_widget_show_all  (window);

    gtk_window_fullscreen(GTK_WINDOW (parent_window));    

    gtk_window_set_modal (GTK_WINDOW (window), TRUE);
    gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (parent_window));
    
    gtk_main ();
    
    return 0;
}

philip
()
Ответ на: комментарий от philip

Про никак взаимодействовать и не давать закрывать родителя - ну правильно, а зачем окно тогда модальным делать-то? Хочешь закрывать родителя - делай не модальным. А то непонятно, почему закрывать окно можно, а меню открывать нельзя, например, и так далее.

По поводу развернуть родителя на весь экран - попробовал, проблема-то в чём? У меня только панельки видны становятся, это ошибка в metacity. Если что-то другое, то, наверное, эта ошибка была исправлена уже, но надо проверить.

welkam ★★
()
Ответ на: комментарий от welkam

>проблема-то в чём?
У меня при исполнении этого кода окно потомка исчезает и альт-табом не включается

philip
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.