3.4.3. Получение ресурсов программы.

    Для получения ресурсов приложения из базы данных, в Xt предусмотрена процедура

void XtGetApplicationResources (Widget, prWidget,
    XtPointer pBase, XtResourseList prResources,
    Cardinal nItem, ArgList prArgs, Cardinal nArgs);

    Здесь prWidget задает некоторый объект приложения. По нему определяется имя и класс программы. Второй аргумент - это адрес области памяти, где будут размещены получаемые значения ресурсов. Третий и четвертый аргументы задают массив и число структур типа XtResource, определяющих нужные ресурсы. Последние аргументы prArgs и nArgs используются для того, чтобы запретить модификацию некоторых ресурсов пользователем. Если ресурс присутствует в базе данных программы и в списке prArgs, то его значение берется из списка.

    Структура XtResource имеет следующее определение:

typedef struct  {
     String      resource_name; 
     String      resource_class;
     String      resource_type;
     Cardinal  resource_size;
     Cardinal  resource_offset;
     String      default_type;
     XtPointer default_addr;
}  XtResource,  *XtResourceList;

    Здесь

resource_name - Имя ресурса. Где это возможно, для указания имени ресурса следует использовать константы, определенные в файле "StringDefs.h". Например XtNforeground, XtNbackground и т.д.
resource_class - Задает класс ресурса. Для многих классов его имя совпадает с именем ресурса, за исключением того, что используется префикс "XtC", и первая буква имени класса - заглавная (например для ресурса XtNforeground соответствующий класс XtCForeground).
resource_type - Определяет тип ресурса. Можно задавать произвольный тип данных, включая и любой тип, определенный программой. Определения общих типов ресурсов даны в файле "StringDefs.h". Для удобства тип ресурса состоит из имени с префиксом "XtR". Если в системе зарегистрирована соответствующая процедура-конвертор (см. ниже 3.4.4.), то при вызове XtGetApplicationResources( ) Xt преобразует значение ресурса из базы данных (строку) к типу, задаваемому полем resource_type.
resource_size - Задает размер ресурса в байтах.
resource_offset - Определяет смещение от адреса, задаваемого параметром pBase процедуры XtGetApplicationResources( ), начиная с которого размещается значение ресурса, "вынимаемое" из базы данных.
default_type - Задает для ресурса тип значения, принимаемый по умолчанию.
default_addr - Задает (или указывает на) значения ресурса по умолчанию. Оно используется Xt, если на ресурс нет ссылок в базе данных программы.

    В Xt предусмотрены два специальных типа ресурсов, которые используют только значения по умолчанию, задаваемые полями default_type и default_addr. Первый - XtRImmediate, который указывает, что значение ресурса не надо искать в базе, поскольку оно определяется непосредственно полем default_addr. Второй - XtRCallProc, который указывает, что значение, заданное в поле default_addr, это указатель на процедуру, которая возвращает значение ресурса. Эта функция должна иметь прототип:

void ResourceDefaultProc (Widget prWidget,
    int nOffset, XrmValue *prValue);

    Здесь prWidget задает объект, ресурс которого должен быть получен. nOffset задает местоположение ресурса в структуре widget. prValue определяет адрес для сохранения полученного значения. Xt автоматически определяет нужные параметры и вызывает данную процедуру, сохраняя в prValue полученное значение.

    В следующей таблице приведены основные типы ресурсов, принятые в Xt, соответствующие им типы данных и/или пояснения.
Тип ресурса Тип данных
XtRAcceleratorTable XtRAccelerators ("таблица" акселератов)
XtRAtom Atom
XtRBitmap Pixmap
XtRBoolean Boolean
XtRBool Bool
XtRCallback XtCallbackList (список callback-процедур)
XtRCallProc - - - " - - -
XtRCardinal Cardinal
XtRColor XColor
XtRColormap Colormap
XtRCursor Cursor
XtRDimension Dimension
XtRDisplay Display
XtREnum XtEnum
XtRFile File *
XtRFloat float
XtRFont Font
XtRFontStruct XFontStruct *
XtRFunction (*) ( )
XtRGeometry String
XtRImmediate см. выше
XtRInitialState int
XtRInt int
XtRLongBoolean long
XtRObject Object
XtRPixel Pixel
XtRPixmap Pixmap
XtRPointer XtPointer
XtRPosition Position
XtRScreen Screen *
XtRShort short
XtRString char *
XtRStringArray String *
XtRStringTable char **
XtRTranslationTable XtRTranslations ("таблица соответствия")
XtRUnsignedChar unsigned char
XtRVisual Visual *
XtRWidget Widget
XtRWidgetClass WidgetClass
XtRWidgetList WidgetList
XtRWindow Window

    Ниже приводится пример использования описанного выше механизма получения ресурсов приложения.

#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>

typedef  struct
      Pixel      pColor;
      int          nLine;
      Boolean  bFlag;
} trAppData, *prAppData;

static XtResource prResources[ ] = {
   { XtNbackground, XtCBackground, XtRPixel, sizeof (Pixel),
      XtOffset (prAppData, pColor), XtRString, "Green"),
   { "line", "Line", XtRInt, sizeof (int),
      XtOffset (prAppData, nLine), XtRImmediate, (XtPointer) 20),
   { "flag", "Flag", XtRBoolean, sizeof (Boolean),
      XtOffset (prAppData, bFlag), XtRImmediate, (XtPointer) True)
} ;

void main (int argc, char **argv)
{
   Widget   topLevel, core;
   trAppData    rData;
   XtAppContext  prAppContext;

   memset (&rData, 0, sizeof (trAppData));

   topLevel = XtVaAppInitialize (&prAppContext, "Justas",
                   NULL, 0, &argc, argv, NULL, NULL);

   XtGetApplicationResources (topLevel, &rData, prResources,
                3, NULL, 0);
   printf ("background = %d, Line = %d, Flag = %d\n",
     rData.pColor, rData.nLine, rData.bFlag);

   core = XtVaCreateManagedWidget ("core", widgetClass,
             topLevel, XtNwidth, 300, XtNheight, 300, NULL);

   XtRealizeWidget (topLevel);
   XtAppMainLoop (prAppContext);
}

    В программе используется макрос XtOffset( ), который позволяет определить смещение в байтах от начала структуры до заданного поля. Определение макроса находится в файле "Intrinsic.h". Формат его выглядит следующим образом:

Cardinal XtOffset (Type type, Field field);

    Здесь первый аргумент - тип указателя, специфицирующего структуру данных пользователя, второй аргумент - имя устанавливаемого ресурса (поле) в данной структуре.