Spec-Zone.ru › GTK 3.24

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

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

Функции

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 или командной строки.

Обратите внимание, что вызов любой функции GTK или создание любого типа GTK после того, как эта функция вернула FALSE, приводит к неопределенному поведению.

Параметры

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

массив GOptionEntrys, завершаемый значением NULL, описывающий опции вашей программы.

[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. Сжимает события enter/leave notify. Если переданное событие создаёт пару enter/leave вместе со следующим событием (извлечённым из GDK), оба события отбрасываются. Это сделано, чтобы избежать задержек в (от)подсвечивании виджетов, пересечённых указателем.

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

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

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

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

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

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

    • События drag не перенаправляются, так как неясны их семантика. Другой момент заключается в том, что все ключевые события сначала передаются функциям key snooper, если они есть. Прочитайте описание 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

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

Параметры

widget

a GtkWidget

device

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

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().

Параметры

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

функция 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.

Возвращает

объект GdkDevice или NULL.

[transfer none][nullable]

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

Spec-Zone.ru

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