diff options
Diffstat (limited to 'nx-X11/lib/X11/XKBGeom.c')
-rw-r--r-- | nx-X11/lib/X11/XKBGeom.c | 724 |
1 files changed, 0 insertions, 724 deletions
diff --git a/nx-X11/lib/X11/XKBGeom.c b/nx-X11/lib/X11/XKBGeom.c deleted file mode 100644 index f57fe7cf6..000000000 --- a/nx-X11/lib/X11/XKBGeom.c +++ /dev/null @@ -1,724 +0,0 @@ -/************************************************************ -Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - -Permission to use, copy, modify, and distribute this -software and its documentation for any purpose and without -fee is hereby granted, provided that the above copyright -notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting -documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution -of the software without specific prior written permission. -Silicon Graphics makes no representation about the suitability -of this software for any purpose. It is provided "as is" -without any express or implied warranty. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON -GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH -THE USE OR PERFORMANCE OF THIS SOFTWARE. - -********************************************************/ - -#ifdef DEBUG -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include <stdio.h> -#endif - -#define NEED_MAP_READERS -#include "Xlibint.h" -#include <nx-X11/extensions/XKBgeom.h> -#include <nx-X11/extensions/XKBproto.h> -#include "XKBlibint.h" - -#ifndef MINSHORT -#define MINSHORT -32768 -#endif -#ifndef MAXSHORT -#define MAXSHORT 32767 -#endif - -/***====================================================================***/ - -static void -_XkbCheckBounds(XkbBoundsPtr bounds, int x, int y) -{ - if (x < bounds->x1) - bounds->x1 = x; - if (x > bounds->x2) - bounds->x2 = x; - if (y < bounds->y1) - bounds->y1 = y; - if (y > bounds->y2) - bounds->y2 = y; - return; -} - -Bool -XkbComputeShapeBounds(XkbShapePtr shape) -{ - register int o, p; - XkbOutlinePtr outline; - XkbPointPtr pt; - - if ((!shape) || (shape->num_outlines < 1)) - return False; - shape->bounds.x1 = shape->bounds.y1 = MAXSHORT; - shape->bounds.x2 = shape->bounds.y2 = MINSHORT; - for (outline = shape->outlines, o = 0; o < shape->num_outlines; - o++, outline++) { - for (pt = outline->points, p = 0; p < outline->num_points; p++, pt++) { - _XkbCheckBounds(&shape->bounds, pt->x, pt->y); - } - if (outline->num_points < 2) { - _XkbCheckBounds(&shape->bounds, 0, 0); - } - } - return True; -} - -Bool -XkbComputeShapeTop(XkbShapePtr shape, XkbBoundsPtr bounds) -{ - register int p; - XkbOutlinePtr outline; - XkbPointPtr pt; - - if ((!shape) || (shape->num_outlines < 1)) - return False; - if (shape->approx) - outline = shape->approx; - else - outline = &shape->outlines[shape->num_outlines - 1]; - if (outline->num_points < 2) { - bounds->x1 = bounds->y1 = 0; - bounds->x2 = bounds->y2 = 0; - } - else { - bounds->x1 = bounds->y1 = MAXSHORT; - bounds->x2 = bounds->y2 = MINSHORT; - } - for (pt = outline->points, p = 0; p < outline->num_points; p++, pt++) { - _XkbCheckBounds(bounds, pt->x, pt->y); - } - return True; -} - -Bool -XkbComputeRowBounds(XkbGeometryPtr geom, XkbSectionPtr section, XkbRowPtr row) -{ - register int k, pos; - XkbKeyPtr key; - XkbBoundsPtr bounds, sbounds; - - if ((!geom) || (!section) || (!row)) - return False; - bounds = &row->bounds; - bzero(bounds, sizeof(XkbBoundsRec)); - for (key = row->keys, pos = k = 0; k < row->num_keys; k++, key++) { - sbounds = &XkbKeyShape(geom, key)->bounds; - _XkbCheckBounds(bounds, pos, 0); - if (!row->vertical) { - if (key->gap != 0) { - pos += key->gap; - _XkbCheckBounds(bounds, pos, 0); - } - _XkbCheckBounds(bounds, pos + sbounds->x1, sbounds->y1); - _XkbCheckBounds(bounds, pos + sbounds->x2, sbounds->y2); - pos += sbounds->x2; - } - else { - if (key->gap != 0) { - pos += key->gap; - _XkbCheckBounds(bounds, 0, pos); - } - _XkbCheckBounds(bounds, pos + sbounds->x1, sbounds->y1); - _XkbCheckBounds(bounds, pos + sbounds->x2, sbounds->y2); - pos += sbounds->y2; - } - } - return True; -} - -Bool -XkbComputeSectionBounds(XkbGeometryPtr geom, XkbSectionPtr section) -{ - register int i; - XkbShapePtr shape; - XkbRowPtr row; - XkbDoodadPtr doodad; - XkbBoundsPtr bounds, rbounds; - - if ((!geom) || (!section)) - return False; - bounds = §ion->bounds; - bzero(bounds, sizeof(XkbBoundsRec)); - for (i = 0, row = section->rows; i < section->num_rows; i++, row++) { - if (!XkbComputeRowBounds(geom, section, row)) - return False; - rbounds = &row->bounds; - _XkbCheckBounds(bounds, row->left + rbounds->x1, - row->top + rbounds->y1); - _XkbCheckBounds(bounds, row->left + rbounds->x2, - row->top + rbounds->y2); - } - for (i = 0, doodad = section->doodads; i < section->num_doodads; - i++, doodad++) { - static XkbBoundsRec tbounds; - - switch (doodad->any.type) { - case XkbOutlineDoodad: - case XkbSolidDoodad: - shape = XkbShapeDoodadShape(geom, &doodad->shape); - rbounds = &shape->bounds; - break; - case XkbTextDoodad: - tbounds.x1 = doodad->text.left; - tbounds.y1 = doodad->text.top; - tbounds.x2 = tbounds.x1 + doodad->text.width; - tbounds.y2 = tbounds.y1 + doodad->text.height; - rbounds = &tbounds; - break; - case XkbIndicatorDoodad: - shape = XkbIndicatorDoodadShape(geom, &doodad->indicator); - rbounds = &shape->bounds; - break; - case XkbLogoDoodad: - shape = XkbLogoDoodadShape(geom, &doodad->logo); - rbounds = &shape->bounds; - break; - default: - tbounds.x1 = tbounds.x2 = doodad->any.left; - tbounds.y1 = tbounds.y2 = doodad->any.top; - rbounds = &tbounds; - break; - } - _XkbCheckBounds(bounds, rbounds->x1, rbounds->y1); - _XkbCheckBounds(bounds, rbounds->x2, rbounds->y2); - } - return True; -} - -/***====================================================================***/ - -char * -XkbFindOverlayForKey(XkbGeometryPtr geom, XkbSectionPtr wanted, char *under) -{ - int s; - XkbSectionPtr section; - - if ((geom == NULL) || (under == NULL) || (geom->num_sections < 1)) - return NULL; - - if (wanted) - section = wanted; - else - section = geom->sections; - - for (s = 0; s < geom->num_sections; s++, section++) { - XkbOverlayPtr ol; - int o; - - if (section->num_overlays < 1) - continue; - for (o = 0, ol = section->overlays; o < section->num_overlays; - o++, ol++) { - XkbOverlayRowPtr row; - int r; - - for (r = 0, row = ol->rows; r < ol->num_rows; r++, row++) { - XkbOverlayKeyPtr key; - int k; - - for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { - if (strncmp(under, key->under.name, XkbKeyNameLength) == 0) - return key->over.name; - } - } - } - if (wanted != NULL) - break; - } - return NULL; -} - -/***====================================================================***/ - -static Status -_XkbReadGeomProperties(XkbReadBufferPtr buf, - XkbGeometryPtr geom, - xkbGetGeometryReply *rep) -{ - Status rtrn; - - if (rep->nProperties < 1) - return Success; - if ((rtrn = XkbAllocGeomProps(geom, rep->nProperties)) == Success) { - register int i; - register Bool ok = True; - - for (i = 0; (i < rep->nProperties) && ok; i++) { - char *name = NULL; - char *value = NULL; - ok = _XkbGetReadBufferCountedString(buf, &name) && ok; - ok = _XkbGetReadBufferCountedString(buf, &value) && ok; - ok = ok && (XkbAddGeomProperty(geom, name, value) != NULL); - - _XkbFree(name); - _XkbFree(value); - } - if (ok) - rtrn = Success; - else - rtrn = BadLength; - } - return rtrn; -} - -static Status -_XkbReadGeomKeyAliases(XkbReadBufferPtr buf, - XkbGeometryPtr geom, - xkbGetGeometryReply *rep) -{ - Status rtrn; - - if (rep->nKeyAliases < 1) - return Success; - if ((rtrn = XkbAllocGeomKeyAliases(geom, rep->nKeyAliases)) == Success) { - if (!_XkbCopyFromReadBuffer(buf, (char *) geom->key_aliases, - (rep->nKeyAliases * XkbKeyNameLength * 2))) - return BadLength; - geom->num_key_aliases = rep->nKeyAliases; - return Success; - } - else { /* alloc failed, just skip the aliases */ - _XkbSkipReadBufferData(buf, (rep->nKeyAliases * XkbKeyNameLength * 2)); - } - return rtrn; -} - -static Status -_XkbReadGeomColors(XkbReadBufferPtr buf, - XkbGeometryPtr geom, - xkbGetGeometryReply *rep) -{ - Status rtrn; - - if (rep->nColors < 1) - return Success; - if ((rtrn = XkbAllocGeomColors(geom, rep->nColors)) == Success) { - register int i; - - for (i = 0; i < rep->nColors; i++) { - char *spec = NULL; - if (!_XkbGetReadBufferCountedString(buf, &spec)) - rtrn = BadLength; - else if (XkbAddGeomColor(geom, spec, geom->num_colors) == NULL) - rtrn = BadAlloc; - - _XkbFree(spec); - if (rtrn != Success) - return rtrn; - } - return Success; - } - return rtrn; -} - -static Status -_XkbReadGeomShapes(XkbReadBufferPtr buf, - XkbGeometryPtr geom, - xkbGetGeometryReply *rep) -{ - register int i; - Status rtrn; - - if (rep->nShapes < 1) - return Success; - if ((rtrn = XkbAllocGeomShapes(geom, rep->nShapes)) != Success) - return rtrn; - for (i = 0; i < rep->nShapes; i++) { - xkbShapeWireDesc *shapeWire; - XkbShapePtr shape; - register int o; - - shapeWire = (xkbShapeWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbShapeWireDesc)); - if (!shapeWire) - return BadLength; - shape = XkbAddGeomShape(geom, shapeWire->name, shapeWire->nOutlines); - if (!shape) - return BadAlloc; - for (o = 0; o < shapeWire->nOutlines; o++) { - xkbOutlineWireDesc *olWire; - XkbOutlinePtr ol; - register int p; - XkbPointPtr pt; - - olWire = (xkbOutlineWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbOutlineWireDesc)); - if (!olWire) - return BadLength; - ol = XkbAddGeomOutline(shape, olWire->nPoints); - if (!ol) - return BadAlloc; - ol->corner_radius = olWire->cornerRadius; - for (p = 0, pt = ol->points; p < olWire->nPoints; p++, pt++) { - xkbPointWireDesc *ptWire; - - ptWire = (xkbPointWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbPointWireDesc)); - if (!ptWire) - return BadLength; - pt->x = ptWire->x; - pt->y = ptWire->y; - } - ol->num_points = olWire->nPoints; - } - if ((shapeWire->primaryNdx != XkbNoShape) && - (shapeWire->primaryNdx < shapeWire->nOutlines)) - shape->primary = &shape->outlines[shapeWire->primaryNdx]; - else - shape->primary = NULL; - if ((shapeWire->approxNdx != XkbNoShape) && - (shapeWire->approxNdx < shapeWire->nOutlines)) - shape->approx = &shape->outlines[shapeWire->approxNdx]; - else - shape->approx = NULL; - XkbComputeShapeBounds(shape); - } - return Success; -} - -static Status -_XkbReadGeomDoodad(XkbReadBufferPtr buf, - XkbGeometryPtr geom, - XkbSectionPtr section) -{ - XkbDoodadPtr doodad; - xkbDoodadWireDesc *doodadWire; - - doodadWire = (xkbDoodadWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbDoodadWireDesc)); - if (!doodadWire) - return BadLength; - doodad = XkbAddGeomDoodad(geom, section, doodadWire->any.name); - if (!doodad) - return BadAlloc; - doodad->any.type = doodadWire->any.type; - doodad->any.priority = doodadWire->any.priority; - doodad->any.top = doodadWire->any.top; - doodad->any.left = doodadWire->any.left; - doodad->any.angle = doodadWire->any.angle; - switch (doodad->any.type) { - case XkbOutlineDoodad: - case XkbSolidDoodad: - doodad->shape.color_ndx = doodadWire->shape.colorNdx; - doodad->shape.shape_ndx = doodadWire->shape.shapeNdx; - break; - case XkbTextDoodad: - doodad->text.width = doodadWire->text.width; - doodad->text.height = doodadWire->text.height; - doodad->text.color_ndx = doodadWire->text.colorNdx; - if (!_XkbGetReadBufferCountedString(buf, &doodad->text.text)) - return BadLength; - if (!_XkbGetReadBufferCountedString(buf, &doodad->text.font)) - return BadLength; - break; - case XkbIndicatorDoodad: - doodad->indicator.shape_ndx = doodadWire->indicator.shapeNdx; - doodad->indicator.on_color_ndx = doodadWire->indicator.onColorNdx; - doodad->indicator.off_color_ndx = doodadWire->indicator.offColorNdx; - break; - case XkbLogoDoodad: - doodad->logo.color_ndx = doodadWire->logo.colorNdx; - doodad->logo.shape_ndx = doodadWire->logo.shapeNdx; - if (!_XkbGetReadBufferCountedString(buf, &doodad->logo.logo_name)) - return BadLength; - break; - default: - return BadValue; - } - return Success; -} - -static Status -_XkbReadGeomOverlay(XkbReadBufferPtr buf, - XkbGeometryPtr geom, - XkbSectionPtr section) -{ - XkbOverlayPtr ol; - xkbOverlayWireDesc *olWire; - register int r; - - olWire = (xkbOverlayWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbOverlayWireDesc)); - if (olWire == NULL) - return BadLength; - ol = XkbAddGeomOverlay(section, olWire->name, olWire->nRows); - if (ol == NULL) - return BadLength; - for (r = 0; r < olWire->nRows; r++) { - register int k; - XkbOverlayRowPtr row; - xkbOverlayRowWireDesc *rowWire; - xkbOverlayKeyWireDesc *keyWire; - - rowWire = (xkbOverlayRowWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbOverlayRowWireDesc)); - if (rowWire == NULL) - return BadLength; - row = XkbAddGeomOverlayRow(ol, rowWire->rowUnder, rowWire->nKeys); - if (!row) - return BadAlloc; - row->row_under = rowWire->rowUnder; - if (rowWire->nKeys < 1) - continue; - keyWire = (xkbOverlayKeyWireDesc *) - _XkbGetReadBufferPtr(buf, - SIZEOF(xkbOverlayKeyWireDesc) * rowWire->nKeys); - if (keyWire == NULL) - return BadLength; - for (k = 0; k < rowWire->nKeys; k++, keyWire++, row->num_keys++) { - memcpy(row->keys[row->num_keys].over.name, keyWire->over, - XkbKeyNameLength); - memcpy(row->keys[row->num_keys].under.name, keyWire->under, - XkbKeyNameLength); - } - } - return Success; -} - -static Status -_XkbReadGeomSections(XkbReadBufferPtr buf, - XkbGeometryPtr geom, - xkbGetGeometryReply *rep) -{ - register int s; - XkbSectionPtr section; - xkbSectionWireDesc *sectionWire; - Status rtrn; - - if (rep->nSections < 1) - return Success; - if ((rtrn = XkbAllocGeomSections(geom, rep->nSections)) != Success) - return rtrn; - for (s = 0; s < rep->nSections; s++) { - sectionWire = (xkbSectionWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbSectionWireDesc)); - if (!sectionWire) - return BadLength; - section = XkbAddGeomSection(geom, sectionWire->name, sectionWire->nRows, - sectionWire->nDoodads, - sectionWire->nOverlays); - if (!section) - return BadAlloc; - section->top = sectionWire->top; - section->left = sectionWire->left; - section->width = sectionWire->width; - section->height = sectionWire->height; - section->angle = sectionWire->angle; - section->priority = sectionWire->priority; - if (sectionWire->nRows > 0) { - register int r; - - for (r = 0; r < sectionWire->nRows; r++) { - XkbRowPtr row; - xkbRowWireDesc *rowWire; - - rowWire = (xkbRowWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbRowWireDesc)); - if (!rowWire) - return BadLength; - row = XkbAddGeomRow(section, rowWire->nKeys); - if (!row) - return BadAlloc; - row->top = rowWire->top; - row->left = rowWire->left; - row->vertical = rowWire->vertical; - if (rowWire->nKeys > 0) { - register int k; - - for (k = 0; k < rowWire->nKeys; k++) { - XkbKeyPtr key; - xkbKeyWireDesc *keyWire; - - keyWire = (xkbKeyWireDesc *) - _XkbGetReadBufferPtr(buf, SIZEOF(xkbKeyWireDesc)); - if (!keyWire) - return BadLength; - key = XkbAddGeomKey(row); - if (!key) - return BadAlloc; - memcpy(key->name.name, keyWire->name, XkbKeyNameLength); - key->gap = keyWire->gap; - key->shape_ndx = keyWire->shapeNdx; - key->color_ndx = keyWire->colorNdx; - } - } - } - } - if (sectionWire->nDoodads > 0) { - register int d; - - for (d = 0; d < sectionWire->nDoodads; d++) { - if ((rtrn = _XkbReadGeomDoodad(buf, geom, section)) != Success) - return rtrn; - } - } - if (sectionWire->nOverlays > 0) { - register int o; - - for (o = 0; o < sectionWire->nOverlays; o++) { - if ((rtrn = _XkbReadGeomOverlay(buf, geom, section)) != Success) - return rtrn; - } - } - } - return Success; -} - -static Status -_XkbReadGeomDoodads(XkbReadBufferPtr buf, - XkbGeometryPtr geom, - xkbGetGeometryReply *rep) -{ - register int d; - Status rtrn; - - if (rep->nDoodads < 1) - return Success; - if ((rtrn = XkbAllocGeomDoodads(geom, rep->nDoodads)) != Success) - return rtrn; - for (d = 0; d < rep->nDoodads; d++) { - if ((rtrn = _XkbReadGeomDoodad(buf, geom, NULL)) != Success) - return rtrn; - } - return Success; -} - -Status -_XkbReadGetGeometryReply(Display *dpy, - xkbGetGeometryReply *rep, - XkbDescPtr xkb, - int *nread_rtrn) -{ - XkbGeometryPtr geom; - - geom = _XkbTypedCalloc(1, XkbGeometryRec); - if (!geom) - return BadAlloc; - if (xkb->geom) - XkbFreeGeometry(xkb->geom, XkbGeomAllMask, True); - xkb->geom = geom; - - geom->name = rep->name; - geom->width_mm = rep->widthMM; - geom->height_mm = rep->heightMM; - if (rep->length) { - XkbReadBufferRec buf; - int left; - - if (_XkbInitReadBuffer(dpy, &buf, (int) rep->length * 4)) { - Status status = Success; - - if (nread_rtrn) - *nread_rtrn = (int) rep->length * 4; - if (!_XkbGetReadBufferCountedString(&buf, &geom->label_font)) - status = BadLength; - if (status == Success) - status = _XkbReadGeomProperties(&buf, geom, rep); - if (status == Success) - status = _XkbReadGeomColors(&buf, geom, rep); - if (status == Success) - status = _XkbReadGeomShapes(&buf, geom, rep); - if (status == Success) - status = _XkbReadGeomSections(&buf, geom, rep); - if (status == Success) - status = _XkbReadGeomDoodads(&buf, geom, rep); - if (status == Success) - status = _XkbReadGeomKeyAliases(&buf, geom, rep); - left = _XkbFreeReadBuffer(&buf); - if ((rep->baseColorNdx > geom->num_colors) || - (rep->labelColorNdx > geom->num_colors)) - status = BadLength; - if ((status != Success) || left || buf.error) { - if (status == Success) - status = BadLength; - XkbFreeGeometry(geom, XkbGeomAllMask, True); - xkb->geom = NULL; - return status; - } - geom->base_color = &geom->colors[rep->baseColorNdx]; - geom->label_color = &geom->colors[rep->labelColorNdx]; - } - else { - XkbFreeGeometry(geom, XkbGeomAllMask, True); - xkb->geom = NULL; - return BadAlloc; - } - } - return Success; -} - -Status -XkbGetGeometry(Display *dpy, XkbDescPtr xkb) -{ - xkbGetGeometryReq *req; - xkbGetGeometryReply rep; - Status status; - - if ((!xkb) || (dpy->flags & XlibDisplayNoXkb) || - (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) - return BadAccess; - - LockDisplay(dpy); - GetReq(kbGetGeometry, req); - req->reqType = dpy->xkb_info->codes->major_opcode; - req->xkbReqType = X_kbGetGeometry; - req->deviceSpec = xkb->device_spec; - req->name = None; - if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) - status = BadImplementation; - else if (!rep.found) - status = BadName; - else - status = _XkbReadGetGeometryReply(dpy, &rep, xkb, NULL); - UnlockDisplay(dpy); - SyncHandle(); - return status; -} - -Status -XkbGetNamedGeometry(Display *dpy, XkbDescPtr xkb, Atom name) -{ - xkbGetGeometryReq *req; - xkbGetGeometryReply rep; - Status status; - - if ((name == None) || (dpy->flags & XlibDisplayNoXkb) || - (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) - return BadAccess; - - LockDisplay(dpy); - GetReq(kbGetGeometry, req); - req->reqType = dpy->xkb_info->codes->major_opcode; - req->xkbReqType = X_kbGetGeometry; - req->deviceSpec = xkb->device_spec; - req->name = (CARD32) name; - if ((!_XReply(dpy, (xReply *) &rep, 0, xFalse)) || (!rep.found)) - status = BadImplementation; - else if (!rep.found) - status = BadName; - else - status = _XkbReadGetGeometryReply(dpy, &rep, xkb, NULL); - UnlockDisplay(dpy); - SyncHandle(); - return status; -} |