GLib
  • Initial page
  • I. Концепция
    • Background
    • Типы данных и программирование
  • Динамическая система типов Glib
    • Введение
    • Функции копирования
    • Соглашения
    • Неинстанциируемые не классифицированные базовые типы
    • Инстанциируемые классифицируемые типы: объекты
    • Неинстанциированные классифицированные типы: Интерфейсы.
  • Основной класс GObject
    • Введение
    • Инстанциация объекта
    • Объектное управление памятью
    • Свойства объекта
  • Система сообщений GObject
    • Замыкания
    • Сигналы
  • II. Описание API
    • GType
    • GTypePlugin
    • GTypeModule
    • GObject часть 1
    • GObject часть 2
    • Enums and Flags
    • GBoxed
    • Generic Values
    • Parameters and Values часть 1
    • Parameters and Values часть 2
    • Parameters and Values часть 3, ага
    • Value arrays
  • III. Описание инструментов
    • glib-mkenums
    • glib-genmarshal
    • gobject-query
  • IV. Руководство
    • Как определить и реализовать новый GObject?
    • Объектные методы
    • Как определять и реализовывать Интерфейсы?
    • Как создавать и использовать сигналы
    • Как пользователи могут злоупотреблять сигналами (и почему некоторые думают что это хорошо)
  • V. Об инструментах
    • Об инструментах
  • GTK 4
    • GtkApplication и GtkApplicationWindow
    • Widgets
Powered by GitBook
On this page
  • Краткое описание
  • Иерархия объектов
  • Реализуемые интерфейсы
  • Описание
  • Детали
  • Смотрите также

Was this helpful?

  1. II. Описание API

GTypeModule

GTypeModule — Тип загружаемых модулей

Краткое описание


#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)

Иерархия объектов


  GObject
   +----GTypeModule

Реализуемые интерфейсы

Описание

Детали

GTypeModule

typedef struct {
  gchar *name;
} GTypeModule;

Члены сструктуры GTypeModule не имеют непосредственного доступа, исключая поле name.

имя модуля

GTypeModuleClass

typedef struct {
  GObjectClass parent_class;

  gboolean (* load)   (GTypeModule *module);
  void     (* unload) (GTypeModule *module);
} GTypeModuleClass;

родительский класс

load ()

unload ()

выгружает модуль

g_type_module_use ()

gboolean            g_type_module_use                   (GTypeModule *module);

module :

Возвращает :

g_type_module_unuse ()

void                g_type_module_unuse                 (GTypeModule *module);

module :

g_type_module_set_name ()

void                g_type_module_set_name              (GTypeModule *module,
                                                         const gchar *name);

module :

name :

Удобное для чтения имя используемое в сообщениях об ошибках.

g_type_module_register_type ()

GType               g_type_module_register_type         (GTypeModule *module,
                                                         GType parent_type,
                                                         const gchar *type_name,
                                                         const GTypeInfo *type_info,
                                                         GTypeFlags flags);

Когда перерегистрируется тип (обычно потому что модуль выгружен а зтем загружен снова, и переинициализирован), module и parent_type должны быть такими же как предыдущие.

Пока любые экземпляры типа существуют, модуль типа не будет выгружен.

module :

parent_type :

тип для родительского класса

type_name :

имя для типа

type_info :

структура типовой информации

flags :

поле флажков обеспечивающих детали о типе

Возвращает :

новый или существующий ID типа

g_type_module_add_interface ()

void                g_type_module_add_interface         (GTypeModule *module,
                                                         GType instance_type,
                                                         GType interface_type,
                                                         const GInterfaceInfo *interface_info);

Регистрирует дополнительный интерфейс для типа, у которого уже есть интерфейс в данном типовом модуле. Если интерфейс уже был зарегистрирован для типа в данном модуле, ничего не происходит.

Пока существуют любые интерфейсы типа, типовой модуль не будет выгружен.

module :

instance_type :

тип к которому добавляется интерфейс.

interface_type :

интерфейсный тип для добавления

interface_info :

структура типовой информации

g_type_module_register_enum ()

GType               g_type_module_register_enum         (GTypeModule *module,
                                                         const gchar *name,
                                                         const GEnumValue *const _static_values);

Пока существуют любые экземпляры типа, типовой модуль не выгружается.

module :

name :

имя для типа

_static_values :

Возвращает :

новый или существующий ID типа

Начиная с версии 2.6

g_type_module_register_flags ()

GType               g_type_module_register_flags        (GTypeModule *module,
                                                         const gchar *name,
                                                         const GFlagsValue *const _static_values);

