Для получения ресурсов приложения из базы данных, в 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); |
Здесь первый аргумент - тип указателя, специфицирующего структуру данных пользователя, второй аргумент - имя устанавливаемого ресурса (поле) в данной структуре.
| |
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |