Основной цикл и события
Основной цикл и события — Инициализация библиотеки, основной цикл обработки событий и события
Функции
Типы и значения
| #define | GTK_PRIORITY_RESIZE |
Файлы заголовков
#include <gtk/gtk.h>
Описание
Перед использованием GTK+, необходимо его инициализировать; инициализация подключается к дисплею системы окон и анализирует некоторые стандартные аргументы командной строки. Макрос gtk_init() инициализирует GTK+. gtk_init() завершает приложение в случае возникновения ошибок; для избежания этого используйте gtk_init_check(). gtk_init_check() позволяет восстановиться после неудачной инициализации GTK+ — вы можете запустить своё приложение в текстовом режиме.
Как и все наборы инструментов графического интерфейса, GTK+ использует модель программирования на основе событий. Когда пользователь ничего не делает, GTK+ находится в «главном цикле» и ожидает ввода. Если пользователь выполняет какое-либо действие, например, щелчок мышью, главный цикл «просыпается» и отправляет событие в GTK+. GTK+ пересылает событие одному или нескольким виджетам.
Когда виджеты получают событие, они часто излучают один или несколько «сигналов». Сигналы уведомляют вашу программу о том, что «произошло что-то интересное», вызывая функции, которые вы подключили к сигналу с помощью g_signal_connect(). Функции, подключенные к сигналу, часто называются «обработчиками».
Когда вызываются ваши обработчики, вы обычно выполняете какое-либо действие. Например, при нажатии кнопки «Открыть» вы можете отобразить GtkFileChooserDialog. После завершения обработчика GTK+ вернётся в главный цикл и будет ожидать дальнейшего ввода пользователя.
Типичная main() функция для приложения GTK+
Вместо gtk_main() можно использовать прямой доступ к главному циклу GLib, хотя это требует несколько большего количества набора кода. См. GMainLoop в документации GLib.
Функции
gtk_disable_setlocale ()
void gtk_disable_setlocale (void);
Предотвращает вызов gtk_init(), gtk_init_check(), gtk_init_with_args() и gtk_parse_args() для автоматического вызова setlocale (LC_ALL, ""). Эта функция необходима, если нужно установить локаль программы отличной от локали пользователя, или для установки различных значений для различных категорий локали.
Большинству программ не нужно вызывать эту функцию.
gtk_get_default_language ()
PangoLanguage *
gtk_get_default_language (void); Возвращает PangoLanguage для языка по умолчанию, который в данный момент используется. (Обратите внимание, что он может изменяться в течение жизни приложения.) Язык по умолчанию определяется текущей локалью. Он определяет, например, использует ли GTK+ направление текста справа налево или слева направо.
Эта функция эквивалентна pango_language_get_default(). Смотрите подробности в этой функции.
Возвращаемое значение
язык по умолчанию в виде PangoLanguage, не требует освобождения.
[transfer none]
gtk_get_locale_direction ()
GtkTextDirection
gtk_get_locale_direction (void); Получает направление текущей локали. Это ожидаемое направление чтения текста и пользовательского интерфейса.
Эта функция зависит от текущей установленной локали с помощью setlocale() и по умолчанию устанавливает направление GTK_TEXT_DIR_LTR, в противном случае. GTK_TEXT_DIR_NONE никогда не возвращается.
GTK+ устанавливает направление текста по умолчанию в соответствии с локалью во время gtk_init(), и обычно нужно использовать gtk_widget_get_direction() или gtk_widget_get_default_direction() для получения текущего направления.
Эта функция нужна только в редких случаях, когда локаль изменяется после того, как GTK+ уже был инициализирован. В этом случае вы можете использовать её для обновления направления текста по умолчанию следующим образом:
Возвращаемое значение
GtkTextDirection текущей локали
С: 3.12
gtk_parse_args ()
gboolean gtk_parse_args (int *argc,char ***argv);
Разбирает аргументы командной строки и инициализирует глобальные атрибуты GTK+, но фактически не открывает подключение к дисплею. (См. gdk_display_open(), gdk_get_display_arg_name())
Любые аргументы, используемые GTK+ или GDK, удаляются из массива, и argc и argv соответственно обновляются.
Нет необходимости явно вызывать эту функцию, если вы используете gtk_init() или gtk_init_check().
Обратите внимание, что многие аспекты GTK+ требуют подключения к дисплею для работы, поэтому этот способ инициализации GTK+ действительно полезен только для специализированных случаев.
Параметры
argc | указатель на количество аргументов командной строки. | [inout] |
argv | указатель на массив аргументов командной строки. | [array length=argc][inout] |
gtk_init ()
void
gtk_init (int *argc,
char ***argv); Вызовите эту функцию перед использованием других функций GTK+ в ваших приложениях графического интерфейса. Она инициализирует все необходимое для работы инструментария и анализирует некоторые стандартные параметры командной строки.
Хотя вы ожидаете передать argc, argv параметры из main() в эту функцию, возможно передать NULL, если argv недоступен или обработка командной строки не требуется.
argc и argv корректируются соответственно, чтобы ваш собственный код никогда не видел этих стандартных аргументов.
Обратите внимание, что есть некоторые альтернативные способы инициализации GTK+: если вы вызываете gtk_parse_args(), gtk_init_check(), gtk_init_with_args() или g_option_context_parse() с группой опций, возвращённой функцией gtk_get_option_group(), вам не нужно вызывать gtk_init().
И если вы используете GtkApplication, вам также не нужно вызывать какие-либо функции инициализации; обработчик “startup” сделает это за вас.
Эта функция завершит вашу программу, если по какой-то причине не удалось инициализировать систему окон. Если вы хотите, чтобы ваша программа перешла на текстовый интерфейс, вы должны вызвать gtk_init_check() вместо этого.
Начиная с версии 2.18, GTK+ вызывает signal (SIGPIPE, SIG_IGN) во время инициализации, чтобы игнорировать сигналы SIGPIPE, так как их почти никогда не требуется в графических приложениях. Если вам нужно обработать SIGPIPE по какой-либо причине, сбросьте обработчик после gtk_init(), но обратите внимание, что другие библиотеки (например, libdbus или gvfs) могут делать аналогичные вещи.
Параметры
argc | Адрес параметра | [inout] |
argv | Адрес параметра | [array length=argc][inout][allow-none] |
gtk_init_check ()
gboolean gtk_init_check (int *argc,char ***argv);
Эта функция выполняет ту же работу, что и gtk_init(), с одним изменением: она не завершает программу, если система окон не может быть инициализирована. Вместо этого она возвращает FALSE при ошибке.
Таким образом, приложение может перейти к другим способам взаимодействия с пользователем — например, интерфейсу curses или командной строке.
Параметры
argc | Адрес параметра | [inout] |
argv | Адрес параметра | [array length=argc][inout][allow-none] |
gtk_init_with_args ()
gboolean gtk_init_with_args (gint *argc,gchar ***argv,const gchar *parameter_string,const GOptionEntry *entries,const gchar *translation_domain,GError **error);
Эта функция выполняет ту же работу, что и gtk_init_check(). Кроме того, она позволяет добавить собственные параметры командной строки и автоматически генерирует хорошо отформатированный --help вывод. Обратите внимание, что ваша программа будет завершена после вывода справки.
Параметры
argc | Адрес параметра | [inout] |
argv | Адрес параметра | [array length=argc][inout][allow-none] |
parameter_string | строка, отображаемая в первой строке | [allow-none] |
entries | массив | [array zero-terminated=1] |
translation_domain | домен перевода, используемый для перевода | [nullable] |
error | место для хранения ошибок |
С: 2.6
gtk_get_option_group ()
GOptionGroup *
gtk_get_option_group (gboolean open_default_display); Возвращает GOptionGroup для параметров командной строки, распознаваемых GTK+ и GDK.
Вы должны добавить эту группу в свой GOptionContext с помощью g_option_context_add_group(), если вы используете g_option_context_parse() для анализа параметров командной строки.
Параметры
open_default_display | открывать ли системный дисплей по умолчанию при разборе параметров командной строки |
Возвращаемое значение
GOptionGroup для параметров командной строки, распознаваемых GTK+.
[transfer full]
С: 2.6
gtk_events_pending ()
gboolean
gtk_events_pending (void); Проверяет, есть ли ожидающие события.
Это можно использовать для обновления пользовательского интерфейса и вызова таймаутов и т. д. во время выполнения вычислений, требующих много времени.
Обновление пользовательского интерфейса во время длительных вычислений
gtk_main ()
void gtk_main (void);
Запускает главный цикл до вызова gtk_main_quit().
Вы можете вложенно вызывать gtk_main(). В этом случае gtk_main_quit() вернёт результат самого внутреннего вызова главного цикла.
gtk_main_level ()
guint
gtk_main_level (void); Запрашивает текущий уровень вложенности главного цикла.
Возвращаемое значение
уровень вложенности текущего вызова главного цикла
gtk_main_quit ()
void gtk_main_quit (void);
Принудительно завершает самый внутренний вызов главного цикла при получении контроля.
gtk_main_iteration ()
gboolean
gtk_main_iteration (void); Выполняет одну итерацию главного цикла.
Если ожидающие события отсутствуют, GTK+ будет блокировать выполнение до появления следующего события. Если вам не нужно блокировать выполнение, обратитесь к gtk_main_iteration_do() или сначала проверьте наличие ожидающих событий с помощью gtk_events_pending().
Возвращаемое значение
TRUE, если для самого внутреннего главного цикла был вызван gtk_main_quit()
gtk_main_iteration_do ()
gboolean
gtk_main_iteration_do (gboolean blocking); Выполняет одну итерацию основного цикла. Если события недоступны, возвращается или блокируется в зависимости от значения blocking .
Параметры
blocking |
|
Возвращаемое значение
TRUE, если для самого внутреннего основного цикла был вызван gtk_main_quit()
gtk_main_do_event ()
void
gtk_main_do_event (GdkEvent *event); Обрабатывает одно событие GDK.
Эта функция доступна только для фильтрации событий между GDK и GTK+. Обычно вам не нужно вызывать эту функцию напрямую.
Хотя вам не следует вызывать эту функцию напрямую, вы можете захотеть знать, как именно обрабатываются события. Вот что делает эта функция со событием:
Сжимает события ввода/вывода. Если переданное событие формирует пару «вход/выход» вместе со следующим событием (полученным из GDK), оба события отбрасываются. Это делается для предотвращения большого количества (де-) выделения виджетов, пересеченных указателем.
Находит виджет, получивший событие. Если виджет определить невозможно, событие отбрасывается, если только оно не относится к транзакции INCR.
Затем событие помещается в стек, чтобы вы могли получить доступ к текущему обрабатываемому событию с помощью
gtk_get_current_event().-
Событие отправляется виджету. Если активна захват, все события для виджетов, не находящихся в захваченном виджете, отправляются последнему с некоторыми исключениями:
События удаления и уничтожения по-прежнему отправляются виджету события по очевидным причинам.
События, которые напрямую относятся к визуальному представлению виджета события.
События выхода доставляются виджету события, если ранее ему было доставлено событие входа без парного события выхода.
События перетаскивания не перенаправляются, так как не совсем ясно, какими должны быть их семантика. Еще одним интересным моментом является то, что все события клавиш сначала передаются через функции отслеживания клавиш, если они есть. Прочитайте описание
gtk_key_snooper_install(), если вам нужна эта функция.
После завершения доставки событие извлекается из стека событий.
Параметры
event | Обрабатываемое событие (обычно передаётся GDK) |
GtkModuleInitFunc ()
void (*GtkModuleInitFunc) (gint *argc,gchar ***argv);
Каждый модуль GTK+ должен иметь функцию gtk_module_init() с этим прототипом. Эта функция вызывается после загрузки модуля.
GtkModuleDisplayInitFunc ()
void
(*GtkModuleDisplayInitFunc) (GdkDisplay *display); Модуль GTK+, поддерживающий многодисплейность, может иметь функцию gtk_module_display_init() с этим прототипом. GTK+ вызывает эту функцию для каждого открытого дисплея.
Параметры
display | открытый GdkDisplay |
Since: 2.2
gtk_true ()
gboolean
gtk_true (void); Все, что делает эта функция, это возвращает TRUE.
Это может быть полезно, например, если вы хотите запретить удаление окна. Конечно, вы не должны этого делать, так как пользователь ожидает реакции на нажатие значка закрытия окна...
Постоянное окно
int main(int argc,char**argv) { // Initialize i18n support with bindtextdomain(), etc. ... // Initialize the widget set gtk_init(&argc,&argv); // Create the main window mainwin =gtk_window_new(GTK_WINDOW_TOPLEVEL); // Set up our GUI elements ... // Show the application window gtk_widget_show_all(mainwin); // Enter the main event loop, and wait for user interaction gtk_main(); // The user lost interest return0; }
Возвращаемое значение
gtk_false ()
gboolean
gtk_false (void); Аналогично gtk_true(), эта функция ничего не делает, но всегда возвращает FALSE.
Возвращаемое значение
gtk_grab_add ()
void
gtk_grab_add (GtkWidget *widget); Делает widget текущим захваченным виджетом.
Это означает, что взаимодействие с другими виджетами в одном приложении заблокировано, а события мыши и клавиатуры передаются этому виджету.
Если widget не чувствителен, он не устанавливается как текущий захваченный виджет, и эта функция ничего не делает.
[метод]
Параметры
widget | Виджет, захватывающий события клавиатуры и указателя |
gtk_grab_get_current ()
GtkWidget *
gtk_grab_get_current (void); Запрашивает текущий захват группы стандартных окон.
Возвращаемое значение
Виджет, который в настоящее время имеет захват, или NULL, если захват не активен.
[transfer none][nullable]
gtk_grab_remove ()
void
gtk_grab_remove (GtkWidget *widget); Удаляет захват из данного виджета.
Вы должны сопоставить вызовы gtk_grab_add() и gtk_grab_remove().
Если widget не имеет захвата, эта функция ничего не делает.
[метод]
Параметры
widget | Виджет, который отказывается от захвата |
gtk_device_grab_add ()
void gtk_device_grab_add (GtkWidget *widget,GdkDevice *device,gboolean block_others);
Добавляет захват GTK+ на device, поэтому все события на device и его связанном указателе или клавиатуре (если таковые имеются) доставляются widget. Если параметр block_others равен TRUE, другие устройства не смогут взаимодействовать с widget во время захвата.
Параметры
Since: 3.0
gtk_device_grab_remove ()
void gtk_device_grab_remove (GtkWidget *widget,GdkDevice *device);
Удаляет захват устройства у указанного виджета.
Вы должны вызвать gtk_device_grab_add() и gtk_device_grab_remove() парами.
С версии: 3.0
gtk_key_snooper_install ()
guint gtk_key_snooper_install (GtkKeySnoopFunc snooper,gpointer func_data);
gtk_key_snooper_install устарело с версии 3.4 и не должно использоваться в новых кодах.
Обработка нажатий клавиш не рекомендуется. События должны обрабатываться виджетами.
Устанавливает функцию обработки нажатий клавиш, которая будет вызываться для всех событий нажатия клавиш до их обычной доставки.
[skip]
Параметры
snooper | ||
func_data | данные, передаваемые в | [closure] |
Возвращает
уникальный идентификатор для этого обработчика нажатий клавиш, используемый с gtk_key_snooper_remove().
GtkKeySnoopFunc ()
gint (*GtkKeySnoopFunc) (GtkWidget *grab_widget,GdkEventKey *event,gpointer func_data);
Функции обработки нажатий клавиш вызываются перед обычной доставкой событий. Они могут использоваться для реализации пользовательской обработки событий нажатия клавиш.
Параметры
grab_widget | виджет, которому будет доставлено событие | |
event | событие нажатия клавиши | |
func_data | данные, предоставленные функции | [closure] |
gtk_key_snooper_remove ()
void
gtk_key_snooper_remove (guint snooper_handler_id); gtk_key_snooper_remove устарело с версии 3.4 и не должно использоваться в новых кодах.
Обработка нажатий клавиш не рекомендуется. События должны обрабатываться виджетами.
Удаляет функцию обработки нажатий клавиш с заданным идентификатором.
Параметры
snooper_handler_id | Идентификатор обработчика нажатий клавиш для удаления |
gtk_get_current_event ()
GdkEvent *
gtk_get_current_event (void); Получает копию события, в настоящее время обрабатываемого GTK+.
Например, если вы обрабатываете сигнал “clicked”, текущим событием будет GdkEventButton, который инициировал сигнал ::clicked.
Возвращает
копию текущего события или NULL, если текущее событие отсутствует. Возвращённое событие необходимо освободить с помощью gdk_event_free().
[transfer full][nullable]
gtk_get_current_event_time ()
guint32
gtk_get_current_event_time (void); Если есть текущее событие с отметкой времени, возвращает эту отметку времени, иначе возвращает GDK_CURRENT_TIME.
Возвращает
отметку времени текущего события или GDK_CURRENT_TIME.
gtk_get_current_event_state ()
gboolean
gtk_get_current_event_state (GdkModifierType *state); Если есть текущее событие с полем состояния, помещает это поле в state и возвращает TRUE, в противном случае возвращает FALSE.
Параметры
state | место для хранения состояния текущего события. | [out] |
Возвращает
TRUE, если было текущее событие с полем состояния
gtk_get_current_event_device ()
GdkDevice *
gtk_get_current_event_device (void); Если есть текущее событие с устройством, возвращает это устройство, в противном случае возвращает NULL.
gtk_propagate_event ()
void gtk_propagate_event (GtkWidget *widget,GdkEvent *event);
Отправляет событие виджету, распространяя его на родительские виджеты, если оно не было обработано.
События, получаемые GTK+ от GDK, обычно начинаются в gtk_main_do_event(). В зависимости от типа события, наличия модальных диалоговых окон, захвата и т.д., событие может быть распространено; в этом случае используется эта функция.
gtk_propagate_event() вызывает gtk_widget_event() для каждого виджета, которому она решает отправить событие. Таким образом, gtk_widget_event() — это функция самого низкого уровня; она просто излучает сигнал “event” и, возможно, специфичный для события сигнал на виджете. gtk_propagate_event() находится на немного более высоком уровне, а gtk_main_do_event() — на самом высоком.
Сказанное выше означает, что вам, скорее всего, не нужно использовать ни одну из этих функций; синтезирование событий редко необходимо. Скорее всего, существуют лучшие способы достижения ваших целей. Например, используйте gdk_window_invalidate_rect() или gtk_widget_queue_draw() вместо создания событий expose.
Параметры
widget | виджет GtkWidget | |
event | событие |
Типы и значения
GTK_PRIORITY_RESIZE
#define GTK_PRIORITY_RESIZE (G_PRIORITY_HIGH_IDLE + 10)
Используйте этот приоритет для функциональности, связанной с распределением размера.
Внутри GTK+ он используется для вычисления размеров виджетов. Этот приоритет выше, чем GDK_PRIORITY_REDRAW, чтобы избежать изменения размера виджета, который только что был перерисован.
См. также
Обратитесь к руководству GLib, особенно к GMainLoop и функциям, связанным с сигналами, таким как g_signal_connect()
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer.gnome.org/gtk3/3.20/gtk3-General.html