Пока существует любой экземпляр типа, модуль не будет выгружен.

module :

name :

имя для типа

_static_values :

Возвращает :

новый или существующий ID типа

Начиная с версии 2.6

G_DEFINE_DYNAMIC_TYPE()

#define G_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P)          G_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {})

TN :

Имя нового типа, в стиле CamelCase.

t_n :

Имя нового типа, в нижнем регистре со словами разделёнными символом '_'.

T_P :

Начиная с версии 2.14

G_DEFINE_DYNAMIC_TYPE_EXTENDED()

#define             G_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE)
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 :

flags :

CODE :

Произвольный код вставляемый в функцию *_get_type().

Начиная с версии 2.14

Смотрите также

Интерфейс загрузчика абстрактного типа.

Портируемый механизм для динамической загрузки модулей.

PreviousGTypePluginNextGObject часть 1

Last updated 4 years ago

Was this helpful?

GTypeModule реализует .

обеспечивает простую реализацию интерфейса . Моделью является динамически загружаемый модуль который реализует некоторое количество реализаций типов и интерфейсов. Когда модуль загружен, происходит регистрация его типов и интерфейсов используя и. Пока экземпляры этих типов и интерфейсов используются, модуль остаётся загруженным. Когда типы и интерфейсы больше не нужны, модуль может быть выгружен. Если типы и интерфейсы потребовались снова, модуль перезагружается. Помните что последний сброс ссылки не может произойти в коде модуля, так как это привело бы к выгрузке кода вызываемой программой прежде чем вернёт значение.

Отслеживание загружен модуль или нет выполняется счётчиком использования - начиная с нуля, всегда когда счётчик больше нуля, модуль загружен. Счётчик использования внутренне поддерживается системой типов, но так же может явно контролироваться с помощью и . Обычно когда загружается модуль для первого типа, будет использована чтобы при загрузке могли инициализироваться его типы. Немного позже, когда модуль больше не должен быть загружен кроме как для реализации типа который содержит, вызывается .

фактически не обеспечивает ни загрузки ни выгрузки модуля. Для создания специфичного модуля вы должны унаследовать и реализовать загрузку и выгрузку функций в .

*name;

Для осуществления динамической загрузки типов основанных на , функции load и unload должны быть реализованы в .

parent_class;

загружает модуль и регистрирует один тип или больше используя .

Увеличивает количество использований на единицу. Если количество использований перед этим было 0, модуль будет загружен.

если необходимая загрузка модуля неудалась.

Уменьшает количество использований на единицу. Если результатом уменьшения будет 0, модуль выгружается. (Однако, не будет освобождена, а регистрация типов связанных с не отменяется. Как только инициализирована, она будет существовать всегда).

Устанавливает имя для

.

Находит или регистрирует тип который реализуется специфичным типовым модулем. Если тип с именем type_name был предварительно зарегистрирован, возвращается идентифицирующий тип, иначе тип вновь регистрируется и возвращается результирующий идентификатор.

находит или регистрирует перечисление которое реализуется с помощью специфичного типового модуля. Если тип с именем type_name был предварительно зарегистрирован, возвращается идентификатор для типа, иначе тип вновь регистрируется и возвращается результирующий идентификатор.

Находит или регистрирует флаги типа который реализован специфичным типовым модулем. Если тип с именем type_name был предварительно зарегистрирован, возвращается идентификатор типа, иначе тип вновь регистрируется и возвращается идентификатор.

Удобный макрос для динамической реализации типа, который объявляет функцию инициализации класса, функцию инициализации экземпляра (смотрите для информации об этом) и статичную переменную с именем t_n_parent_class указывающим на родительский класс. Кроме того, он определяет *_get_type() и статичную функцию *_register_type()для использования в вашей module_init(). Смотрите для примера.

родительского типа.

Более общая версия которая позволяет определять и произвольный код.

родительского типа.

помещаемые в

GTypePlugin
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
GTypeModule
GTypeModuleClass
GTypeModule
GTypeModule
GTypeModule
GTypeModule
GTypeModule
GTypeModule
GType
GType
GType
GType
GType
GType
GTypeInfo
G_DEFINE_DYNAMIC_TYPE_EXTENDED()
G_DEFINE_DYNAMIC_TYPE()
GTypeFlags
gchar
GObjectClass
g_type_module_register_type()
GTypeModule
FALSE
GTypeModule
GTypeModule
GTypeModule
GTypeModule
GTypeModule
GTypeModule
GType
GType
GTypeFlags
g_type_register_static()
GTypePlugin
GModule