краткое описание#include <gtk/gtk.h> #define gtk_signal_offset enum gtksignalruntype; guint gtk_signal_new (const gchar *name, gtksignalruntype signal_flags, gtktype object_type, guint function_offset, gtksignalmarshaller marshaller, gtktype return_val, guint n_args, ...); guint gtk_signal_newv (const gchar *name, gtksignalruntype signal_flags, gtktype object_type, guint function_offset, gtksignalmarshaller marshaller, gtktype return_val, guint n_args, gtktype *args); #define gtk_signal_lookup (name,object_type) #define gtk_signal_name (signal_id) void gtk_signal_emit (gtkobject *object, guint signal_id, ...); void gtk_signal_emit_by_name (gtkobject *object, const gchar *name, ...); void gtk_signal_emitv (gtkobject *object, guint signal_id, gtkarg *args); void gtk_signal_emitv_by_name (gtkobject *object, const gchar *name, gtkarg *args); #define gtk_signal_emit_stop (object,signal_id) void gtk_signal_emit_stop_by_name (gtkobject *object, const gchar *name); #define gtk_signal_connect (object,name,func,func_data) #define gtk_signal_connect_after (object,name,func,func_data) #define gtk_signal_connect_object (object,name,func,slot_object) #define gtk_signal_connect_object_after (object,name,func,slot_object) gulong gtk_signal_connect_full (gtkobject *object, const gchar *name, gtksignalfunc func, gtkcallbackmarshal unsupported, gpointer data, gtkdestroynotify destroy_func, gint object_signal, gint after); void gtk_signal_connect_while_alive (gtkobject *object, const gchar *name, gtksignalfunc func, gpointer func_data, gtkobject *alive_object); void gtk_signal_connect_object_while_alive (gtkobject *object, const gchar *name, gtksignalfunc func, gtkobject *alive_object); #define gtk_signal_disconnect (object,handler_id) #define gtk_signal_disconnect_by_func (object,func,data) #define gtk_signal_disconnect_by_data (object,data) #define gtk_signal_handler_block (object,handler_id) #define gtk_signal_handler_block_by_func(object,func,data) #define gtk_signal_handler_block_by_data(object,data) #define gtk_signal_handler_unblock (object,handler_id) #define gtk_signal_handler_unblock_by_func(object,func,data) #define gtk_signal_handler_unblock_by_data(object,data) #define gtk_signal_handler_pending (object,signal_id,may_be_blocked) #define gtk_signal_handler_pending_by_func(object,signal_id,may_be_blocked,func,data) #define gtk_signal_default_marshaller описаниесистема сигналов gtk+ просто уполномоченная система сигналов glib. в будущем используйте напрямую gsignal api, это помогает избежать значительных проблем, где структуры gtkarg должны быть преобразованы в gvalues. что является сигналами?сигналы являются методом получения сообщений когда что-нибудь происходит и настройки поведения объектов, при условии, что это нужно пользователю. все signal однозначно идентифицируются по имени, "class_name::signal_name", где signal_name может быть чем то вроде "clicked" и class_name может быть "gtkbutton". помните, некоторые другие классы могут также определить обратный вызов "clicked", пока это не произойдёт из gtkbutton. при создании сигналам назначается уникальное положительное число - идентификатор (1 – первый сигнал id- 0 используется для отметки ошибок). каждый сигнал привязан к массиву типов, который описывает прототипы указателей функций (обработчики), которые вы можете соединять с сигналом. наконец, каждый сигнал имеет обработчик по умолчанию, который даётся указателем функции в структуре его класса: выполняется по умолчанию всякий раз, когда произведён сигнал. (возможно обработчик назначенный пользователем будет препятствовать обработчику по умолчанию, когда произойдёт сигнал.) сигналы используются всюду, но они создаются только на основании класса – поэтому вы не должны вызывать gtk_signal_new(), если вы не пишите новый тип gtkobject. тем не менее, если вы хотите создать новый сигнал для существующего типа, вы можете использовать gtk_object_class_user_signal_new() для создания сигнала который не соответствует встроенным методам класса. как используются сигналы?есть два основных действия обработки сигнала. если вам нужно уведомление о событии, вы должны подключить указатель функции и указатель данных к сигналу; указатель данных будет помещён как последний аргумент функции (пока вы используете по умолчанию размещение функций). вы получите подключенный id, уникальное целое значение соответствующее этому подключению. функции, желающие уведомить пользователя об определённых действиях, издают сигналы. основная терминология
краткое замечание о том как они работают.функции транслирующие массив gtkargs к нормальной семантике вашего c компилятора, называются marshallers. они идентифицированы как gtk_marshal_return_value__parameter_list(), например c функция возвращающая gboolean и берущая gint, может быть вызвана с использованием gtk_marshal_bool__int(). не все возможные комбинации return/params допустимы, конечно если вы пишите gtkobject с параметрами, вам придётся написать marshaller. деталиgtk_signal_offset#define gtk_signal_offset gtk_struct_offset вниманиеgtk_signal_offset устарела и не должна использоваться во вновь создаваемом коде. используйте вместо него offsetof(), которая используется если существует. enum gtksignalruntypetypedef enum /*< flags >*/ { gtk_run_first = g_signal_run_first, gtk_run_last = g_signal_run_last, gtk_run_both = (gtk_run_first | gtk_run_last), gtk_run_no_recurse = g_signal_no_recurse, gtk_run_action = g_signal_action, gtk_run_no_hooks = g_signal_no_hooks } gtksignalruntype; вниманиеgtksignalruntype устарело и не должно использоваться во вновь создаваемом коде. конфигурирует процесс издания сигналов. контролирует может ли сигнал издаваться рекурсивно на объекте и выполняется ли метод по умолчанию после или перед определёнными пользователем обработчиками.
gtk_signal_new ()guint gtk_signal_new (const gchar *name, gtksignalruntype signal_flags, gtktype object_type, guint function_offset, gtksignalmarshaller marshaller, gtktype return_val, guint n_args, ...); вниманиеgtk_signal_new устарела и не должна использоваться во вновь создаваемом коде. вместо неё используйте g_signal_new(). создаётся новый тип сигнала. (это обычно делается в инициализаторе класса.)
gtk_signal_newv ()guint gtk_signal_newv (const gchar *name, gtksignalruntype signal_flags, gtktype object_type, guint function_offset, gtksignalmarshaller marshaller, gtktype return_val, guint n_args, gtktype *args); вниманиеgtk_signal_newv устарела и не должна использоваться во вновь создаваемом коде. вместо неё используйте g_signal_newv(). создает новый тип сигнала. (это обычно делается в инициализаторе класса.) эта функция берет типы как массив, вместо списка после аргументов. иначе то же самое как gtk_signal_new().
gtk_signal_lookup()#define gtk_signal_lookup(name,object_type) вниманиеgtk_signal_lookup устарела и не должна использоваться во вновь создаваемом коде. вместо неё используйте g_signal_lookup(). учитывая имя сигнала и тип объекта к которому он подключен, выдаёт целое число идентифицирующее сигнал. издание сигнала по номеру несколько быстрее чем каждый раз использовать имя. это также различает предков данного типа.
gtk_signal_name()#define gtk_signal_name(signal_id) вниманиеgtk_signal_name устарела и не должна использоваться во вновь создаваемом коде. вместо неё используйте g_signal_name(). учитывая идентификатор сигнала, определяет его имя. два разных сигнала могут иметь одно и тоже имя, если имеют разные типы.
gtk_signal_emit ()void gtk_signal_emit (gtkobject *object, guint signal_id, ...); вниманиеgtk_signal_emit устарела и не должна использоваться во вновь создаваемом коде. используйте g_signal_emit() вместо неё. издаёт сигнал. является причиной выполнения обработчика по умолчанию и определённых пользователем. вот то, что делает gtk_signal_emit(): 1. вызывает обработчик по умолчанию и подключенные пользователем обработчики. обработчик по умолчанию будет вызван первым если установлен gtk_run_first и последним, если установлен gtk_run_last. 2. вызываются все обработчики с установленным флагом "after".
gtk_signal_emit_by_name ()void gtk_signal_emit_by_name (gtkobject *object, const gchar *name, ...); вниманиеgtk_signal_emit_by_name устарела и не должна использоваться во вновь создаваемом коде. используйте g_signal_emit_by_name() вместо неё. издаёт сигнал. является причиной выполнения обработчика по умолчанию и определённых пользователем.
gtk_signal_emitv ()void gtk_signal_emitv (gtkobject *object, guint signal_id, gtkarg *args); вниманиеgtk_signal_emitv устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_emitv(). издаёт сигнал. является причиной выполнения обработчика по умолчанию и определённых пользователем. это отличается от gtk_signal_emit() тем, что берёт массив gtkargs вместо использования механизма c's varargs.
gtk_signal_emitv_by_name ()void gtk_signal_emitv_by_name (gtkobject *object, const gchar *name, gtkarg *args); вниманиеgtk_signal_emitv_by_name устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_emitv() и g_signal_lookup(). издаёт сигнал. является причиной выполнения обработчика по умолчанию и определённых пользователем. это отличается от gtk_signal_emit() тем, что берёт массив gtkargs вместо использования механизма c's varargs.
gtk_signal_emit_stop()#define gtk_signal_emit_stop(object,signal_id) вниманиеgtk_signal_emit_stop устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_stop_emission(). эта функция завершает текущую эмиссию сигнала. она препятствует выполнению метода по умолчанию, если сигнал был gtk_run_last и вы подключались к нему обычным образом (например без флага "after"). функция напечатает предупреждение, если используется для сигнала, который не издавался.
gtk_signal_emit_stop_by_name ()void gtk_signal_emit_stop_by_name (gtkobject *object, const gchar *name); вниманиеgtk_signal_emit_stop_by_name устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_stop_emission_by_name(). эта функция завершает текущую эмиссию сигнала. то же самое, что и gtk_signal_emit_stop(), но дополнительно будет найден идентификатор сигнала для вас.
gtk_signal_connect()#define gtk_signal_connect(object,name,func,func_data) вниманиеgtk_signal_connect устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_connect(). прикрепляет указатель функции и пользовательские данные к сигналу для специального объекта. gtksignalfunction берёт gtkobject как первый параметр. это будет тот же объект к которому вы подключаете обработчик прерываний. func_data будут помещены как последний параметр обработчика прерываний. все остальные равные обработчики сигнала вызываются в порядке подключения (смотрите gtk_signal_emit() о других деталях, что и в каком порядке вызывается). вот то, как передаётся целочисленное как пользовательские данные, когда вы просто хотите определить константу int как параметр вашей функции: static void button_clicked_int (gtkbutton* button, gpointer func_data) { g_print ("button pressed: %d\n", gpointer_to_int (func_data)); } /* вызвав эту функцию, вы создаёте g_print выполненный выше * печатающий число помещённое как `to_print'. */ static void attach_print_signal (gtkbutton* button, gint to_print) { gtk_signal_connect (gtk_object (button), "clicked", gtk_signal_func (button_clicked_int), gint_to_pointer (to_print)); }
gtk_signal_connect_after()#define gtk_signal_connect_after(object,name,func,func_data) вниманиеgtk_signal_connect_after устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_connect_after(). прикрепляет указатель функции и пользовательские данные к сигналу, так, чтобы этот обработчик был вызван после других обработчиков.
gtk_signal_connect_object()#define gtk_signal_connect_object(object,name,func,slot_object) вниманиеgtk_signal_connect_object устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_connect_swapped(). эта функция для регистрации обратного вызова который вызовет другой объект обратного вызова. таким образом, вместо передачи объекта, который отвечает за событие, как первого параметра обратного вызова, она переключает пользовательские данные (таким образом объект который издал сигнал будет последним параметром, где обычно находятся пользовательские данные). это полезно для размещения обычной функции как обратного вызова (callback-функции). например, если вам нужен некоторый виджет, например нажимаемая кнопка, созданный с помощью gtk_widget_show(), вы должны написать: gtk_signal_connect_object (button, "clicked", gtk_widget_show, window);
gtk_signal_connect_object_after()#define gtk_signal_connect_object_after(object,name,func,slot_object) вниманиеgtk_signal_connect_object_after устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_connect_data(), помещая g_connect_after|g_connect_swapped как connect_flags. прикрепляет обработчик прерываний к сигналу, помещая в альтернативном объекте как первый параметр и гарантируя сто обработчик по умолчанию и все нормальные обработчики будут вызваны первыми.
gtk_signal_connect_full ()gulong gtk_signal_connect_full (gtkobject *object, const gchar *name, gtksignalfunc func, gtkcallbackmarshal unsupported, gpointer data, gtkdestroynotify destroy_func, gint object_signal, gint after); вниманиеgtk_signal_connect_full устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_connect_data(). прикрепляет указатель функции и пользовательские данные к сигналу с большим управлением.
gtk_signal_connect_while_alive ()void gtk_signal_connect_while_alive (gtkobject *object, const gchar *name, gtksignalfunc func, gpointer func_data, gtkobject *alive_object); вниманиеgtk_signal_connect_while_alive устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_connect_object(). прикрепляет указатель функции и другой gtkobject к сигналу. эта функция берёт объект, сигнал "destroy" которого должен быть заменён. таким путём не стоит очищать обработчик сигнала когда вы закрываете объект, это слишком не эффективно. (вместо этого вы можете вызвать gtk_signal_disconnect_by_data(), если вы хотите явно удалить все прикрепления к объекту. это возможно не рекомендуется так как указатель может быть перепутан с целочисленным (из-за gint_to_pointer()).)
gtk_signal_connect_object_while_alive ()void gtk_signal_connect_object_while_alive (gtkobject *object, const gchar *name, gtksignalfunc func, gtkobject *alive_object); вниманиеgtk_signal_connect_object_while_alive устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_connect_object(), помещая g_connect_swapped как connect_flags. эти подключатели сигналов для сигналов, которые относятся к объектам, поэтому их нельзя вызвать после удаления объекта. в отличии от gtk_signal_connect_while_alive(), это меняет объект и пользовательские данные, делая подходящим для использования в функциях которые прежде всего работают с пользовательскими данными. действие этих функций точно такое же как gtk_signal_connect_object(), за исключением поглощения сигнала "destroy" препятствующего очищению обработчика.
gtk_signal_disconnect()#define gtk_signal_disconnect(object,handler_id) вниманиеgtk_signal_disconnect устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handler_disconnect(). уничтожает определённое пользователем подключение обработчика.
gtk_signal_disconnect_by_func()#define gtk_signal_disconnect_by_func(object,func,data) вниманиеgtk_signal_disconnect_by_func устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handlers_disconnect_by_func(). уничтожает все подключения для специального объекта, с полученными указателем функции (function-pointer) и пользовательскими данными (user-data).
gtk_signal_disconnect_by_data()#define gtk_signal_disconnect_by_data(object,data) вниманиеgtk_signal_disconnect_by_data устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handlers_disconnect_matched(). уничтожает все подключения для специального объекта, с полученными данными пользователя.
gtk_signal_handler_block()#define gtk_signal_handler_block(object,handler_id) вниманиеgtk_signal_handler_block устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handler_block(). препятствует вызову определённого пользователем обработчика. все другие процессы сигнала выполняются как обычно, но этот специальный обработчик будет игнорирован.
gtk_signal_handler_block_by_func()#define gtk_signal_handler_block_by_func(object,func,data) вниманиеgtk_signal_handler_block_by_func устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handlers_block_by_func(). препятствует вызову определённого пользователем обработчика, в отношении определённого пользователем обработчика указателя функций и пользовательских данных. (это может привести к многократным блокировкам обработчиков прерываний, если вы часто вызываете подключение.)
gtk_signal_handler_block_by_data()#define gtk_signal_handler_block_by_data(object,data) вниманиеgtk_signal_handler_block_by_data устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handlers_block_matched(). препятствует вызову всех определённых пользователем обработчиков с определёнными данными пользователя.
gtk_signal_handler_unblock()#define gtk_signal_handler_unblock(object,handler_id) вниманиеgtk_signal_handler_unblock устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handler_unblock(). уничтожает блокировку, по идентификатору соединения. помните, отмена блокировки не обязательно делает обработчик прерываний вызываемым, потому что если вы блокировали его дважды, вы должны его дважды разблокировать.
gtk_signal_handler_unblock_by_func()#define gtk_signal_handler_unblock_by_func(object,func,data) вниманиеgtk_signal_handler_unblock_by_func устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handlers_unblock_by_func(). уничтожает блокировку, по указателю функции и данным. помните, отмена блокировки не обязательно делает обработчик прерываний вызываемым, потому что если вы блокировали его дважды, вы должны его дважды разблокировать.
gtk_signal_handler_unblock_by_data()#define gtk_signal_handler_unblock_by_data(object,data) вниманиеgtk_signal_handler_unblock_by_data устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_handlers_unblock_matched(). уничтожает блокировку всех сигналов для специального объекта со специальным указателем пользовательских данных.
gtk_signal_handler_pending()#define gtk_signal_handler_pending(object,signal_id,may_be_blocked) вниманиеgtk_signal_handler_pending устарела и не должна использоваться во вновь создаваемом коде. используйте вместо неё g_signal_has_handler_pending(). возвращает идентификатор подключения соответствующий полученному идентификатору сигнала и объекта. один из примеров применения этого – ситуация когда трудно вычислить параметры сигнала. конструктор класса может выбрать не издавать сигнал если нет не одного какого нибудь подключения, таким образом сохраняя оценку формирования параметров.
gtk_signal_handler_pending_by_func()#define gtk_signal_handler_pending_by_func(object,signal_id,may_be_blocked,func,data) вниманиеgtk_signal_handler_pending_by_func устарела и не должна использоваться во вновь создаваемом коде. возвращает идентификатор подключения соответствующий полученному идентификатору сигнала, объекта, указателя функции и пользовательским данным.
gtk_signal_default_marshaller#define gtk_signal_default_marshaller g_cclosure_marshal_void__void вниманиеgtk_signal_default_marshaller устарела и не должна использоваться во вновь создаваемом коде. сигнальщик (marshaller) который возвращает пустое значение (void) и не берет дополнительных параметров. смотрите также
|