Spec-Zone.ru › GTK 3.20

Основной цикл и события

Основной цикл и события — Инициализация библиотеки, основной цикл обработки событий и события

Функции

void gtk_disable_setlocale ()
PangoLanguage * gtk_get_default_language ()
GtkTextDirection gtk_get_locale_direction ()
gboolean gtk_parse_args ()
void gtk_init ()
gboolean gtk_init_check ()
gboolean gtk_init_with_args ()
GOptionGroup * gtk_get_option_group ()
gboolean gtk_events_pending ()
void gtk_main ()
guint gtk_main_level ()
void gtk_main_quit ()
gboolean gtk_main_iteration ()
gboolean gtk_main_iteration_do ()
void gtk_main_do_event ()
void (*GtkModuleInitFunc) ()
void (*GtkModuleDisplayInitFunc) ()
gboolean gtk_true ()
gboolean gtk_false ()
void gtk_grab_add ()
GtkWidget * gtk_grab_get_current ()
void gtk_grab_remove ()
void gtk_device_grab_add ()
void gtk_device_grab_remove ()
guint gtk_key_snooper_install ()
gint (*GtkKeySnoopFunc) ()
void gtk_key_snooper_remove ()
GdkEvent * gtk_get_current_event ()
guint32 gtk_get_current_event_time ()
gboolean gtk_get_current_event_state ()
GdkDevice * gtk_get_current_event_device ()
GtkWidget * gtk_get_event_widget ()
void gtk_propagate_event ()

Типы и значения

#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]

Возвращаемое значение

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

Адрес параметра argc вашей функции main() (или 0, если argv равен NULL). Это значение будет изменено, если какие-либо аргументы были обработаны.

[inout]

argv

Адрес параметра argv функции main(), или NULL. Любые опции, понятные GTK+, удаляются перед возвратом.

[array length=argc][inout][allow-none]

gtk_init_check ()

gboolean
gtk_init_check (int *argc,
                char ***argv);

Эта функция выполняет ту же работу, что и gtk_init(), с одним изменением: она не завершает программу, если система окон не может быть инициализирована. Вместо этого она возвращает FALSE при ошибке.

Таким образом, приложение может перейти к другим способам взаимодействия с пользователем — например, интерфейсу curses или командной строке.

Параметры

argc

Адрес параметра argc вашей функции main() (или 0, если argv равен NULL). Это значение будет изменено, если какие-либо аргументы были обработаны.

[inout]

argv

Адрес параметра argv функции main(), или NULL. Любые опции, понятные GTK+, удаляются перед возвратом.

[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

Адрес параметра argc вашей функции main() (или 0, если argv равен NULL). Это значение будет изменено, если какие-либо аргументы были обработаны.

[inout]

argv

Адрес параметра argv функции main(), или NULL. Любые опции, понятные GTK+, удаляются перед возвратом.

[array length=argc][inout][allow-none]

parameter_string

строка, отображаемая в первой строке --help вывода, после programname [OPTION...].

[allow-none]

entries

массив NULL-завершённых элементов типа GOptionEntrys, описывающих опции вашей программы.

[array zero-terminated=1]

translation_domain

домен перевода, используемый для перевода --help вывода опций в entries и parameter_string с помощью gettext(), или NULL.

[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+ блокировался, если ожидаемые события отсутствуют

Возвращаемое значение

TRUE, если для самого внутреннего основного цикла был вызван gtk_main_quit()

gtk_main_do_event ()

void
gtk_main_do_event (GdkEvent *event);

Обрабатывает одно событие GDK.

Эта функция доступна только для фильтрации событий между GDK и GTK+. Обычно вам не нужно вызывать эту функцию напрямую.

Хотя вам не следует вызывать эту функцию напрямую, вы можете захотеть знать, как именно обрабатываются события. Вот что делает эта функция со событием:

  1. Сжимает события ввода/вывода. Если переданное событие формирует пару «вход/выход» вместе со следующим событием (полученным из GDK), оба события отбрасываются. Это делается для предотвращения большого количества (де-) выделения виджетов, пересеченных указателем.

  2. Находит виджет, получивший событие. Если виджет определить невозможно, событие отбрасывается, если только оно не относится к транзакции INCR.

  3. Затем событие помещается в стек, чтобы вы могли получить доступ к текущему обрабатываемому событию с помощью gtk_get_current_event().

  4. Событие отправляется виджету. Если активна захват, все события для виджетов, не находящихся в захваченном виджете, отправляются последнему с некоторыми исключениями:

    • События удаления и уничтожения по-прежнему отправляются виджету события по очевидным причинам.

    • События, которые напрямую относятся к визуальному представлению виджета события.

    • События выхода доставляются виджету события, если ранее ему было доставлено событие входа без парного события выхода.

    • События перетаскивания не перенаправляются, так как не совсем ясно, какими должны быть их семантика. Еще одним интересным моментом является то, что все события клавиш сначала передаются через функции отслеживания клавиш, если они есть. Прочитайте описание gtk_key_snooper_install(), если вам нужна эта функция.

  5. После завершения доставки событие извлекается из стека событий.

Параметры

event

Обрабатываемое событие (обычно передаётся GDK)

GtkModuleInitFunc ()

void
(*GtkModuleInitFunc) (gint *argc,
                      gchar ***argv);

Каждый модуль GTK+ должен иметь функцию gtk_module_init() с этим прототипом. Эта функция вызывается после загрузки модуля.

Параметры

argc

GTK+ всегда передает NULL для этого аргумента.

[allow-none]

argv

GTK+ всегда передает NULL для этого аргумента.

[allow-none][array length=argc]

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;
}

Возвращаемое значение

TRUE

gtk_false ()

gboolean
gtk_false (void);

Аналогично gtk_true(), эта функция ничего не делает, но всегда возвращает FALSE.

Возвращаемое значение

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 во время захвата.

Параметры

widget

a GtkWidget

device

a GdkDevice для захвата.

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() парами.

Параметры

widget

a GtkWidget

device

a GdkDevice

С версии: 3.0

gtk_key_snooper_install ()

guint
gtk_key_snooper_install (GtkKeySnoopFunc snooper,
                         gpointer func_data);

gtk_key_snooper_install устарело с версии 3.4 и не должно использоваться в новых кодах.

Обработка нажатий клавиш не рекомендуется. События должны обрабатываться виджетами.

Устанавливает функцию обработки нажатий клавиш, которая будет вызываться для всех событий нажатия клавиш до их обычной доставки.

[skip]

Параметры

snooper

a GtkKeySnoopFunc

func_data

данные, передаваемые в snooper .

[closure]

Возвращает

уникальный идентификатор для этого обработчика нажатий клавиш, используемый с gtk_key_snooper_remove().

GtkKeySnoopFunc ()

gint
(*GtkKeySnoopFunc) (GtkWidget *grab_widget,
                    GdkEventKey *event,
                    gpointer func_data);

Функции обработки нажатий клавиш вызываются перед обычной доставкой событий. Они могут использоваться для реализации пользовательской обработки событий нажатия клавиш.

Параметры

grab_widget

виджет, которому будет доставлено событие

event

событие нажатия клавиши

func_data

данные, предоставленные функции gtk_key_snooper_install().

[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.

Возвращает

a GdkDevice, или NULL.

[transfer none][nullable]

gtk_get_event_widget ()

GtkWidget *
gtk_get_event_widget (GdkEvent *event);

Если event равен NULL или событие не ассоциировано ни с одним виджетом, возвращает NULL, в противном случае возвращает виджет, который первоначально получил событие.

Параметры

event

a 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.20/gtk3-General.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API