2021-10-11 18:37:13 -03:00

349 lines
11 KiB
C

/* @(#)attr.h 1.1 94/10/31 SMI */
/*
* Copyright (c) 1983 by Sun Microsystems, Inc.
*/
#ifndef sunwindow_attr_DEFINED
#define sunwindow_attr_DEFINED
#include <sys/types.h>
typedef caddr_t * Attr_avlist;
typedef unsigned Attr_attribute; /* 32 bit quantity */
/* Attr_avlist is not an array of Attr_attributes, because it is an array
* of intermixed attributes and values.
*/
/* This macro is machine dependent in that it assumes
* the cardinality will be in the lower 5 bits of the type-cardinality
* pair.
*/
#define ATTR_TYPE(base_type, cardinality) \
(((((unsigned)(base_type)) & 0x07f) << 5) | \
(((unsigned)(cardinality)) & 0x0f))
/* Base types in the range ATTR_BASE_UNUSED_FIRST
* to ATTR_BASE_UNUSED_LAST are available for
* client use.
*/
#define ATTR_BASE_UNUSED_FIRST 0
#define ATTR_BASE_UNUSED_LAST 31
/* Base types 32 through 63 are
* reserved for future use.
*/
#define ATTR_BASE_FIRST 64
typedef enum {
ATTR_BASE_INT = ATTR_BASE_FIRST,
ATTR_BASE_INT_PAIR = ATTR_BASE_FIRST + 1,
ATTR_BASE_X = ATTR_BASE_FIRST + 2,
ATTR_BASE_INDEX_X = ATTR_BASE_FIRST + 3,
ATTR_BASE_Y = ATTR_BASE_FIRST + 4,
ATTR_BASE_INDEX_Y = ATTR_BASE_FIRST + 5,
ATTR_BASE_XY = ATTR_BASE_FIRST + 6,
ATTR_BASE_INDEX_XY = ATTR_BASE_FIRST + 7,
ATTR_BASE_BOOLEAN = ATTR_BASE_FIRST + 8,
ATTR_BASE_ENUM = ATTR_BASE_FIRST + 9,
ATTR_BASE_CHAR = ATTR_BASE_FIRST + 10,
ATTR_BASE_STRING = ATTR_BASE_FIRST + 11,
ATTR_BASE_PIXRECT_PTR = ATTR_BASE_FIRST + 12,
ATTR_BASE_PIXFONT_PTR = ATTR_BASE_FIRST + 13,
ATTR_BASE_PIXWIN_PTR = ATTR_BASE_FIRST + 14,
ATTR_BASE_RECT_PTR = ATTR_BASE_FIRST + 15,
ATTR_BASE_OPAQUE = ATTR_BASE_FIRST + 16,
ATTR_BASE_NO_VALUE = ATTR_BASE_FIRST + 17,
ATTR_BASE_AV = ATTR_BASE_FIRST + 18,
ATTR_BASE_FUNCTION_PTR = ATTR_BASE_FIRST + 19,
ATTR_BASE_ICON_PTR = ATTR_BASE_FIRST + 20,
ATTR_BASE_SINGLE_COLOR_PTR = ATTR_BASE_FIRST + 21,
ATTR_BASE_CURSOR_PTR = ATTR_BASE_FIRST + 22,
ATTR_BASE_INT_TRIPLE = ATTR_BASE_FIRST + 23,
ATTR_BASE_LONG = ATTR_BASE_FIRST + 24,
ATTR_BASE_SHORT = ATTR_BASE_FIRST + 25
} Attr_base_type;
/* Clients of the attribute value package should use
* Attr_base_cardinality elements to define the base type
* and cardinality of their attributes.
*/
typedef enum {
ATTR_INT = ATTR_TYPE(ATTR_BASE_INT, 1),
ATTR_INT_PAIR = ATTR_TYPE(ATTR_BASE_INT_PAIR, 2),
ATTR_INT_TRIPLE = ATTR_TYPE(ATTR_BASE_INT_TRIPLE, 3),
ATTR_X = ATTR_TYPE(ATTR_BASE_X, 1),
ATTR_INDEX_X = ATTR_TYPE(ATTR_BASE_INDEX_X, 2),
ATTR_Y = ATTR_TYPE(ATTR_BASE_Y, 1),
ATTR_INDEX_Y = ATTR_TYPE(ATTR_BASE_INDEX_Y, 2),
ATTR_XY = ATTR_TYPE(ATTR_BASE_XY, 2),
ATTR_INDEX_XY = ATTR_TYPE(ATTR_BASE_INDEX_XY, 3),
ATTR_BOOLEAN = ATTR_TYPE(ATTR_BASE_BOOLEAN, 1),
ATTR_ENUM = ATTR_TYPE(ATTR_BASE_ENUM, 1),
ATTR_CHAR = ATTR_TYPE(ATTR_BASE_CHAR, 1),
ATTR_STRING = ATTR_TYPE(ATTR_BASE_STRING, 1),
ATTR_PIXRECT_PTR = ATTR_TYPE(ATTR_BASE_PIXRECT_PTR, 1),
ATTR_PIXFONT_PTR = ATTR_TYPE(ATTR_BASE_PIXFONT_PTR, 1),
ATTR_PIXWIN_PTR = ATTR_TYPE(ATTR_BASE_PIXWIN_PTR, 1),
ATTR_RECT_PTR = ATTR_TYPE(ATTR_BASE_RECT_PTR, 1),
ATTR_OPAQUE = ATTR_TYPE(ATTR_BASE_OPAQUE, 1),
ATTR_NO_VALUE = ATTR_TYPE(ATTR_BASE_NO_VALUE, 0),
ATTR_AV = ATTR_TYPE(ATTR_BASE_AV, 1),
ATTR_FUNCTION_PTR = ATTR_TYPE(ATTR_BASE_FUNCTION_PTR, 1),
ATTR_ICON_PTR = ATTR_TYPE(ATTR_BASE_ICON_PTR, 1),
ATTR_SINGLE_COLOR_PTR = ATTR_TYPE(ATTR_BASE_SINGLE_COLOR_PTR, 1),
ATTR_CURSOR_PTR = ATTR_TYPE(ATTR_BASE_CURSOR_PTR, 1),
ATTR_LONG = ATTR_TYPE(ATTR_BASE_LONG, 1),
ATTR_SHORT = ATTR_TYPE(ATTR_BASE_SHORT, 1)
} Attr_base_cardinality;
/* Note that this macro is machine dependent in that it assumes the
* base_type-cardinality pair will be in the lower 13 bits of the
* list_type-base_cardinality pair.
*/
#define ATTR_LIST_OF(list_type, list_ptr_type, base_cardinality) \
(((((unsigned)(list_type)) & 0x3) << 14) | \
(((unsigned)(list_ptr_type) & 0x1) << 13) | \
(((unsigned)(base_cardinality)) & 0x3fff))
typedef enum {
ATTR_LIST_IS_INLINE = 0,
ATTR_LIST_IS_PTR = 1
} Attr_list_ptr_type;
#define ATTR_LIST_INLINE(list_type, base_cardinality) \
ATTR_LIST_OF(list_type, ATTR_LIST_IS_INLINE, base_cardinality)
#define ATTR_LIST_PTR(list_type, base_cardinality) \
ATTR_LIST_OF(list_type, ATTR_LIST_IS_PTR, base_cardinality)
typedef enum {
/* Note that ATTR_NONE must have a value of zero,
* since a no-list type is assumed for each of the
* types in Attr_base_cardinality.
*/
ATTR_NONE = 0,
ATTR_RECURSIVE = 1,
ATTR_NULL = 2,
ATTR_COUNTED = 3
} Attr_list_type;
/*
* Note that 0 is NEVER a valid package id.
*
* The range from ATTR_PKG_UNUSED_FIRST to
* ATTR_PKG_UNUSED_LAST is reserved for non-Sun packages.
*/
#define ATTR_PKG_UNUSED_FIRST 1
#define ATTR_PKG_UNUSED_LAST 31
/* 32 through 63 are reserved for
* future use.
*/
#define ATTR_PKG_FIRST 64
/* #define ATTR_PKG_LAST 127 */
/* 128 through 255 are spare */
typedef enum {
ATTR_PKG_ZERO = 0,
ATTR_PKG_GENERIC = ATTR_PKG_FIRST,
ATTR_PKG_PANEL = ATTR_PKG_FIRST + 1,
ATTR_PKG_SCROLLBAR = ATTR_PKG_FIRST + 2,
ATTR_PKG_CURSOR = ATTR_PKG_FIRST + 3,
ATTR_PKG_MENU = ATTR_PKG_FIRST + 4,
ATTR_PKG_TEXTSW = ATTR_PKG_FIRST + 5,
ATTR_PKG_TOOL = ATTR_PKG_FIRST + 6,
ATTR_PKG_SELN_BASE = ATTR_PKG_FIRST + 7,
ATTR_PKG_ENTITY = ATTR_PKG_FIRST + 8,
ATTR_PKG_IMAGE = ATTR_PKG_FIRST + 9,
ATTR_PKG_WIN = ATTR_PKG_FIRST + 10,
ATTR_PKG_FRAME = ATTR_PKG_FIRST + 11,
ATTR_PKG_CANVAS = ATTR_PKG_FIRST + 12,
ATTR_PKG_TTY = ATTR_PKG_FIRST + 13,
ATTR_PKG_ICON = ATTR_PKG_FIRST + 14,
ATTR_PKG_NOP = ATTR_PKG_FIRST + 15,
ATTR_PKG_PIXWIN = ATTR_PKG_FIRST + 16,
ATTR_PKG_ALERT = ATTR_PKG_FIRST + 17,
ATTR_PKG_HELP = ATTR_PKG_FIRST + 18,
#ifndef PRE_FLAMINGO
ATTR_PKG_VIDEO = ATTR_PKG_FIRST + 19,
ATTR_PKG_LAST = ATTR_PKG_FIRST + 19,
#else
ATTR_PKG_LAST = ATTR_PKG_FIRST + 18
#endif
/* Change ATTR_PKG_LAST to be EQUAL to the last legal pkg id. */
/* The procedure counter(), called by attr_make, aborts if */
/* PKG_ID > ATTR_PKG_LAST */
/* PKG name should also be added to attr_names[] in attr.c */
} Attr_pkg;
/* An attribute is composed of
* pkg ( 8 bits): id of package that uses the attribute
* ordinal ( 8 bits): ordinal number of the attribute
* type (16 bits): list type, list pointer type, base type, and cardinality
*/
#define ATTR(pkg, type, ordinal) \
( ((((unsigned)(pkg)) & 0x7f) << 24) | \
((((unsigned)(ordinal)) & 0xff) << 16) | \
(((unsigned)(type)) & 0xefef) )
typedef union {
struct {
Attr_pkg pkg : 8;
unsigned ordinal : 8;
Attr_list_type list_type : 2;
Attr_list_ptr_type list_ptr_type : 1;
unsigned spare1 : 1; /* unused */
Attr_base_type base_type : 7;
unsigned spare2 : 1; /* unused */
unsigned cardinality : 4;
} info;
Attr_attribute code;
} Attr_union;
/* Generic attributes
*/
typedef enum {
ATTR_LIST = ATTR(ATTR_PKG_GENERIC, ATTR_LIST_PTR(ATTR_RECURSIVE, ATTR_NO_VALUE), 0)
} Attr_generic;
/* ATTR_STANDARD_SIZE is large enough to allow for
* most attribute-value lists.
*/
#define ATTR_STANDARD_SIZE 250
#ifdef notdef
/* Note that in these macros, attr must not be
* in a register or be a constant.
* Since this is deemed too restrictive, we use
* shifting & masking instead.
*/
#define ATTR_UNION(attr) ((Attr_union *) &((Attr_attribute) (attr)))
#define ATTR_INFO(attr) (ATTR_UNION(attr)->info)
#define ATTR_CODE(attr) (ATTR_UNION(attr)->code)
#define ATTR_LIST_TYPE(attr) (ATTR_INFO(attr).list_type)
#define ATTR_LIST_PTR_TYPE(attr) (ATTR_INFO(attr).list_ptr_type)
#define ATTR_BASE_TYPE(attr) (ATTR_INFO(attr).base_type)
#define ATTR_CARDINALITY(attr) (ATTR_INFO(attr).cardinality)
#define ATTR_PKG(attr) (ATTR_INFO(attr).pkg)
#define ATTR_ORDINAL(attr) (ATTR_INFO(attr).ordinal)
#endif notdef
#define ATTR_CODE(attr) ((unsigned) (attr))
#define ATTR_PKG(attr) \
((Attr_pkg) ((ATTR_CODE(attr) >> 24) & 0xFF))
#define ATTR_VALID_PKG_ID(attr) \
(((int)ATTR_PKG(attr)) > ((int) ATTR_PKG_ZERO) && \
((int)ATTR_PKG(attr)) <= ((int)ATTR_PKG_LAST))
#define ATTR_ORDINAL(attr) \
((unsigned) ((ATTR_CODE(attr) >> 16) & 0xFF))
#define ATTR_LIST_TYPE(attr) \
((Attr_list_type) ((ATTR_CODE(attr) >> 14) & 0x3))
#define ATTR_LIST_PTR_TYPE(attr) \
((Attr_list_ptr_type) ((ATTR_CODE(attr) >> 13) & 0x1))
#define ATTR_BASE_TYPE(attr) \
((Attr_base_type) ((ATTR_CODE(attr) >> 5) & 0x7F))
#define ATTR_CARDINALITY(attr) \
((unsigned) (ATTR_CODE(attr) & 0xF))
#define attr_skip(attr, argv) \
((ATTR_LIST_TYPE((attr)) == ATTR_NONE) \
? (argv) + ATTR_CARDINALITY((attr)) \
: ((Attr_avlist)attr_skip_value((Attr_attribute)(attr), (argv))))
#define attr_next(attrs) attr_skip((*(attrs)), ((attrs)+1))
/* Character unit support */
#ifdef lint
/* The following #ifndef fixes kernel lint warnings, but is pretty strange */
#ifndef lint
extern void attr_replace_cu();
extern int attr_cu_to_x();
extern int attr_cu_to_y();
#endif
#else lint
#define attr_replace_cu(avlist, font, lmargin, tmargin, rgap) \
attr_rc_units_to_pixels(avlist, font->pf_defaultsize.x, \
font->pf_defaultsize.y, lmargin, tmargin, 0, rgap)
#define attr_cu_to_x(encoded_value, font, left_margin) \
attr_rc_unit_to_x(encoded_value, font->pf_defaultsize.x, left_margin, 0)
#define attr_cu_to_y(encoded_value, font, top_margin, row_gap) \
attr_rc_unit_to_y(encoded_value, font->pf_defaultsize.y, top_margin, row_gap)
#endif lint
typedef enum {
ATTR_CU_POSITION = 0x0, /* bit 29 is off */
ATTR_CU_LENGTH = 0x20000000 /* bit 29 is on */
} Attr_cu_type;
#define ATTR_CU_TAG 0x80000000
#define ATTR_PIXEL_OFFSET 0x00008000
#define ATTR_CU(unit, n) \
(((unsigned)(unit)) | (((n) & 0x1FFF) << 16) | \
ATTR_CU_TAG | ATTR_PIXEL_OFFSET)
#define ATTR_CU_MASK 0xC0000000
#define ATTR_CU_TYPE(n) \
((Attr_cu_type) ((n) & (unsigned) (ATTR_CU_LENGTH)))
/* attr_is_cu(n) returns non-zero if n has
* been encoded using ATTR_CU()
*/
#define attr_is_cu(n) (((n) & ATTR_CU_MASK) == ATTR_CU_TAG)
/* Macros for position including
* margins.
*/
#define ATTR_COL(n) ATTR_CU(ATTR_CU_POSITION, n)
#define ATTR_ROW(n) ATTR_CU(ATTR_CU_POSITION, n)
/* Macros for length excluding
* margins.
*/
#define ATTR_COLS(n) ATTR_CU(ATTR_CU_LENGTH, n)
#define ATTR_ROWS(n) ATTR_CU(ATTR_CU_LENGTH, n)
#define ATTR_CHARS(n) ATTR_CU(ATTR_CU_LENGTH, n)
#define ATTR_LINES(n) ATTR_CU(ATTR_CU_LENGTH, n)
/* attr_make() is not interested in the
* count from attr_make_count().
*/
#define attr_make(array, max_size, argv) \
attr_make_count(array, max_size, argv, (int *)0)
/* Following are useful for multi-pass avlist processing. */
#define ATTR_NOP(attr) \
( (((unsigned)ATTR_PKG_NOP) << 24) | (ATTR_CODE(attr) & 0xffffff) )
#define ATTR_CONSUME(attr) (attr) = ((caddr_t)ATTR_NOP(attr))
#ifndef lint
/* Available functions
*/
extern Attr_avlist attr_create_list();
extern Attr_avlist attr_create();
extern Attr_avlist attr_make_count();
extern int attr_copy();
extern int attr_count();
extern char *attr_sprint();
extern Attr_avlist attr_skip_value();
extern void attr_free();
extern int attr_rc_unit_to_x();
extern int attr_rc_unit_to_y();
extern void attr_rc_units_to_pixels();
#endif lint
#endif