Sweden-Number/tools/wrc/wrctypes.h

606 lines
12 KiB
C

/*
* General type definitions
*
* Copyright 1998 Bertho A. Stultiens (BS)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __WRC_WRCTYPES_H
#define __WRC_WRCTYPES_H
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#ifndef VS_FFI_SIGNATURE
#include "winver.h"
#endif
/* Memory/load flags */
#define WRC_MO_MOVEABLE 0x0010
#define WRC_MO_PURE 0x0020
#define WRC_MO_PRELOAD 0x0040
#define WRC_MO_DISCARDABLE 0x1000
/* Resource type IDs */
#define WRC_RT_CURSOR (1)
#define WRC_RT_BITMAP (2)
#define WRC_RT_ICON (3)
#define WRC_RT_MENU (4)
#define WRC_RT_DIALOG (5)
#define WRC_RT_STRING (6)
#define WRC_RT_FONTDIR (7)
#define WRC_RT_FONT (8)
#define WRC_RT_ACCELERATOR (9)
#define WRC_RT_RCDATA (10)
#define WRC_RT_MESSAGETABLE (11)
#define WRC_RT_GROUP_CURSOR (12)
#define WRC_RT_GROUP_ICON (14)
#define WRC_RT_VERSION (16)
#define WRC_RT_DLGINCLUDE (17)
#define WRC_RT_PLUGPLAY (19)
#define WRC_RT_VXD (20)
#define WRC_RT_ANICURSOR (21)
#define WRC_RT_ANIICON (22)
#define WRC_RT_HTML (23)
#define WRC_RT_DLGINIT (240)
#define WRC_RT_TOOLBAR (241)
/* Default class type IDs */
#define CT_BUTTON 0x80
#define CT_EDIT 0x81
#define CT_STATIC 0x82
#define CT_LISTBOX 0x83
#define CT_SCROLLBAR 0x84
#define CT_COMBOBOX 0x85
#define GET_WORD(ptr) (((BYTE *)(ptr))[0] | (((BYTE *)(ptr))[1] << 8))
#define GET_DWORD(ptr) (((BYTE *)(ptr))[0] | (((BYTE *)(ptr))[1] << 8) | (((BYTE *)(ptr))[2] << 16) | (((BYTE *)(ptr))[3] << 24))
typedef struct
{
const char *file;
int line;
int col;
} location_t;
/* Resource strings are slightly more complex because they include '\0' */
enum str_e {str_char, str_unicode};
typedef struct string {
int size;
enum str_e type;
union {
char *cstr;
WCHAR *wstr;
} str;
location_t loc;
} string_t;
/* Resources are identified either by name or by number */
enum name_e {name_str, name_ord};
typedef struct name_id {
union {
string_t *s_name;
int i_name;
} name;
enum name_e type;
} name_id_t;
/* Language definitions */
typedef struct language {
int id;
int sub;
} language_t;
typedef DWORD characts_t;
typedef DWORD version_t;
typedef struct lvc {
language_t *language;
version_t *version;
characts_t *characts;
} lvc_t;
typedef struct font_id {
string_t *name;
int size;
int weight;
int italic;
} font_id_t;
/* control styles */
typedef struct style {
DWORD or_mask;
DWORD and_mask;
} style_t;
/* resource types */
/* These are in the same order (and ordinal) as the RT_xxx
* defines. This is _required_.
* I rolled my own numbers for the win32 extension that are
* documented, but generate either old RT_xxx numbers, or
* don't have an ordinal associated (user type).
* I don't know any specs for those noted such, for that matter,
* I don't even know whether they can be generated other than by
* using a user-type resource.
*/
enum res_e {
res_0 = 0,
res_cur,
res_bmp,
res_ico,
res_men,
res_dlg,
res_stt,
res_fntdir,
res_fnt,
res_acc,
res_rdt,
res_msg,
res_curg,
res_13, /* Hm, wonder why it's not used... */
res_icog,
res_15,
res_ver,
res_dlginc, /* Not implemented, no layout available */
res_18,
res_pnp, /* Not implemented, no layout available */
res_vxd, /* Not implemented, no layout available */
res_anicur,
res_aniico,
res_html, /* Not implemented, no layout available */
res_dlginit = WRC_RT_DLGINIT, /* 240 */
res_toolbar = WRC_RT_TOOLBAR, /* 241 */
res_usr = 256 + 6
};
/* Raw bytes in a row... */
typedef struct raw_data {
unsigned int size;
char *data;
lvc_t lvc; /* Localized data */
} raw_data_t;
/* Dialog structures */
typedef struct control {
struct control *next; /* List of controls */
struct control *prev;
name_id_t *ctlclass; /* ControlClass */
name_id_t *title; /* Title of control */
int id;
int x; /* Position */
int y;
int width; /* Size */
int height;
style_t *style; /* Style */
style_t *exstyle;
DWORD helpid; /* EX: */
int gotstyle; /* Used to determine whether the default */
int gotexstyle; /* styles must be set */
int gothelpid;
raw_data_t *extra; /* EX: number of extra bytes in resource */
} control_t;
typedef struct dialog {
DWORD memopt;
int x; /* Position */
int y;
int width; /* Size */
int height;
style_t *style; /* Style */
style_t *exstyle;
DWORD helpid; /* EX: */
int gotstyle; /* Used to determine whether the default */
int gotexstyle; /* styles must be set */
int gothelpid;
int is_ex;
name_id_t *menu;
name_id_t *dlgclass;
string_t *title;
font_id_t *font;
lvc_t lvc;
control_t *controls;
} dialog_t;
/* Menu structures */
typedef struct menu_item {
struct menu_item *next;
struct menu_item *prev;
struct menu_item *popup;
int id;
DWORD type;
DWORD state;
int helpid;
string_t *name;
int gotid;
int gottype;
int gotstate;
int gothelpid;
} menu_item_t;
typedef struct menu {
DWORD memopt;
lvc_t lvc;
int is_ex;
menu_item_t *items;
} menu_t;
typedef struct itemex_opt
{
int id;
DWORD type;
DWORD state;
int helpid;
int gotid;
int gottype;
int gotstate;
int gothelpid;
} itemex_opt_t;
/*
* Font resources
*/
typedef struct font {
DWORD memopt;
raw_data_t *data;
} font_t;
typedef struct fontdir {
DWORD memopt;
raw_data_t *data;
} fontdir_t;
/*
* Icon resources
*/
typedef struct icon_header {
WORD reserved; /* Don't know, should be 0 I guess */
WORD type; /* Always 1 for icons */
WORD count; /* Number of packed icons in resource */
} icon_header_t;
typedef struct icon_dir_entry {
BYTE width; /* From the SDK doc. */
BYTE height;
BYTE nclr;
BYTE reserved;
WORD planes;
WORD bits;
DWORD ressize;
DWORD offset;
} icon_dir_entry_t;
typedef struct icon {
struct icon *next;
struct icon *prev;
lvc_t lvc;
int id; /* Unique icon id within resource file */
int width; /* Field from the IconDirEntry */
int height;
int nclr;
int planes;
int bits;
raw_data_t *data;
} icon_t;
typedef struct icon_group {
DWORD memopt;
lvc_t lvc;
icon_t *iconlist;
int nicon;
} icon_group_t;
/*
* Cursor resources
*/
typedef struct cursor_header {
WORD reserved; /* Don't know, should be 0 I guess */
WORD type; /* Always 2 for cursors */
WORD count; /* Number of packed cursors in resource */
} cursor_header_t;
typedef struct cursor_dir_entry {
BYTE width; /* From the SDK doc. */
BYTE height;
BYTE nclr;
BYTE reserved;
WORD xhot;
WORD yhot;
DWORD ressize;
DWORD offset;
} cursor_dir_entry_t;
typedef struct cursor {
struct cursor *next;
struct cursor *prev;
lvc_t lvc;
int id; /* Unique icon id within resource file */
int width; /* Field from the CursorDirEntry */
int height;
int nclr;
int planes;
int bits;
int xhot;
int yhot;
raw_data_t *data;
} cursor_t;
typedef struct cursor_group {
DWORD memopt;
lvc_t lvc;
cursor_t *cursorlist;
int ncursor;
} cursor_group_t;
/*
* Animated cursors and icons
*/
typedef struct aniheader {
DWORD structsize; /* Header size (36 bytes) */
DWORD frames; /* Number of unique icons in this cursor */
DWORD steps; /* Number of blits before the animation cycles */
DWORD cx; /* reserved, must be 0? */
DWORD cy; /* reserved, must be 0? */
DWORD bitcount; /* reserved, must be 0? */
DWORD planes; /* reserved, must be 0? */
DWORD rate; /* Default rate (1/60th of a second) if "rate" not present */
DWORD flags; /* Animation flag (1==AF_ICON, although both icons and cursors set this) */
} aniheader_t;
typedef struct riff_tag {
BYTE tag[4];
DWORD size;
} riff_tag_t;
typedef struct ani_curico {
DWORD memopt;
raw_data_t *data;
} ani_curico_t;
typedef struct ani_any {
enum res_e type;
union {
ani_curico_t *ani;
cursor_group_t *curg;
icon_group_t *icog;
} u;
} ani_any_t;
/*
* Bitmaps
*/
typedef struct bitmap {
DWORD memopt;
raw_data_t *data;
} bitmap_t;
typedef struct html {
DWORD memopt;
raw_data_t *data;
} html_t;
typedef struct rcdata {
DWORD memopt;
raw_data_t *data;
} rcdata_t;
typedef struct {
DWORD memopt;
name_id_t *type;
raw_data_t *data;
} user_t;
/*
* Messagetables
*/
typedef struct msgtab_block {
DWORD idlo; /* Lowest id in the set */
DWORD idhi; /* Highest is in the set */
DWORD offset; /* Offset from resource start to first entry */
} msgtab_block_t;
typedef struct msgtab_entry {
WORD length; /* Length of the data in bytes */
WORD flags; /* 0 for char, 1 for WCHAR */
/* {char}|{WCHAR} data[...]; */
} msgtab_entry_t;
typedef struct messagetable {
DWORD memopt;
raw_data_t *data;
} messagetable_t;
/* StringTable structures */
typedef struct stt_entry {
string_t *str;
int id;
DWORD memopt;
characts_t *characts;
version_t *version;
} stt_entry_t;
typedef struct stringtable {
struct stringtable *next;
struct stringtable *prev;
DWORD memopt;
lvc_t lvc;
int idbase;
int nentries;
stt_entry_t *entries;
} stringtable_t;
/* VersionInfo structures */
enum ver_val_e {val_str, val_words, val_block};
struct ver_block; /* Forward ref */
typedef struct ver_words {
WORD *words;
int nwords;
} ver_words_t;
typedef struct ver_value {
struct ver_value *next;
struct ver_value *prev;
string_t *key;
union {
string_t *str;
ver_words_t *words;
struct ver_block *block;
} value;
enum ver_val_e type;
} ver_value_t;
typedef struct ver_block {
struct ver_block *next;
struct ver_block *prev;
string_t *name;
ver_value_t *values;
} ver_block_t;
typedef struct versioninfo {
int filever_maj1;
int filever_maj2;
int filever_min1;
int filever_min2;
int prodver_maj1;
int prodver_maj2;
int prodver_min1;
int prodver_min2;
int fileos;
int fileflags;
int fileflagsmask;
int filetype;
int filesubtype;
struct {
unsigned fv:1;
unsigned pv:1;
unsigned fo:1;
unsigned ff:1;
unsigned ffm:1;
unsigned ft:1;
unsigned fst:1;
} gotit;
ver_block_t *blocks;
lvc_t lvc;
DWORD memopt;
} versioninfo_t;
/* Accelerator structures */
#define WRC_AF_VIRTKEY 0x0001
#define WRC_AF_NOINVERT 0x0002
#define WRC_AF_SHIFT 0x0004
#define WRC_AF_CONTROL 0x0008
#define WRC_AF_ALT 0x0010
#define WRC_AF_ASCII 0x4000
typedef struct event {
struct event *next;
struct event *prev;
string_t *str;
int flags;
int key;
int id;
} event_t;
typedef struct accelerator {
DWORD memopt;
lvc_t lvc;
event_t *events;
} accelerator_t;
/* Toolbar structures */
typedef struct toolbar_item {
struct toolbar_item *next;
struct toolbar_item *prev;
int id;
} toolbar_item_t;
typedef struct toolbar {
DWORD memopt;
lvc_t lvc;
int button_width;
int button_height;
int nitems;
toolbar_item_t *items;
} toolbar_t;
typedef struct dlginit {
DWORD memopt;
raw_data_t *data;
} dlginit_t;
/* A top-level resource node */
typedef struct resource {
struct resource *next;
struct resource *prev;
enum res_e type;
name_id_t *name; /* resource's name */
language_t *lan; /* Only used as a sorting key and c-name creation*/
union {
accelerator_t *acc;
ani_curico_t *ani;
bitmap_t *bmp;
cursor_t *cur;
cursor_group_t *curg;
dialog_t *dlg;
dlginit_t *dlgi;
font_t *fnt;
fontdir_t *fnd;
icon_t *ico;
icon_group_t *icog;
menu_t *men;
messagetable_t *msg;
html_t *html;
rcdata_t *rdt;
stringtable_t *stt;
toolbar_t *tbt;
user_t *usr;
versioninfo_t *ver;
void *overlay; /* To catch all types at once... */
} res;
DWORD memopt;
} resource_t;
/* Resource count */
typedef struct res32_count {
int count;
resource_t **rsc;
} res32_count_t;
typedef struct res_count {
name_id_t type;
int count; /* win16 mode */
resource_t **rscarray;
int count32;
res32_count_t *rsc32array; /* win32 mode */
int n_id_entries;
int n_name_entries;
} res_count_t;
typedef struct style_pair {
style_t *style;
style_t *exstyle;
} style_pair_t;
#endif