Справочное описание 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 | Портируемый механизм для динамической загрузки модулей. |