| |
Справочное описание GObject | ||||
---|---|---|---|---|
#include <glib-object.h> GTypeModule; GTypeModuleClass; gboolean g_type_module_use (GTypeModule *module); void g_type_module_unuse (GTypeModule *module); void g_type_module_set_name (GTypeModule *module, const gchar *name); GType g_type_module_register_type (GTypeModule *module, GType parent_type, const gchar *type_name, const GTypeInfo *type_info, GTypeFlags flags); void g_type_module_add_interface (GTypeModule *module, GType instance_type, GType interface_type, const GInterfaceInfo *interface_info); GType g_type_module_register_enum (GTypeModule *module, const gchar *name, const GEnumValue *const _static_values); GType g_type_module_register_flags (GTypeModule *module, const gchar *name, const GFlagsValue *const _static_values); #define G_DEFINE_DYNAMIC_TYPE (TN, t_n, T_P) #define G_DEFINE_DYNAMIC_TYPE_EXTENDED (TypeName, type_name, TYPE_PARENT, flags, CODE)
GTypeModule обеспечивает простую реализацию интерфейса
GTypePlugin.
Моделью GTypeModule является динамически загружаемый модуль
который реализует некоторое количество реализаций типов и интерфейсов. Когда модуль загружен, происходит регистрация его типов и интерфейсов
используя g_type_module_register_type()
и
g_type_module_add_interface()
.
Пока экземпляры этих типов и интерфейсов используются, модуль остаётся загруженным.
Когда типы и интерфейсы больше не нужны, модуль может быть выгружен.
Если типы и интерфейсы потребовались снова, модуль перезагружается.
Помните что последний сброс ссылки не может произойти в коде модуля,
так как это привело бы к выгрузке кода вызываемой программой прежде чем
g_object_unref()
вернёт значение.
Отслеживание загружен модуль или нет выполняется счётчиком использования - начиная с нуля,
всегда когда счётчик больше нуля, модуль загружен. Счётчик использования внутренне поддерживается системой типов,
но так же может явно контролироваться с помощью
g_type_module_use()
и
g_type_module_unuse()
.
Обычно когда загружается модуль для первого типа,
g_type_module_use()
будет использована чтобы при загрузке могли инициализироваться его типы. Немного позже, когда модуль больше не должен быть загружен
кроме как для реализации типа который содержит, вызывается g_type_module_unuse()
.
GTypeModule фактически не обеспечивает ни загрузки ни выгрузки модуля. Для создания специфичного модуля вы должны унаследовать GTypeModule и реализовать загрузку и выгрузку функций в GTypeModuleClass.
typedef struct { gchar *name; } GTypeModule;
Члены сструктуры GTypeModule не имеют непосредственного доступа, исключая поле
name
.
gchar *name ; |
имя модуля |
typedef struct { GObjectClass parent_class; gboolean (* load) (GTypeModule *module); void (* unload) (GTypeModule *module); } GTypeModuleClass;
Для осуществления динамической загрузки типов основанных на
GTypeModule,
функции load
и unload
должны быть реализованы в GTypeModuleClass.
GObjectClass parent_class ; |
родительский класс |
load () |
загружает модуль и регистрирует один тип или больше используя
g_type_module_register_type() .
|
unload () |
выгружает модуль |
gboolean g_type_module_use (GTypeModule *module);
Увеличивает количество использований GTypeModule на единицу. Если количество использований перед этим было 0, модуль будет загружен.
module : |
GTypeModule |
Возвращает : |
FALSE
если необходимая загрузка модуля неудалась.
|
void g_type_module_unuse (GTypeModule *module);
Уменьшает количество использований GTypeModule на единицу. Если результатом уменьшения будет 0, модуль выгружается. (Однако, GTypeModule не будет освобождена, а регистрация типов связанных с GTypeModule не отменяется. Как только GTypeModule инициализирована, она будет существовать всегда).
module : |
GTypeModule |
void g_type_module_set_name (GTypeModule *module, const gchar *name);
Устанавливает имя для GTypeModule
module : |
GTypeModule. |
name : |
Удобное для чтения имя используемое в сообщениях об ошибках. |
GType g_type_module_register_type (GTypeModule *module, GType parent_type, const gchar *type_name, const GTypeInfo *type_info, GTypeFlags flags);
Находит или регистрирует тип который реализуется специфичным типовым модулем. Если тип с именем
type_name
был предварительно зарегистрирован, возвращается
GType идентифицирующий тип, иначе тип вновь регистрируется и
возвращается результирующий GType идентификатор.
Когда перерегистрируется тип (обычно потому что модуль выгружен а зтем загружен снова, и переинициализирован),
module
и parent_type
должны быть такими же как предыдущие.
Пока любые экземпляры типа существуют, модуль типа не будет выгружен.
module : |
GTypeModule |
parent_type : |
тип для родительского класса |
type_name : |
имя для типа |
type_info : |
структура типовой информации |
flags : |
поле флажков обеспечивающих детали о типе |
Возвращает : | новый или существующий ID типа |
void g_type_module_add_interface (GTypeModule *module, GType instance_type, GType interface_type, const GInterfaceInfo *interface_info);
Регистрирует дополнительный интерфейс для типа, у которого уже есть интерфейс в данном типовом модуле. Если интерфейс уже был зарегистрирован для типа в данном модуле, ничего не происходит.
Пока существуют любые интерфейсы типа, типовой модуль не будет выгружен.
module : |
GTypeModule |
instance_type : |
тип к которому добавляется интерфейс. |
interface_type : |
интерфейсный тип для добавления |
interface_info : |
структура типовой информации |
GType g_type_module_register_enum (GTypeModule *module, const gchar *name, const GEnumValue *const _static_values);
находит или регистрирует перечисление которое реализуется с помощью специфичного типового модуля.
Если тип с именем type_name
был предварительно зарегистрирован,
возвращается GType идентификатор для типа, иначе тип вновь
регистрируется и возвращается результирующий GType идентификатор.
Пока существуют любые экземпляры типа, типовой модуль не выгружается.
module : |
GTypeModule |
name : |
имя для типа |
_static_values : |
|
Возвращает : | новый или существующий ID типа |
Начиная с версии 2.6
GType g_type_module_register_flags (GTypeModule *module, const gchar *name, const GFlagsValue *const _static_values);
Находит или регистрирует флаги типа который реализован специфичным типовым модулем.
Если тип с именем type_name
был предварительно зарегистрирован,
возвращается GType идентификатор типа, иначе тип вновь
регистрируется и возвращается GType идентификатор.
Пока существует любой экземпляр типа, модуль не будет выгружен.
module : |
GTypeModule |
name : |
имя для типа |
_static_values : |
|
Возвращает : | новый или существующий ID типа |
Начиная с версии 2.6
#define G_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P) G_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
Удобный макрос для динамической реализации типа, который объявляет функцию инициализации класса, функцию инициализации экземпляра
(смотрите GTypeInfo для информации об этом)
и статичную переменную с именем t_n
_parent_class указывающим на родительский класс.
Кроме того, он определяет *
и статичную функцию
_get_type()
*
для использования в вашей
_register_type()
.
Смотрите module_init()
G_DEFINE_DYNAMIC_TYPE_EXTENDED()
для примера.
TN : |
Имя нового типа, в стиле CamelCase. |
t_n : |
Имя нового типа, в нижнем регистре со словами разделёнными символом '_'. |
T_P : |
GType родительского типа. |
Начиная с версии 2.14
#define G_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE)
Более общая версия G_DEFINE_DYNAMIC_TYPE()
которая
позволяет определять GTypeFlags и произвольный код.
G_DEFINE_DYNAMIC_TYPE_EXTENDED (GtkGadget, gtk_gadget, GTK_TYPE_THING, 0, G_IMPLEMENT_INTERFACE (TYPE_GIZMO, gtk_gadget_gizmo_init));разворачивается до
static void gtk_gadget_init (GtkGadget *self); static void gtk_gadget_class_init (GtkGadgetClass *klass); static void gtk_gadget_class_finalize (GtkGadgetClass *klass); static gpointer gtk_gadget_parent_class = NULL; static GType gtk_gadget_type_id = 0; static void gtk_gadget_class_intern_init (gpointer klass) { gtk_gadget_parent_class = g_type_class_peek_parent (klass); gtk_gadget_class_init ((GtkGadgetClass*) klass); } GType gtk_gadget_get_type (void) { return gtk_gadget_type_id; } static void gtk_gadget_register_type (GTypeModule *type_module) { const GTypeInfo g_define_type_info = { sizeof (GtkGadgetClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gtk_gadget_class_intern_init, (GClassFinalizeFunc) gtk_gadget_class_finalize, NULL, /* class_data */ sizeof (GtkGadget), 0, /* n_preallocs */ (GInstanceInitFunc) gtk_gadget_init, NULL /* value_table */ }; gtk_gadget_type_id = g_type_module_register_type (type_module, GTK_TYPE_THING, GtkGadget, &g_define_type_info, (GTypeFlags) flags); { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) gtk_gadget_gizmo_init }; g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info); } }
TypeName : |
Имя нового типа, в стиле CamelCase. |
type_name : |
Имя нового типа в нижнем регистре, со словами разделёнными символом '_'. |
TYPE_PARENT : |
GType родительского типа. |
flags : |
GTypeFlags помещаемые в
g_type_register_static()
|
CODE : |
Произвольный код вставляемый в функцию *_get_type() .
|
Начиная с версии 2.14
GTypePlugin | Интерфейс загрузчика абстрактного типа. |
GModule | Портируемый механизм для динамической загрузки модулей. |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |