краткий обзор#include <gtk/gtk.h> gchar* gtk_set_locale (void); void gtk_disable_setlocale (void); pangolanguage* gtk_get_default_language (void); gboolean gtk_parse_args (int *argc, char ***argv); void gtk_init (int *argc, char ***argv); gboolean gtk_init_check (int *argc, char ***argv); gboolean gtk_init_with_args (int *argc, char ***argv, char *parameter_string, goptionentry *entries, char *translation_domain, gerror **error); goptiongroup* gtk_get_option_group (gboolean open_default_display); void gtk_exit (gint error_code); gboolean gtk_events_pending (void); void gtk_main (void); guint gtk_main_level (void); void gtk_main_quit (void); gboolean gtk_main_iteration (void); gboolean gtk_main_iteration_do (gboolean blocking); void gtk_main_do_event (gdkevent *event); void (*gtkmoduleinitfunc) (gint *argc, gchar ***argv); void (*gtkmoduledisplayinitfunc) (gdkdisplay *display); gboolean gtk_true (void); gboolean gtk_false (void); void gtk_grab_add (gtkwidget *widget); gtkwidget* gtk_grab_get_current (void); void gtk_grab_remove (gtkwidget *widget); void gtk_init_add (gtkfunction function, gpointer data); void gtk_quit_add_destroy (guint main_level, gtkobject *object); guint gtk_quit_add (guint main_level, gtkfunction function, gpointer data); guint gtk_quit_add_full (guint main_level, gtkfunction function, gtkcallbackmarshal marshal, gpointer data, gtkdestroynotify destroy); void gtk_quit_remove (guint quit_handler_id); void gtk_quit_remove_by_data (gpointer data); guint gtk_timeout_add_full (guint32 interval, gtkfunction function, gtkcallbackmarshal marshal, gpointer data, gtkdestroynotify destroy); guint gtk_timeout_add (guint32 interval, gtkfunction function, gpointer data); void gtk_timeout_remove (guint timeout_handler_id); guint gtk_idle_add (gtkfunction function, gpointer data); guint gtk_idle_add_priority (gint priority, gtkfunction function, gpointer data); guint gtk_idle_add_full (gint priority, gtkfunction function, gtkcallbackmarshal marshal, gpointer data, gtkdestroynotify destroy); void gtk_idle_remove (guint idle_handler_id); void gtk_idle_remove_by_data (gpointer data); guint gtk_input_add_full (gint source, gdkinputcondition condition, gdkinputfunction function, gtkcallbackmarshal marshal, gpointer data, gtkdestroynotify destroy); void gtk_input_remove (guint input_handler_id); #define gtk_priority_redraw #define gtk_priority_resize #define gtk_priority_high #define gtk_priority_internal #define gtk_priority_default #define gtk_priority_low guint gtk_key_snooper_install (gtkkeysnoopfunc snooper, gpointer func_data); gint (*gtkkeysnoopfunc) (gtkwidget *grab_widget, gdkeventkey *event, gpointer func_data); void gtk_key_snooper_remove (guint snooper_handler_id); gdkevent* gtk_get_current_event (void); guint32 gtk_get_current_event_time (void); gboolean gtk_get_current_event_state (gdkmodifiertype *state); gtkwidget* gtk_get_event_widget (gdkevent *event); void gtk_propagate_event (gtkwidget *widget, gdkevent *event); описаниеперед использованием gtk+, вам нужно её инициализировать; инициализация подключает оконную систему отображения и анализирует некоторые стандартные аргументы командной строки. инициализацию gtk+ выполняет функция gtk_init(). gtk_init() прекращает работу если поступило сообщение об ошибке; чтобы это избежать, используйте gtk_init_check(). gtk_init_check() позволяет восстановить неудавшуюся инициализацию gtk+ - вместо этого вы можете запустить ваше приложение в текстовом режиме. как и все наборы инструментов gui, gtk+ использует управляемую событиями модель программирования. когда пользователь ничего не делает, gtk+ находится в основном цикле (main loop) и ждет ввода. если пользователь произвёл некоторое действие – скажем, нажал кнопку мыши – то в основной цикл gtk+ поступает событие и он просыпается "wakes up". gtk+ пересылает событие к одному или нескольким виджетам. когда виджеты получают событие, они часто производят один или несколько сигналов (signals), сигналы сообщают вашей программе что "случилось нечто интересное", вызывая функции подключенные вами к сигналам с помощью g_signal_connect(). функции подключенные к сигналам часто называются callback-функция или функция обратного вызова (callbacks). когда ваши callback-функции вызваны, вы обычно предпринимаете некоторое действие - например, когда нажата кнопка open вы могли бы отобразить gtkfileselectiondialog. после завершения обратного вызова, gtk+ возвращается в основной цикл для ожидания дальнейших действий пользователя. пример 1. типичная main функция для gtk+ приложения int main (int argc, char **argv) { /* инициализируем поддержку i18n */ gtk_set_locale (); /* инициализируем установки виджета */ gtk_init (&argc, &argv); /* создаём основное окно */ mainwin = gtk_window_new (gtk_window_toplevel); /* устанавливаем наши элементы gui */ ... /* показываем окно приложения */ gtk_widget_show_all (mainwin); /* входим в основной цикл и ждем действий пользователя */ gtk_main (); /* пользователь утратил интерес */ return 0; } можно использовать непосредственно основной цикл glib вместо gtk_main(), хотя это требует немного большего ввода. смотрите gmainloop в документации по glib. деталиgtk_set_locale ()gchar* gtk_set_locale (void); инициализирует поддержку интернационализации для gtk+. gtk_init() автоматически выполняет это, поэтому обычно нет смысла в вызове этой функции. если вы вызвали эту функцию для изменения языковой среды после инициализации gtk+, то она вам немного поможет. (однако отметьте, что изменения языковой среды после инициализации gtk+ может привести к непредсказуемым результатам и реально не поддерживается.) подробности – установка текущемй языковой среды согласно окруженияя программы, это тоже самое как вызов библиотечной функции c setlocale (lc_all, "") , но также заботится об определенных установках языковой среды оконной системы использующей gdk.
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+ слева на право или наоборот. смотрите _gtk_get_lc_ctype() для примечаний относительно поведения в windows.
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_init ()void gtk_init (int *argc, char ***argv); эта функция вызывается перед любыми другими функциями gtk+ в вашей программе. она инициализирует всё что нужно для управления и анализирует некоторые стандартные аргументы командной строки. argc и argv откорректированы соответствующим образом, поэтому ваш собственный код никогда не увидит стандартных аргументов. помните, есть некоторые альтернативные пути инициализации gtk+: если вы вызовите gtk_parse_args(), gtk_init_check(), gtk_init_with_args() или g_option_context_parse() с группой опций возвращённых gtk_get_option_group(), вы не должны вызывать gtk_init(). напоминаниеэта функция закроет вашу программу если она не сможет инициализировать gui по некоторым причинам. если вы хотите чтобы ваша программа переходила в текстовый режим вместо закрытия, вы должны использовать gtk_init_check(). напоминание
gtk_init_check ()gboolean gtk_init_check (int *argc, char ***argv); эта функция выполняет ту же работу что и gtk_init() с одним отличием: она не закрывает программу если gui не смог инициализироваться. вместо этого она возвращает false во время сбоя. этот способ позволяет приложению перейти к некоторым другим методам общения с пользователем - например интерфейс командной строки.
gtk_init_with_args ()gboolean gtk_init_with_args (int *argc, char ***argv, char *parameter_string, goptionentry *entries, char *translation_domain, gerror **error); эта функция выполняет туже самую работу что и gtk_init_check(). дополнительно, она позволяет вам добавлять ваши аргументы командной строки, а также автоматически создаёт хороший формат вывода опции --help. заметьте что ваша программа будет закрыта после вывода помощи.
начиная с версии 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() для анализа ваших аргументов командной строки.
начиная с версии 2.6 gtk_exit ()void gtk_exit (gint error_code); вниманиеgtk_exit устарела и не нужно её использовать во вновь создаваемом коде. вместо неё используйте стандартную функцию exit(). закрывает программу и возвращает полученный при выходе код. эта функция полностью выключает gui и освобождает ресурсы выделенные для gtk+.
gtk_events_pending ()gboolean gtk_events_pending (void); проверяет есть ли какие-нибудь события на рассмотрении. это может быть использовано для обновления gui и вызова паузы и т.д., при выполнении иногда интенсивных вычислений. пример 2. обновление gui в течении длительного вычисления. /* выполняются вычисления */ ... while (gtk_events_pending ()) gtk_main_iteration (); ... /* вычисления продолжаются */
gtk_main ()void gtk_main (void); выполняется основной цикл, пока не вызовется gtk_main_quit(). вы можете вложить вызов в gtk_main(). в этом случае gtk_main_quit() будет сделан самым глубоким запросом по уровню вложенности возвращаемым из основного цикла. gtk_main_level ()guint gtk_main_level (void); запрашивает текущий уровень вложенности в основном цикле. это может быть полезным когда вызывается gtk_quit_add().
gtk_main_quit ()void gtk_main_quit (void); делает самый глубокий запрос возвращённый из основного цикла, когда получает контроль. gtk_main_iteration ()gboolean gtk_main_iteration (void); выполняет единственную итерацию mainloop. если нет событий ожидающих обработки, gtk+ будет блокирован пока не произойдет следующее событие. если вы не хотите блокировать, то смотрите gtk_main_iteration_do() или сначала проверяйте какие события находятся на рассмотрении с помощью gtk_events_pending().
gtk_main_iteration_do ()gboolean gtk_main_iteration_do (gboolean blocking); выполняет единственную итерацию mainloop. если нет любых доступных событий возвращения или блокирования зависящего от значения blocking.
gtk_main_do_event ()void gtk_main_do_event (gdkevent *event); обрабатывает единственное событие gdk. это позволяет фильтровать события между gdk и gtk+. вы не будете нуждаться в непосредственном вызове этой функции. хотя вы не должны непосредственно вызывать эту функцию, вы можете узнать, как точно были обработаны события. вот то, что эта функция делает с событием:
gtkmoduleinitfunc ()void (*gtkmoduleinitfunc) (gint *argc, gchar ***argv); каждый модуль gtk+ должен иметь функцию gtk_module_init() с этим прототипом. эта функция вызывается после загрузки модулей очищенных argc и argv от любых параметров, которые gtk+ обрабатывает самостоятельно.
gtkmoduledisplayinitfunc ()void (*gtkmoduledisplayinitfunc) (gdkdisplay *display);
начиная с версии 2.2 gtk_true ()gboolean gtk_true (void); эта функция всегда возвращает true. это может пригодиться например, если вы захотите запретить удаление окна. конечно не нужно делать этого на самом деле, потому что пользователь ожидает реакции окна при нажатии кнопки закрытия... пример 3.не закрывающееся окно #include <gtk/gtk.h> int main (int argc, char **argv) { gtkwidget *win, *but; gtk_init( &argc, &argv ); win = gtk_window_new (gtk_window_toplevel); g_signal_connect (win, "delete-event", g_callback (gtk_true), null); g_signal_connect (win, "destroy", g_callback (gtk_main_quit), null); but = gtk_button_new_with_label ("close yourself. i mean it!"); g_signal_connect_swapped (but, "clicked", g_callback (gtk_object_destroy), win); gtk_container_add (gtk_container (win), but); gtk_widget_show_all (win); gtk_main (); return 0; }
gtk_false ()gboolean gtk_false (void); аналог gtk_true(), но эта функция всегда возвращает false.
gtk_grab_add ()void gtk_grab_add (gtkwidget *widget); создаёт widget, текущий перехваченный виджет. это означает, что все остальные виджеты данного приложения блокированы и события мыши с клавиатурой принадлежат этому виджету.
gtk_grab_get_current ()gtkwidget* gtk_grab_get_current (void); запрашивает текущую перехваченную по умолчанию группу окна.
gtk_grab_remove ()void gtk_grab_remove (gtkwidget *widget); удаляет захват данного виджета. вы имеете спаренные вызовы gtk_grab_add() и gtk_grab_remove().
gtk_init_add ()void gtk_init_add (gtkfunction function, gpointer data); регистрирует функцию вызванную при запуске основного цикла (mainloop).
gtk_quit_add_destroy ()void gtk_quit_add_destroy (guint main_level, gtkobject *object); более аккуратное разрушение object в этом случае выход из основного цикла происходит на уровне main_level.
gtk_quit_add ()guint gtk_quit_add (guint main_level, gtkfunction function, gpointer data); регистрирует функцию которая будет вызвана когда потребуется оставить основной цикл.
gtk_quit_add_full ()guint gtk_quit_add_full (guint main_level, gtkfunction function, gtkcallbackmarshal marshal, gpointer data, gtkdestroynotify destroy); регистрирует функцию которая будет вызвана когда потребуется оставить основной цикл. по сравнению с gtk_quit_add() эта функция добавляет возможность помещать сигнальщик (marshaller) и функцию, которая будет вызвана, когда освободится обработчик выхода. предыдущая может использовать интерпретируемый код вместо скомпилированной функции, в то время как последняя может использовать свободную информацию сохраненную в data (также вы можете сделать это в function)... таким образом эта функция по большей части нужна для использования gtk+ оболочкой для языков отличающихся от c.
gtk_quit_remove ()void gtk_quit_remove (guint quit_handler_id); удаляет обработчик выхода с помощью идентификатора.
gtk_quit_remove_by_data ()void gtk_quit_remove_by_data (gpointer data); удаляет обработчик выхода идентифицируемый полем data.
gtk_timeout_add_full ()guint gtk_timeout_add_full (guint32 interval, gtkfunction function, gtkcallbackmarshal marshal, gpointer data, gtkdestroynotify destroy); вниманиеgtk_timeout_add_full устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_timeout_add_full(). регистрирует периодически вызываемую функцию. функция будет неоднократно вызываться с интервалом interval миллисекунд, пока не возвратится false, в этом месте перерыв будет уничтожен и не будет больше вызываться.
gtk_timeout_add ()guint gtk_timeout_add (guint32 interval, gtkfunction function, gpointer data); вниманиеgtk_timeout_add устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_timeout_add(). регистрирует периодически вызываемую функцию. функция будет неоднократно вызываться с интервалом interval миллисекунд, пока не возвратится false, в этом месте перерыв будет уничтожен и не будет больше вызываться.
gtk_timeout_remove ()void gtk_timeout_remove (guint timeout_handler_id); вниманиеgtk_timeout_remove устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_source_remove(). удаляет при разрушении паузы всю полученную информацию.
gtk_idle_add ()guint gtk_idle_add (gtkfunction function, gpointer data); вниманиеgtk_idle_add устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_idle_add() . заставляет основной цикл вызывать данную функцию, когда нет никаких процессов для обработки, с более высоким приоритетом. по умолчанию приоритет gtk_priority_default, довольно низкий.
gtk_idle_add_priority ()guint gtk_idle_add_priority (gint priority, gtkfunction function, gpointer data); вниманиеgtk_idle_add_priority устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_idle_add_full() . как и gtk_idle_add() эта функция позволяет вызывать функцию когда в основном цикле ничего не происходит. различие в том, что вы можете присвоить приоритет отличный от gtk_priority_default пустой функции.
gtk_idle_add_full ()guint gtk_idle_add_full (gint priority, gtkfunction function, gtkcallbackmarshal marshal, gpointer data, gtkdestroynotify destroy); вниманиеgtk_idle_add_full устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_idle_add_full() . как и gtk_idle_add() эта функция позволяет вызывать функцию когда в основном цикле ничего не происходит. различие в том, что вы можете присвоить приоритет отличный от gtk_priority_default пустой функции.
gtk_idle_remove ()void gtk_idle_remove (guint idle_handler_id); вниманиеgtk_idle_remove устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_source_remove() . удаляет пустую функцию сданным id.
gtk_idle_remove_by_data ()void gtk_idle_remove_by_data (gpointer data); вниманиеgtk_idle_remove_by_data устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_idle_remove_by_data(). удаляет пустую функцию идентифицированную пользовательскими данными.
gtk_input_add_full ()guint gtk_input_add_full (gint source, gdkinputcondition condition, gdkinputfunction function, gtkcallbackmarshal marshal, gpointer data, gtkdestroynotify destroy); вниманиеgtk_input_add_full устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_io_add_watch_full(). регистрирует функцию, которая будет вызвана когда условие в дескрипторе файла станет истинным.
gtk_input_remove ()void gtk_input_remove (guint input_handler_id); вниманиеgtk_input_remove устарела и не должна использоваться во вновь создаваемом коде, вместо неё используйте g_source_remove(). удаляет функцию с данным id.
gtk_priority_redraw#define gtk_priority_redraw (g_priority_high_idle + 20) вниманиеgtk_priority_redraw устарел и не должен использоваться во вновь создаваемом коде. используется для перерисовки связанного материала. это используется внутри gtk+, чтобы выполнить незаконченные перерисовки. этот приоритет ниже чем gtk_priority_resize, чтобы избежать перерисовки перед изменением размера виджета (потому что это дублирующая перерисовка). предупреждениеэтот макрос устарел. вы должны использовать вместо него gdk_priority_redraw. gtk_priority_resize#define gtk_priority_resize (g_priority_high_idle + 10) используйте этот приоритет для изменения размера связанного материала. он используется внутри gtk+ для расчета размеров виджетов. этот приоритет больше чем gtk_priority_redraw, чтобы избежать изменения размера виджета который был только перерисован. gtk_priority_high#define gtk_priority_high g_priority_high вниманиеgtk_priority_high устарел и не должен использоваться во вновь создаваемом коде. используется для большего приоритета паузы. этот приоритет ни когда не используется внутри gtk+, поэтому все выполняющееся с этим приоритетом будет выполняться прежде, чем что-нибудь внутри инструментария. предупреждениеэтот макрос устарел. вы должны использовать вместо него g_priority_high. gtk_priority_internal#define gtk_priority_internal gtk_priority_redraw вниманиеgtk_priority_internal устарел и не должен использоваться во вновь создаваемом коде. этот приоритет для внутреннего использования gtk+. не используйте в ваших приложениях. gtk_priority_default#define gtk_priority_default g_priority_default_idle вниманиеgtk_priority_default устарел и не должен использоваться во вновь создаваемом коде. приоритет по умолчанию для пустой функции. предупреждениеэтот макрос устарел. вы должны использовать вместо него g_priority_default_idle. gtk_priority_low#define gtk_priority_low g_priority_low вниманиеgtk_priority_low устарел и не должен использоваться во вновь создаваемом коде. приоритет для очень не значительных задач. предупреждениеэтот макрос устарел. вы должны использовать вместо него g_priority_low. gtk_key_snooper_install ()guint gtk_key_snooper_install (gtkkeysnoopfunc snooper, gpointer func_data); устанавливает ключевую функцию слежения, к которой будут обращаться все вызванные ключевые события перед обычной доставкой.
gtkkeysnoopfunc ()gint (*gtkkeysnoopfunc) (gtkwidget *grab_widget, gdkeventkey *event, gpointer func_data); ключевая функция слежения вызываемая после обычной доставки события. они могут использоваться для осуществления специальной обработки ключевого события.
gtk_key_snooper_remove ()void gtk_key_snooper_remove (guint snooper_handler_id); удаляет ключевую функцию слежения используя полученный id.
gtk_get_current_event ()gdkevent* gtk_get_current_event (void); получает копию события обрабатываемого в текущий момент gtk+. например, если вы получите "clicked" сигнал от gtkbutton, то текущеме событие будет gdkeventbutton, которым управляет "clicked" сигнал. возвращаемое событие может быть освобождено функцией gdk_event_free(). если нет текущемго события, функция возвращает null.
gtk_get_current_event_time ()guint32 gtk_get_current_event_time (void); если есть текущеме событие имеющее метку временем (timestamp), возвращает эту метку, иначе возвращает gdk_current_time.
gtk_get_current_event_state ()gboolean gtk_get_current_event_state (gdkmodifiertype *state); если есть текущеме событие имеющее поле статуса (state), помещает это поле статуса в state и возвращает true, иначе возвращает false.
gtk_get_event_widget ()gtkwidget* gtk_get_event_widget (gdkevent *event); если event равен null или событие не связанно ни с одним виджетом, возвращает 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() функция самого низкого уровня (lowest-level); она просто издаёт "event" и возможно event-специфичный сигнал на виджете. gtk_propagate_event() немного более высокого уровня (higher-level) и gtk_main_do_event() самого высокого уровня. вы наиболее вероятно не захотите использовать упомянутые функции; синтезирование событий редко необходимо. посмотрите списки рассылки для выяснения лучших способов, как добиться вашей цели. например, используйте gdk_window_invalidate_rect() или gtk_widget_queue_draw() вместо экспонирования событий.
смотрите такжесмотрите руководство glib, особенно gmainloop и сигнал-связанные функции, такие как g_signal_connect(). |