Основной цикл и события
Основной цикл и события — Инициализация библиотеки, основной цикл обработки событий и сами события
Функции
Типы и значения
| #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(). Подробности см. в этой функции.
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] |
Возвращает
TRUE в случае успешной инициализации, иначе FALSE
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 или командной строки.
Обратите внимание, что вызов любой функции GTK или создание любого типа GTK после того, как эта функция вернула FALSE, приводит к неопределенному поведению.
Параметры
argc | Адрес параметра | [inout] |
argv | Адрес параметра | [array length=argc][inout][allow-none] |
Возвращаемое значение
TRUE , если аргументы командной строки (если таковые имеются) были валидны и система окон была успешно инициализирована, FALSE в противном случае
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 | массив GOptionEntrys, завершаемый значением | [array zero-terminated=1] |
translation_domain | домен перевода для перевода | [nullable] |
error | место для возврата ошибок |
Возвращаемое значение
TRUE , если аргументы командной строки (если таковые имеются) были валидны и система окон была успешно инициализирована, FALSE в противном случае
С: 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);
Проверяет, есть ли ожидающие события.
Это можно использовать для обновления пользовательского интерфейса и вызова таймаутов и т. п. во время выполнения трудоёмких вычислений.
Обновление пользовательского интерфейса во время длительных вычислений
Возвращаемое значение
TRUE , если ожидающие события есть, FALSE в противном случае
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+. Обычно вам не нужно вызывать эту функцию напрямую.
Хотя вам не следует вызывать эту функцию напрямую, вы можете захотеть узнать, как именно обрабатываются события. Вот что делает эта функция с событием:
Сжимает события enter/leave notify. Если переданное событие создаёт пару enter/leave вместе со следующим событием (извлечённым из GDK), оба события отбрасываются. Это сделано, чтобы избежать задержек в (от)подсвечивании виджетов, пересечённых указателем.
Находит виджет, получивший событие. Если виджет определить невозможно, событие отбрасывается, если оно не принадлежит транзакции INCR.
Затем событие помещается в стек, чтобы вы могли запросить текущее обрабатываемое событие с помощью
gtk_get_current_event().-
Событие отправляется виджету. Если захвачено управление, все события для виджетов, не входящих в захваченный виджет, отправляются последнему, за исключением нескольких случаев:
События удаления и уничтожения по-прежнему отправляются виджету, получившему событие, по понятным причинам.
События, которые напрямую относятся к визуальному представлению виджета, получившего событие.
События leave доставляются виджету, получившему событие, если ему ранее было доставлено событие enter без связанного события leave.
События drag не перенаправляются, так как неясны их семантика. Другой момент заключается в том, что все ключевые события сначала передаются функциям key snooper, если они есть. Прочитайте описание
gtk_key_snooper_install(), если вам нужна эта возможность.
После завершения доставки событие извлекается из стека событий.
Параметры
event | Обрабатываемое событие (обычно передаётся GDK) |
GtkModuleInitFunc ()
void
(*GtkModuleInitFunc) (gint *argc,
gchar ***argv); Каждый модуль GTK+ должен иметь функцию gtk_module_init() с этим прототипом. Эта функция вызывается после загрузки модуля.
Параметры
argc | GTK+ всегда передаёт | [allow-none] |
argv | GTK+ всегда передаёт | [allow-none][array length=argc] |
GtkModuleDisplayInitFunc ()
void
(*GtkModuleDisplayInitFunc) (GdkDisplay *display); Модуль GTK+, поддерживающий несколько дисплеев, может иметь функцию gtk_module_display_init() с этим прототипом. GTK+ вызывает эту функцию для каждого открытого дисплея.
Параметры
display | открытый GdkDisplay |
С: 2.2
gtk_true ()
gboolean gtk_true (void);
Функция возвращает TRUE.
Это может быть полезно, например, для запрета удаления окна. Конечно, вы не должны этого делать, так как пользователь ожидает реакции на нажатие иконки закрытия окна...
Постоянное окно
int
main (int argc, char **argv)
{
GtkWidget *mainwin;
// 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
return 0;
}Возвращает
TRUE
gtk_false ()
gboolean gtk_false (void);
Аналогично gtk_true(), эта функция ничего не делает, но всегда возвращает FALSE.
Возвращает
FALSE
gtk_grab_add ()
void
gtk_grab_add (GtkWidget *widget); Делает widget текущим захваченным виджетом.
Это означает, что взаимодействие с другими виджетами в том же приложении заблокировано, и события мыши и клавиатуры передаются этому виджету.
Если widget не реагирует, он не устанавливается как текущий захваченный виджет, и эта функция ничего не делает.
[method]
Параметры
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 нет захвата, эта функция ничего не делает.
[method]
Параметры
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 во время захвата.
Параметры
С: 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 | функция GtkKeySnoopFunc | |
func_data | данные, передаваемые в | [closure] |
Возвращает
уникальный идентификатор для этого отслеживания нажатий клавиш, используемый с gtk_key_snooper_remove().
GtkKeySnoopFunc ()
gint (*GtkKeySnoopFunc) (GtkWidget *grab_widget,GdkEventKey *event,gpointer func_data);
Функции отслеживания нажатий клавиш вызываются перед стандартной обработкой событий. Их можно использовать для реализации пользовательской обработки событий нажатия клавиш.
Параметры
grab_widget | виджет, которому будет передано событие | |
event | событие нажатия клавиши | |
func_data | данные, переданные в | [closure] |
Возвращает
TRUE для остановки дальнейшей обработки event , FALSE для продолжения.
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_get_event_widget ()
GtkWidget *
gtk_get_event_widget (GdkEvent *event); Если event является NULL или событие не было связано ни с одним виджетом, возвращает NULL, иначе возвращает виджет, который изначально получил событие.
Параметры
event | объект GdkEvent |
Возвращает
виджет, который изначально получил event, или NULL.
[transfer none][nullable]
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.24/gtk3-General.html