LINUX.ORG.RU

[GTK] Как в функции сделать паузу до закрытия дочернего окна?

 


0

0

Из функции я открываю модальное окно, в которое пользователь должен ввести кое-какие недостающие данные. При этом функция должна подождать окончания ввода. Однако, как только я открываю это окно (gtk_widget_show_all), функция продолжает выполнение дальше, не дожидаясь окончания дочернего потока.

Как сделать, чтобы это окно вело себя наподобие GtkDialog ?

☆☆☆☆☆

Решил «через одно место»: вставил «внутренности» своего окна в glade'овскую заготовку GtkDialog.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от baverman

>Иногда не нужны его кнопки

Даже окей/закрыть?

а скрывать или удалять action_area попахивает костылём.

Попахивает отклонением хига :)

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

Не, в этом случае просто отбирается управление у родительского окна, но дочернее все равно запускается отдельным потоком - родитель не прерывается на время выполнения дочернего.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от yoghurt

Я, честно говоря, так и не понял, как из обычного окна сделать диалоговое. Поэтому и «запихал» все в диалоговое. Что не есть хорошо (мало ли, может, мне «кнопочки» не нужны будут - скажем, дочернее окно будет содержать всего пару-тройку «радио-кнопок», закрываясь при выборе одной из них).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от xterro

Эта функция не годится (неактивное окно не является закрытым). Но идея понятна - использовать какую-либо функцию, определяющую, существует ли данное окно, и мониторить, пока не закроется...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от yoghurt

Попахивает отклонением хига :)

Я сам себе хиг, в случае клепания личного интерфейса. Для окей/закрыть есть замечательная хардварная кнопка Escape.

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

использовать какую-либо функцию, определяющую, существует ли данное окно, и мониторить, пока не закроется...

Это самое убербыдлокодерское решение. Есть же колбеки, в конце-то концов.

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

Есть же колбеки, в конце-то концов.

Ну нет у меня книжки по GTK! Денег жалко (она тысячи полторы стоит), да и к тому же самая свежая книжка относится к довольно древней версии.

А так - решаю сиюминутные вопросы при помощи ЛОРа и developer.gnome.org методом «тыка» :)

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Ну нет у меня книжки по GTK!

Если ты имеешь в виду «Foundations of GTK+ Development», то там довольно таки мало информации сверх официального туториала и api reference. Хотя подана она, конечно, намного доступнее.

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

Поэтому и «запихал» все в диалоговое.

Что не есть хорошо (мало ли, может, мне «кнопочки» не нужны будут

Как я уже обмолвился выше, виджет action_area доступен и его можно, в случае необходимости, удалить.

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

Они стоят тысячи по 2-3. Хотя, надо будет, наверное, более-менее свежую скачать и распечатать...

Eddy_Em ☆☆☆☆☆
() автор топика

Ещё можешь «перенести» функционал как в GtkDialog, для своего окошка:

gint
gtk_dialog_run (GtkDialog *dialog)
{
  RunInfo ri = { NULL, GTK_RESPONSE_NONE, NULL, FALSE };
  gboolean was_modal;
  gulong response_handler;
  gulong unmap_handler;
  gulong destroy_handler;
  gulong delete_handler;

  g_return_val_if_fail (GTK_IS_DIALOG (dialog), -1);

  g_object_ref (dialog);

  was_modal = gtk_window_get_modal (GTK_WINDOW (dialog));
  if (!was_modal)
    gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);

  if (!gtk_widget_get_visible (GTK_WIDGET (dialog)))
    gtk_widget_show (GTK_WIDGET (dialog));
       .
       .
       .
ri.loop = g_main_loop_new (NULL, FALSE);

  GDK_THREADS_LEAVE ();
  g_main_loop_run (ri.loop);
  GDK_THREADS_ENTER ();

  g_main_loop_unref (ri.loop);

  ri.loop = NULL;

     .
     .
     .

Т.е создали окошко, сделали его модальным и запустили цикл, пока ответ от окошка не придёт, стоим. Весь код здесь: http://git.gnome.org/browse/gtk+/tree/gtk/gtkdialog.c] Но это наверно будет слишком. :)

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

Ну тогда бери обычный GtkDialog, убирай у него action_area и работай как с обычным окном(это оно и есть по сути) :)

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

это пуркуа? значительно проще дернуть

gtk_widget_hide (gtk_dialog_get_action_area (GTK_DIALOG (dlg)));

нежели городить свой код с ожиданием закрытия окна. последнее попахивает велосипедом. а изменить роль окна, если это необходимо - тоже одна функция

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

> дочернее все равно запускается отдельным потоком - родитель не прерывается на время выполнения дочернего.

внезапно, для потоков есть mutex-ы

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

И что, вы мне предлагаете влезать в исходники gtk?

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