diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2014-05-26 10:13:31 -0700 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2014-05-26 16:03:48 -0700 |
commit | 9456437718d78b942333bdf74124c027ba35039f (patch) | |
tree | 6c9f42170c86622b19afeed19e4e63dfa1698219 /psgeom.c | |
parent | 7ebdc6c2ed2917dd48687aa16c6909186a575e2d (diff) |
Convert sources to X.Org standard coding style
Via util/modular/x-indent-all.sh
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Diffstat (limited to 'psgeom.c')
-rw-r--r-- | psgeom.c | 3243 |
1 files changed, 1800 insertions, 1443 deletions
@@ -7,19 +7,19 @@ 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 + 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 + 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 + + 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 + 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. @@ -60,20 +60,20 @@ #define FONT_MOUSECAPS 4 typedef struct { - Display * dpy; - XkbDescPtr xkb; - XkbGeometryPtr geom; - int totalKB; - int kbPerPage; - int black; - int white; - int color; - int font; - int fontSize; - int nPages; - int x1,y1; - int x2,y2; - XKBPrintArgs * args; + Display * dpy; + XkbDescPtr xkb; + XkbGeometryPtr geom; + int totalKB; + int kbPerPage; + int black; + int white; + int color; + int font; + int fontSize; + int nPages; + int x1, y1; + int x2, y2; + XKBPrintArgs * args; } PSState; #define G1L1 0 @@ -106,11 +106,11 @@ typedef struct { #define SZ_XLARGE 5 typedef struct { - unsigned present; - Bool alpha[2]; - char label[NLABELS][LABEL_LEN]; - int font[NLABELS]; - int size[NLABELS]; + unsigned present; + Bool alpha[2]; + char label[NLABELS][LABEL_LEN]; + int font[NLABELS]; + int size[NLABELS]; } KeyTop; #define DFLT_LABEL_FONT "Helvetica-Narrow-Bold" @@ -124,56 +124,57 @@ typedef struct _PSFontDef { } PSFontDef; static PSFontDef internalFonts[] = { - { "IsoKeyCaps", IsoKeyCaps } + { "IsoKeyCaps", IsoKeyCaps } }; -static int nInternalFonts = (sizeof(internalFonts)/sizeof(PSFontDef)); +static int nInternalFonts = (sizeof(internalFonts) / sizeof(PSFontDef)); static void ListInternalFonts(FILE *out, int first, int indent) { -register int i,n,nThisLine; + register int i, n, nThisLine; - for (n=0;n<first;n++) { - putc(' ',out); + for (n = 0; n < first; n++) { + putc(' ', out); } - for (nThisLine=i=0;i<nInternalFonts;i++) { - if (nThisLine==4) { - fprintf(out,",\n"); - for (n=0;n<indent;n++) { - putc(' ',out); - } - nThisLine= 0; - } - if (nThisLine==0) - fprintf(out,"%s",internalFonts[i].name); - else fprintf(out,", %s",internalFonts[i].name); - nThisLine++; + for (nThisLine = i = 0; i < nInternalFonts; i++) { + if (nThisLine == 4) { + fprintf(out, ",\n"); + for (n = 0; n < indent; n++) { + putc(' ', out); + } + nThisLine = 0; + } + if (nThisLine == 0) + fprintf(out, "%s", internalFonts[i].name); + else + fprintf(out, ", %s", internalFonts[i].name); + nThisLine++; } - if (nThisLine!=0) - fprintf(out,"\n"); + if (nThisLine != 0) + fprintf(out, "\n"); return; } static Bool PSIncludeFont(FILE *out, char *font) { -char ** pstr; -register int i; + char **pstr; + register int i; - pstr= NULL; - for (i=0;(i<nInternalFonts)&&(pstr==NULL);i++) { - if (uStringEqual(internalFonts[i].name,font)) - pstr= internalFonts[i].def; + pstr = NULL; + for (i = 0; (i < nInternalFonts) && (pstr == NULL); i++) { + if (uStringEqual(internalFonts[i].name, font)) + pstr = internalFonts[i].def; } - if (pstr!=NULL) { - fprintf(out,"%%%%BeginFont: %s\n",font); - while (*pstr!=NULL) { - fprintf(out,"%s\n",*pstr); - pstr++; - } - fprintf(out,"%%%%EndFont\n"); - return True; + if (pstr != NULL) { + fprintf(out, "%%%%BeginFont: %s\n", font); + while (*pstr != NULL) { + fprintf(out, "%s\n", *pstr); + pstr++; + } + fprintf(out, "%%%%EndFont\n"); + return True; } return False; } @@ -181,14 +182,14 @@ register int i; Bool DumpInternalFont(FILE *out, char *fontName) { - if (strcmp(fontName,"IsoKeyCaps")!=0) { - uError("No internal font named \"%s\"\n",fontName); - uAction("No font dumped\n"); - fprintf(stderr,"Current internal fonts are: "); - ListInternalFonts(stderr,0,8); - return False; + if (strcmp(fontName, "IsoKeyCaps") != 0) { + uError("No internal font named \"%s\"\n", fontName); + uAction("No font dumped\n"); + fprintf(stderr, "Current internal fonts are: "); + ListInternalFonts(stderr, 0, 8); + return False; } - PSIncludeFont(out,fontName); + PSIncludeFont(out, fontName); return True; } @@ -197,48 +198,49 @@ DumpInternalFont(FILE *out, char *fontName) static void PSColorDef(FILE *out, PSState *state, XkbColorPtr color) { -int tmp; + int tmp; - fprintf(out,"/C%03d ",color->pixel); - if (uStrCaseEqual(color->spec,"black")) { - state->black= color->pixel; - fprintf(out,"{ 0 setgray } def %% %s\n",color->spec); + fprintf(out, "/C%03d ", color->pixel); + if (uStrCaseEqual(color->spec, "black")) { + state->black = color->pixel; + fprintf(out, "{ 0 setgray } def %% %s\n", color->spec); } - else if (uStrCaseEqual(color->spec,"white")) { - state->white= color->pixel; - fprintf(out,"{ 1 setgray } def %% %s\n",color->spec); + else if (uStrCaseEqual(color->spec, "white")) { + state->white = color->pixel; + fprintf(out, "{ 1 setgray } def %% %s\n", color->spec); } - else if ((sscanf(color->spec,"grey%d",&tmp)==1)|| - (sscanf(color->spec,"gray%d",&tmp)==1)|| - (sscanf(color->spec,"Grey%d",&tmp)==1)|| - (sscanf(color->spec,"Gray%d",&tmp)==1)) { - fprintf(out,"{ %f setgray } def %% %s\n",1.0-(((float)tmp)/100.0), - color->spec); + else if ((sscanf(color->spec, "grey%d", &tmp) == 1) || + (sscanf(color->spec, "gray%d", &tmp) == 1) || + (sscanf(color->spec, "Grey%d", &tmp) == 1) || + (sscanf(color->spec, "Gray%d", &tmp) == 1)) { + fprintf(out, "{ %f setgray } def %% %s\n", + 1.0 - (((float) tmp) / 100.0), color->spec); } - else if ((tmp=(uStrCaseEqual(color->spec,"red")*100))|| - (sscanf(color->spec,"red%d",&tmp)==1)) { - fprintf(out,"{ %f 0 0 setrgbcolor } def %% %s\n",(((float)tmp)/100.0), - color->spec); + else if ((tmp = (uStrCaseEqual(color->spec, "red") * 100)) || + (sscanf(color->spec, "red%d", &tmp) == 1)) { + fprintf(out, "{ %f 0 0 setrgbcolor } def %% %s\n", + (((float) tmp) / 100.0), color->spec); } - else if ((tmp=(uStrCaseEqual(color->spec,"green")*100))|| - (sscanf(color->spec,"green%d",&tmp)==1)) { - fprintf(out,"{ 0 %f 0 setrgbcolor } def %% %s\n",(((float)tmp)/100.0), - color->spec); + else if ((tmp = (uStrCaseEqual(color->spec, "green") * 100)) || + (sscanf(color->spec, "green%d", &tmp) == 1)) { + fprintf(out, "{ 0 %f 0 setrgbcolor } def %% %s\n", + (((float) tmp) / 100.0), color->spec); } - else if ((tmp=(uStrCaseEqual(color->spec,"blue")*100))|| - (sscanf(color->spec,"blue%d",&tmp)==1)) { - fprintf(out,"{ 0 0 %f setrgbcolor } def %% %s\n",(((float)tmp)/100.0), - color->spec); + else if ((tmp = (uStrCaseEqual(color->spec, "blue") * 100)) || + (sscanf(color->spec, "blue%d", &tmp) == 1)) { + fprintf(out, "{ 0 0 %f setrgbcolor } def %% %s\n", + (((float) tmp) / 100.0), color->spec); } - else fprintf(out,"{ 0.9 setgray } def %% BOGUS! %s\n",color->spec); + else + fprintf(out, "{ 0.9 setgray } def %% BOGUS! %s\n", color->spec); } static void -PSSetColor(FILE *out,PSState *state,int color) +PSSetColor(FILE *out, PSState *state, int color) { - if ((state->args->wantColor)&&(state->color!=color)) { - fprintf(out,"C%03d %% set color\n",color); - state->color= color; + if ((state->args->wantColor) && (state->color != color)) { + fprintf(out, "C%03d %% set color\n", color); + state->color = color; } return; } @@ -246,229 +248,264 @@ PSSetColor(FILE *out,PSState *state,int color) static void PSGSave(FILE *out, PSState *state) { - fprintf(out,"gsave\n"); + fprintf(out, "gsave\n"); return; } static void PSGRestore(FILE *out, PSState *state) { - fprintf(out,"grestore\n"); - state->color= -1; - state->font= FONT_NONE; - state->fontSize= -1; + fprintf(out, "grestore\n"); + state->color = -1; + state->font = FONT_NONE; + state->fontSize = -1; return; } static void PSShapeDef(FILE *out, PSState *state, XkbShapePtr shape) { -int o,p; -XkbOutlinePtr ol; - - fprintf(out,"/%s {\n",XkbAtomGetString(state->dpy,shape->name)); - fprintf(out," gsave translate rotate /SOLID exch def\n"); - for (o=0,ol=shape->outlines;o<shape->num_outlines;o++,ol++) { - XkbPointPtr pt; - if ((shape->num_outlines>1)&&(ol==shape->approx)) - continue; - pt=ol->points; - fprintf(out,"%% Outline %d\n",o+1); - if (ol->num_points==1) { - if (ol->corner_radius<1) { - fprintf(out," 0 0 moveto\n"); - fprintf(out," %3d 0 lineto\n",pt->x); - fprintf(out," %3d %3d lineto\n",pt->x,pt->y); - fprintf(out," 0 %3d lineto\n",pt->y); - fprintf(out," 0 0 lineto\n"); - fprintf(out," SOLID { fill } { stroke } ifelse\n"); - } - else { - fprintf(out," mark\n"); - fprintf(out," %3d 0 moveto\n",ol->corner_radius); - fprintf(out," %3d 0 %3d %3d %3d arcto\n",pt->x,pt->x,pt->y, - ol->corner_radius); - fprintf(out," %3d %3d 0 %3d %3d arcto\n",pt->x,pt->y,pt->y, - ol->corner_radius); - fprintf(out," 0 %3d 0 0 %3d arcto\n",pt->y, - ol->corner_radius); - fprintf(out," 0 0 %3d 0 %3d arcto\n",pt->x, - ol->corner_radius); - fprintf(out," SOLID { fill } { stroke } ifelse\n"); - fprintf(out," cleartomark\n"); - } - } - else if (ol->num_points==2) { - if (ol->corner_radius<1) { - fprintf(out," %3d %3d moveto\n",pt[0].x,pt[0].y); - fprintf(out," %3d %3d lineto\n",pt[1].x,pt[0].y); - fprintf(out," %3d %3d lineto\n",pt[1].x,pt[1].y); - fprintf(out," %3d %3d lineto\n",pt[0].x,pt[1].y); - fprintf(out," %3d %3d lineto\n",pt[0].x,pt[0].y); - fprintf(out," SOLID { fill } { stroke } ifelse\n"); - } - else { - fprintf(out," mark\n"); - fprintf(out," %3d %3d moveto\n",pt[0].x + ol->corner_radius,pt[0].y); - fprintf(out," %3d %3d %3d %3d %3d arcto\n",pt[1].x,pt[0].y, - pt[1].x,pt[1].y, - ol->corner_radius); - fprintf(out," %3d %3d %3d %3d %3d arcto\n",pt[1].x,pt[1].y, - pt[0].x,pt[1].y, - ol->corner_radius); - fprintf(out," %3d %3d %3d %3d %3d arcto\n",pt[0].x,pt[1].y, - pt[0].x,pt[0].y, - ol->corner_radius); - fprintf(out," %3d %3d %3d %3d %3d arcto\n",pt[0].x,pt[0].y, - pt[1].x,pt[0].y, - ol->corner_radius); - fprintf(out," SOLID { fill } { stroke } ifelse\n"); - fprintf(out," cleartomark\n"); - } - } - else { - if (ol->corner_radius<1) { - fprintf(out," %3d %3d moveto\n",pt->x,pt->y); - pt++; - for (p=1;p<ol->num_points;p++,pt++) { - fprintf(out," %3d %3d lineto\n",pt->x,pt->y); - } - if ((pt->x!=ol->points[0].x)||(pt->y!=ol->points[0].y)) - fprintf(out," closepath\n"); - fprintf(out," SOLID { fill } { stroke } ifelse\n"); - } - else { - XkbPointPtr last; - last= &pt[ol->num_points-1]; - if ((last->x==pt->x)&&(last->y==pt->y)) - last--; - fprintf(out," mark\n"); - fprintf(out," %% Determine tangent point of first corner\n"); - fprintf(out," %3d %3d moveto %d %d %d %d %d arcto\n", - last->x,last->y, - pt[0].x,pt[0].y,pt[1].x,pt[1].y, - ol->corner_radius); - fprintf(out," /TY exch def /TX exch def pop pop newpath\n"); - fprintf(out," %% Now draw the shape\n"); - fprintf(out," TX TY moveto\n"); - for (p=1;p<ol->num_points;p++) { - if (p<(ol->num_points-1)) last= &pt[p+1]; - else last= &pt[0]; - fprintf(out," %3d %3d %3d %3d %3d arcto\n", - pt[p].x,pt[p].y, - last->x,last->y, - ol->corner_radius); - } - last= &pt[ol->num_points-1]; - if ((last->x!=pt->x)||(last->y!=pt->y)) { - fprintf(out," %3d %3d %3d %3d %3d arcto\n", - pt[0].x,pt[0].y, - pt[1].x,pt[1].y, - ol->corner_radius); - } - fprintf(out," SOLID { fill } { stroke } ifelse\n"); - fprintf(out," cleartomark\n"); - } - } + int o, p; + XkbOutlinePtr ol; + + fprintf(out, "/%s {\n", XkbAtomGetString(state->dpy, shape->name)); + fprintf(out, " gsave translate rotate /SOLID exch def\n"); + for (o = 0, ol = shape->outlines; o < shape->num_outlines; o++, ol++) { + XkbPointPtr pt; + + if ((shape->num_outlines > 1) && (ol == shape->approx)) + continue; + pt = ol->points; + fprintf(out, "%% Outline %d\n", o + 1); + if (ol->num_points == 1) { + if (ol->corner_radius < 1) { + fprintf(out, " 0 0 moveto\n"); + fprintf(out, " %3d 0 lineto\n", pt->x); + fprintf(out, " %3d %3d lineto\n", pt->x, pt->y); + fprintf(out, " 0 %3d lineto\n", pt->y); + fprintf(out, " 0 0 lineto\n"); + fprintf(out, " SOLID { fill } { stroke } ifelse\n"); + } + else { + fprintf(out, " mark\n"); + fprintf(out, " %3d 0 moveto\n", ol->corner_radius); + fprintf(out, " %3d 0 %3d %3d %3d arcto\n", pt->x, pt->x, + pt->y, ol->corner_radius); + fprintf(out, " %3d %3d 0 %3d %3d arcto\n", pt->x, pt->y, + pt->y, ol->corner_radius); + fprintf(out, " 0 %3d 0 0 %3d arcto\n", pt->y, + ol->corner_radius); + fprintf(out, " 0 0 %3d 0 %3d arcto\n", pt->x, + ol->corner_radius); + fprintf(out, " SOLID { fill } { stroke } ifelse\n"); + fprintf(out, " cleartomark\n"); + } + } + else if (ol->num_points == 2) { + if (ol->corner_radius < 1) { + fprintf(out, " %3d %3d moveto\n", pt[0].x, pt[0].y); + fprintf(out, " %3d %3d lineto\n", pt[1].x, pt[0].y); + fprintf(out, " %3d %3d lineto\n", pt[1].x, pt[1].y); + fprintf(out, " %3d %3d lineto\n", pt[0].x, pt[1].y); + fprintf(out, " %3d %3d lineto\n", pt[0].x, pt[0].y); + fprintf(out, " SOLID { fill } { stroke } ifelse\n"); + } + else { + fprintf(out, " mark\n"); + fprintf(out, " %3d %3d moveto\n", pt[0].x + ol->corner_radius, + pt[0].y); + fprintf(out, " %3d %3d %3d %3d %3d arcto\n", pt[1].x, pt[0].y, + pt[1].x, pt[1].y, ol->corner_radius); + fprintf(out, " %3d %3d %3d %3d %3d arcto\n", pt[1].x, pt[1].y, + pt[0].x, pt[1].y, ol->corner_radius); + fprintf(out, " %3d %3d %3d %3d %3d arcto\n", pt[0].x, pt[1].y, + pt[0].x, pt[0].y, ol->corner_radius); + fprintf(out, " %3d %3d %3d %3d %3d arcto\n", pt[0].x, pt[0].y, + pt[1].x, pt[0].y, ol->corner_radius); + fprintf(out, " SOLID { fill } { stroke } ifelse\n"); + fprintf(out, " cleartomark\n"); + } + } + else { + if (ol->corner_radius < 1) { + fprintf(out, " %3d %3d moveto\n", pt->x, pt->y); + pt++; + for (p = 1; p < ol->num_points; p++, pt++) { + fprintf(out, " %3d %3d lineto\n", pt->x, pt->y); + } + if ((pt->x != ol->points[0].x) || (pt->y != ol->points[0].y)) + fprintf(out, " closepath\n"); + fprintf(out, " SOLID { fill } { stroke } ifelse\n"); + } + else { + XkbPointPtr last; + + last = &pt[ol->num_points - 1]; + if ((last->x == pt->x) && (last->y == pt->y)) + last--; + fprintf(out, " mark\n"); + fprintf(out, " %% Determine tangent point of first corner\n"); + fprintf(out, " %3d %3d moveto %d %d %d %d %d arcto\n", + last->x, last->y, + pt[0].x, pt[0].y, pt[1].x, pt[1].y, ol->corner_radius); + fprintf(out, " /TY exch def /TX exch def pop pop newpath\n"); + fprintf(out, " %% Now draw the shape\n"); + fprintf(out, " TX TY moveto\n"); + for (p = 1; p < ol->num_points; p++) { + if (p < (ol->num_points - 1)) + last = &pt[p + 1]; + else + last = &pt[0]; + fprintf(out, " %3d %3d %3d %3d %3d arcto\n", + pt[p].x, pt[p].y, + last->x, last->y, ol->corner_radius); + } + last = &pt[ol->num_points - 1]; + if ((last->x != pt->x) || (last->y != pt->y)) { + fprintf(out, " %3d %3d %3d %3d %3d arcto\n", + pt[0].x, pt[0].y, + pt[1].x, pt[1].y, ol->corner_radius); + } + fprintf(out, " SOLID { fill } { stroke } ifelse\n"); + fprintf(out, " cleartomark\n"); + } + } } - fprintf(out," grestore\n"); - fprintf(out,"} def\n"); + fprintf(out, " grestore\n"); + fprintf(out, "} def\n"); return; } /***====================================================================***/ -typedef struct { - char * foundry; - char * face; - char * weight; - char * slant; - char * setWidth; - char * variant; - int pixelSize; - int ptSize; - int resX; - int resY; - char * spacing; - int avgWidth; - char * encoding; +typedef struct { + char * foundry; + char * face; + char * weight; + char * slant; + char * setWidth; + char * variant; + int pixelSize; + int ptSize; + int resX; + int resY; + char * spacing; + int avgWidth; + char * encoding; } FontStuff; static void ClearFontStuff(FontStuff *stuff) { if (stuff && stuff->foundry) - uFree(stuff->foundry); - bzero(stuff,sizeof(FontStuff)); + uFree(stuff->foundry); + bzero(stuff, sizeof(FontStuff)); return; } static Bool CrackXLFDName(char *name, FontStuff *stuff) { -char *tmp; - if ((name==NULL)||(stuff==NULL)) - return False; - if (name[0]=='-') tmp= uStringDup(&name[1]); - else tmp= uStringDup(name); - if (tmp==NULL) - return False; - stuff->foundry= tmp; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - stuff->face= tmp; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - stuff->weight= tmp; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - stuff->slant= tmp; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - stuff->setWidth= tmp; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - stuff->variant= tmp; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - if (*tmp=='*') stuff->pixelSize= 0; - else if (sscanf(tmp,"%i",&stuff->pixelSize)!=1) goto BAILOUT; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - if (*tmp=='*') stuff->ptSize= 0; - else if (sscanf(tmp,"%i",&stuff->ptSize)!=1) goto BAILOUT; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - if (*tmp=='*') stuff->resX= 0; - else if (sscanf(tmp,"%i",&stuff->resX)!=1) goto BAILOUT; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - if (*tmp=='*') stuff->resY= 0; - else if (sscanf(tmp,"%i",&stuff->resY)!=1) goto BAILOUT; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - stuff->spacing= tmp; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - if (*tmp=='*') stuff->avgWidth= 0; - else if (sscanf(tmp,"%i",&stuff->avgWidth)!=1) goto BAILOUT; - - if ((tmp= index(tmp,'-'))==NULL) goto BAILOUT; - else *tmp++= '\0'; - stuff->encoding= tmp; + char *tmp; + + if ((name == NULL) || (stuff == NULL)) + return False; + if (name[0] == '-') + tmp = uStringDup(&name[1]); + else + tmp = uStringDup(name); + if (tmp == NULL) + return False; + stuff->foundry = tmp; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + stuff->face = tmp; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + stuff->weight = tmp; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + stuff->slant = tmp; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + stuff->setWidth = tmp; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + stuff->variant = tmp; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + if (*tmp == '*') + stuff->pixelSize = 0; + else if (sscanf(tmp, "%i", &stuff->pixelSize) != 1) + goto BAILOUT; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + if (*tmp == '*') + stuff->ptSize = 0; + else if (sscanf(tmp, "%i", &stuff->ptSize) != 1) + goto BAILOUT; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + if (*tmp == '*') + stuff->resX = 0; + else if (sscanf(tmp, "%i", &stuff->resX) != 1) + goto BAILOUT; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + if (*tmp == '*') + stuff->resY = 0; + else if (sscanf(tmp, "%i", &stuff->resY) != 1) + goto BAILOUT; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + stuff->spacing = tmp; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + if (*tmp == '*') + stuff->avgWidth = 0; + else if (sscanf(tmp, "%i", &stuff->avgWidth) != 1) + goto BAILOUT; + + if ((tmp = index(tmp, '-')) == NULL) + goto BAILOUT; + else + *tmp++ = '\0'; + stuff->encoding = tmp; return True; -BAILOUT: + BAILOUT: ClearFontStuff(stuff); return False; } @@ -476,219 +513,223 @@ BAILOUT: static void PSSetUpForLatin1(FILE *out, PSState *state) { - fprintf(out,"save\n"); - fprintf(out,"/ISOLatin1Encoding where {pop save true}{false} ifelse\n"); - fprintf(out,"/ISOLatin1Encoding [\n"); - fprintf(out," /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); - fprintf(out," /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); - fprintf(out," /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); - fprintf(out," /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); - fprintf(out," /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); - fprintf(out," /.notdef /.notdef /space /exclam /quotedbl /numbersign\n"); - fprintf(out," /dollar /percent /ampersand /quoteright /parenleft\n"); - fprintf(out," /parenright /asterisk /plus /comma /minus /period\n"); - fprintf(out," /slash /zero /one /two /three /four /five /six /seven\n"); - fprintf(out," /eight /nine /colon /semicolon /less /equal /greater\n"); - fprintf(out," /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M\n"); - fprintf(out," /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft\n"); - fprintf(out," /backslash /bracketright /asciicircum /underscore\n"); - fprintf(out," /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m\n"); - fprintf(out," /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft\n"); - fprintf(out," /bar /braceright /asciitilde /guilsinglright /fraction\n"); - fprintf(out," /florin /quotesingle /quotedblleft /guilsinglleft /fi\n"); - fprintf(out," /fl /endash /dagger /daggerdbl /bullet /quotesinglbase\n"); - fprintf(out," /quotedblbase /quotedblright /ellipsis /trademark\n"); - fprintf(out," /perthousand /grave /scaron /circumflex /Scaron /tilde\n"); - fprintf(out," /breve /zcaron /dotaccent /dotlessi /Zcaron /ring\n"); - fprintf(out," /hungarumlaut /ogonek /caron /emdash /space /exclamdown\n"); - fprintf(out," /cent /sterling /currency /yen /brokenbar /section\n"); - fprintf(out," /dieresis /copyright /ordfeminine /guillemotleft\n"); - fprintf(out," /logicalnot /hyphen /registered /macron /degree\n"); - fprintf(out," /plusminus /twosuperior /threesuperior /acute /mu\n"); - fprintf(out," /paragraph /periodcentered /cedilla /onesuperior\n"); - fprintf(out," /ordmasculine /guillemotright /onequarter /onehalf\n"); - fprintf(out," /threequarters /questiondown /Agrave /Aacute\n"); - fprintf(out," /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n"); - fprintf(out," /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute\n"); - fprintf(out," /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute\n"); - fprintf(out," /Ocircumflex /Otilde /Odieresis /multiply /Oslash\n"); - fprintf(out," /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn\n"); - fprintf(out," /germandbls /agrave /aacute /acircumflex /atilde\n"); - fprintf(out," /adieresis /aring /ae /ccedilla /egrave /eacute\n"); - fprintf(out," /ecircumflex /edieresis /igrave /iacute /icircumflex\n"); - fprintf(out," /idieresis /eth /ntilde /ograve /oacute /ocircumflex\n"); - fprintf(out," /otilde /odieresis /divide /oslash /ugrave /uacute\n"); - fprintf(out," /ucircumflex /udieresis /yacute /thorn /ydieresis\n"); - fprintf(out,"] def {restore} if\n"); - fprintf(out,"/reencodeISO-1 {\n"); - fprintf(out," dup length dict begin\n"); - fprintf(out," {1 index /FID ne {def}{pop pop} ifelse} forall\n"); - fprintf(out," /Encoding ISOLatin1Encoding def\n"); - fprintf(out," currentdict\n"); - fprintf(out," end\n"); - fprintf(out,"} def\n"); + fprintf(out, "save\n"); + fprintf(out, "/ISOLatin1Encoding where {pop save true}{false} ifelse\n"); + fprintf(out, "/ISOLatin1Encoding [\n"); + fprintf(out, " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); + fprintf(out, " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); + fprintf(out, " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); + fprintf(out, " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); + fprintf(out, " /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n"); + fprintf(out, " /.notdef /.notdef /space /exclam /quotedbl /numbersign\n"); + fprintf(out, " /dollar /percent /ampersand /quoteright /parenleft\n"); + fprintf(out, " /parenright /asterisk /plus /comma /minus /period\n"); + fprintf(out, " /slash /zero /one /two /three /four /five /six /seven\n"); + fprintf(out, " /eight /nine /colon /semicolon /less /equal /greater\n"); + fprintf(out, " /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M\n"); + fprintf(out, " /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft\n"); + fprintf(out, " /backslash /bracketright /asciicircum /underscore\n"); + fprintf(out, " /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m\n"); + fprintf(out, " /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft\n"); + fprintf(out, " /bar /braceright /asciitilde /guilsinglright /fraction\n"); + fprintf(out, " /florin /quotesingle /quotedblleft /guilsinglleft /fi\n"); + fprintf(out, " /fl /endash /dagger /daggerdbl /bullet /quotesinglbase\n"); + fprintf(out, " /quotedblbase /quotedblright /ellipsis /trademark\n"); + fprintf(out, " /perthousand /grave /scaron /circumflex /Scaron /tilde\n"); + fprintf(out, " /breve /zcaron /dotaccent /dotlessi /Zcaron /ring\n"); + fprintf(out, + " /hungarumlaut /ogonek /caron /emdash /space /exclamdown\n"); + fprintf(out, " /cent /sterling /currency /yen /brokenbar /section\n"); + fprintf(out, " /dieresis /copyright /ordfeminine /guillemotleft\n"); + fprintf(out, " /logicalnot /hyphen /registered /macron /degree\n"); + fprintf(out, " /plusminus /twosuperior /threesuperior /acute /mu\n"); + fprintf(out, " /paragraph /periodcentered /cedilla /onesuperior\n"); + fprintf(out, " /ordmasculine /guillemotright /onequarter /onehalf\n"); + fprintf(out, " /threequarters /questiondown /Agrave /Aacute\n"); + fprintf(out, " /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n"); + fprintf(out, + " /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute\n"); + fprintf(out, " /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute\n"); + fprintf(out, " /Ocircumflex /Otilde /Odieresis /multiply /Oslash\n"); + fprintf(out, " /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn\n"); + fprintf(out, " /germandbls /agrave /aacute /acircumflex /atilde\n"); + fprintf(out, " /adieresis /aring /ae /ccedilla /egrave /eacute\n"); + fprintf(out, " /ecircumflex /edieresis /igrave /iacute /icircumflex\n"); + fprintf(out, " /idieresis /eth /ntilde /ograve /oacute /ocircumflex\n"); + fprintf(out, " /otilde /odieresis /divide /oslash /ugrave /uacute\n"); + fprintf(out, " /ucircumflex /udieresis /yacute /thorn /ydieresis\n"); + fprintf(out, "] def {restore} if\n"); + fprintf(out, "/reencodeISO-1 {\n"); + fprintf(out, " dup length dict begin\n"); + fprintf(out, " {1 index /FID ne {def}{pop pop} ifelse} forall\n"); + fprintf(out, " /Encoding ISOLatin1Encoding def\n"); + fprintf(out, " currentdict\n"); + fprintf(out, " end\n"); + fprintf(out, "} def\n"); } static void PSReencodeLatin1Font(FILE *out, char *font) { - fprintf(out,"/%s findfont reencodeISO-1\n",font); - fprintf(out," /%s-8859-1 exch definefont pop\n",font); + fprintf(out, "/%s findfont reencodeISO-1\n", font); + fprintf(out, " /%s-8859-1 exch definefont pop\n", font); return; } static void PSSetUpFonts(FILE *out, char *textFont, int size) { - fprintf(out,"/F%d { /%s findfont exch scalefont setfont } def\n", - FONT_TEXT,textFont); - fprintf(out,"/F%d { /%s-8859-1 findfont exch scalefont setfont } def\n", - FONT_LATIN1,textFont); - fprintf(out,"/F%d { /%s findfont exch scalefont setfont } def\n", - FONT_SYMBOL,"Symbol"); - fprintf(out,"/F%d { /%s findfont exch scalefont setfont } def\n", - FONT_ISOCAPS,"IsoKeyCaps"); + fprintf(out, "/F%d { /%s findfont exch scalefont setfont } def\n", + FONT_TEXT, textFont); + fprintf(out, "/F%d { /%s-8859-1 findfont exch scalefont setfont } def\n", + FONT_LATIN1, textFont); + fprintf(out, "/F%d { /%s findfont exch scalefont setfont } def\n", + FONT_SYMBOL, "Symbol"); + fprintf(out, "/F%d { /%s findfont exch scalefont setfont } def\n", + FONT_ISOCAPS, "IsoKeyCaps"); return; } static void PSSetFont(FILE *out, PSState *state, int font, int size, int pts) { - if ((state->font!=font)||(state->fontSize!=size)) { - fprintf(out,"%d %sF%d\n",size,(pts?"pts ":""),font); - state->font= font; - state->fontSize= size; + if ((state->font != font) || (state->fontSize != size)) { + fprintf(out, "%d %sF%d\n", size, (pts ? "pts " : ""), font); + state->font = font; + state->fontSize = size; } return; } - static void PSProlog(FILE *out, PSState *state) { -register int i; + register int i; if (!state->args->wantEPS) { - fprintf(out,"%%!PS-Adobe-2.0\n"); - fprintf(out,"%%%%Creator: xkbprint\n"); - if (state->geom->name!=None) - fprintf(out,"%%%%Title: %s\n", - XkbAtomGetString(state->dpy,state->geom->name)); - fprintf(out,"%%%%BoundingBox: (atend)\n"); - fprintf(out,"%%%%Pages: 1\n"); - fprintf(out,"%%%%PageOrder: Ascend\n"); - fprintf(out,"%%%%DocumentFonts: (atend)\n"); - fprintf(out,"%%%%DocumentData: Clean7Bit\n"); - fprintf(out,"%%%%Orientation: Landscape\n"); - fprintf(out,"%%%%EndComments\n"); - fprintf(out,"%%%%BeginProlog\n"); - fprintf(out,"%% Resolution is 1/10mm -- need pt sizes for fonts\n"); - fprintf(out,"clippath pathbbox\n"); - fprintf(out," /ury exch def /urx exch def\n"); - fprintf(out," /llx exch def /lly exch def\n"); - fprintf(out," newpath\n"); - fprintf(out,"/devwidth urx llx sub def\n"); - fprintf(out,"/devheight ury lly sub def\n"); + fprintf(out, "%%!PS-Adobe-2.0\n"); + fprintf(out, "%%%%Creator: xkbprint\n"); + if (state->geom->name != None) + fprintf(out, "%%%%Title: %s\n", + XkbAtomGetString(state->dpy, state->geom->name)); + fprintf(out, "%%%%BoundingBox: (atend)\n"); + fprintf(out, "%%%%Pages: 1\n"); + fprintf(out, "%%%%PageOrder: Ascend\n"); + fprintf(out, "%%%%DocumentFonts: (atend)\n"); + fprintf(out, "%%%%DocumentData: Clean7Bit\n"); + fprintf(out, "%%%%Orientation: Landscape\n"); + fprintf(out, "%%%%EndComments\n"); + fprintf(out, "%%%%BeginProlog\n"); + fprintf(out, "%% Resolution is 1/10mm -- need pt sizes for fonts\n"); + fprintf(out, "clippath pathbbox\n"); + fprintf(out, " /ury exch def /urx exch def\n"); + fprintf(out, " /llx exch def /lly exch def\n"); + fprintf(out, " newpath\n"); + fprintf(out, "/devwidth urx llx sub def\n"); + fprintf(out, "/devheight ury lly sub def\n"); } else { - int w,h; - int pw,ph; - - w= (((state->geom->width_mm*72)/254)*11)/10; - h= (((state->geom->height_mm*72)/254)*11)/10; - if (state->kbPerPage>1) - h*= (state->kbPerPage+1); - - if (w<=h) { - pw= 7.5*72; - ph= 10*72; - } - else { - pw= 10*72; - ph= 7.5*72; - } - while ((w>pw)||(h>ph)) { - w= (w*9)/10; - h= (h*9)/10; - } - - fprintf(out,"%%!PS-Adobe-2.0 EPSF-2.0\n"); - fprintf(out,"%%%%BoundingBox: 0 0 %d %d\n",w,h); - fprintf(out,"%%%%Creator: xkbprint\n"); - if (state->geom->name!=None) - fprintf(out,"%%%%Title: %s\n", - XkbAtomGetString(state->dpy,state->geom->name)); - fprintf(out,"%%%%Pages: 1\n"); - fprintf(out,"%%%%EndComments\n"); - fprintf(out,"%%%%BeginProlog\n"); - fprintf(out,"/ury 0 def /urx 0 def\n"); - fprintf(out,"/llx %d def /lly %d def\n",w,h); - fprintf(out,"/devwidth %d def /devheight %d def\n",w,h); + int w, h; + int pw, ph; + + w = (((state->geom->width_mm * 72) / 254) * 11) / 10; + h = (((state->geom->height_mm * 72) / 254) * 11) / 10; + if (state->kbPerPage > 1) + h *= (state->kbPerPage + 1); + + if (w <= h) { + pw = 7.5 * 72; + ph = 10 * 72; + } + else { + pw = 10 * 72; + ph = 7.5 * 72; + } + while ((w > pw) || (h > ph)) { + w = (w * 9) / 10; + h = (h * 9) / 10; + } + + fprintf(out, "%%!PS-Adobe-2.0 EPSF-2.0\n"); + fprintf(out, "%%%%BoundingBox: 0 0 %d %d\n", w, h); + fprintf(out, "%%%%Creator: xkbprint\n"); + if (state->geom->name != None) + fprintf(out, "%%%%Title: %s\n", + XkbAtomGetString(state->dpy, state->geom->name)); + fprintf(out, "%%%%Pages: 1\n"); + fprintf(out, "%%%%EndComments\n"); + fprintf(out, "%%%%BeginProlog\n"); + fprintf(out, "/ury 0 def /urx 0 def\n"); + fprintf(out, "/llx %d def /lly %d def\n", w, h); + fprintf(out, "/devwidth %d def /devheight %d def\n", w, h); } - fprintf(out,"/kbdwidth %d def\n",state->geom->width_mm); - fprintf(out,"/kbdheight %d def\n",state->geom->height_mm); - fprintf(out,"/pts { 254 mul 72 div } def\n"); - fprintf(out,"/mm10 { 72 mul 254 div } def\n"); - fprintf(out,"/landscape? {\n"); - fprintf(out," devheight devwidth gt {\n"); - fprintf(out," /pwidth devheight def /pheight devwidth def\n"); - fprintf(out," 0 devheight translate\n"); - fprintf(out," -90 rotate\n"); - fprintf(out," } {\n"); - fprintf(out," /pwidth devwidth def /pheight devheight def\n"); - fprintf(out," } ifelse\n"); - fprintf(out," 0 pheight translate\n"); - fprintf(out," 1 -1 scale\n"); - fprintf(out,"} def\n"); - fprintf(out,"/centeroffset {\n"); - fprintf(out," /S exch def\n"); - fprintf(out," /HEIGHT exch def\n"); - fprintf(out," /WIDTH exch def\n"); - fprintf(out," S stringwidth /SH exch def /SW exch def\n"); - fprintf(out," WIDTH SW sub 2 div\n"); - fprintf(out," HEIGHT SH sub 2 div\n"); - fprintf(out,"} def\n"); - PSSetUpForLatin1(out,state); - PSReencodeLatin1Font(out,DFLT_LABEL_FONT); + fprintf(out, "/kbdwidth %d def\n", state->geom->width_mm); + fprintf(out, "/kbdheight %d def\n", state->geom->height_mm); + fprintf(out, "/pts { 254 mul 72 div } def\n"); + fprintf(out, "/mm10 { 72 mul 254 div } def\n"); + fprintf(out, "/landscape? {\n"); + fprintf(out, " devheight devwidth gt {\n"); + fprintf(out, " /pwidth devheight def /pheight devwidth def\n"); + fprintf(out, " 0 devheight translate\n"); + fprintf(out, " -90 rotate\n"); + fprintf(out, " } {\n"); + fprintf(out, " /pwidth devwidth def /pheight devheight def\n"); + fprintf(out, " } ifelse\n"); + fprintf(out, " 0 pheight translate\n"); + fprintf(out, " 1 -1 scale\n"); + fprintf(out, "} def\n"); + fprintf(out, "/centeroffset {\n"); + fprintf(out, " /S exch def\n"); + fprintf(out, " /HEIGHT exch def\n"); + fprintf(out, " /WIDTH exch def\n"); + fprintf(out, " S stringwidth /SH exch def /SW exch def\n"); + fprintf(out, " WIDTH SW sub 2 div\n"); + fprintf(out, " HEIGHT SH sub 2 div\n"); + fprintf(out, "} def\n"); + PSSetUpForLatin1(out, state); + PSReencodeLatin1Font(out, DFLT_LABEL_FONT); if (state->args->wantColor) { - XkbGeometryPtr geom= state->geom; - for (i=0;i<geom->num_colors;i++) { - PSColorDef(out,state,&geom->colors[i]); - } - if (state->black<0) { - XkbColorPtr color; - if (!(color= XkbAddGeomColor(geom,"black",geom->num_colors))) - uFatalError("Couldn't allocate black color!\n"); - PSColorDef(out,state,color); - } - if (state->white<0) { - XkbColorPtr color; - if (!(color= XkbAddGeomColor(geom,"white",geom->num_colors))) - uFatalError("Couldn't allocate white color!\n"); - PSColorDef(out,state,color); - } + XkbGeometryPtr geom = state->geom; + + for (i = 0; i < geom->num_colors; i++) { + PSColorDef(out, state, &geom->colors[i]); + } + if (state->black < 0) { + XkbColorPtr color; + + if (!(color = XkbAddGeomColor(geom, "black", geom->num_colors))) + uFatalError("Couldn't allocate black color!\n"); + PSColorDef(out, state, color); + } + if (state->white < 0) { + XkbColorPtr color; + + if (!(color = XkbAddGeomColor(geom, "white", geom->num_colors))) + uFatalError("Couldn't allocate white color!\n"); + PSColorDef(out, state, color); + } } - for (i=0;i<state->geom->num_shapes;i++) { - PSShapeDef(out,state,&state->geom->shapes[i]); + for (i = 0; i < state->geom->num_shapes; i++) { + PSShapeDef(out, state, &state->geom->shapes[i]); } - if (state->args->label==LABEL_SYMBOLS) { - PSIncludeFont(out,"IsoKeyCaps"); + if (state->args->label == LABEL_SYMBOLS) { + PSIncludeFont(out, "IsoKeyCaps"); } - PSSetUpFonts(out,DFLT_LABEL_FONT, DFLT_LABEL_FONT_SIZE); - fprintf(out,"%%%%EndProlog\n"); + PSSetUpFonts(out, DFLT_LABEL_FONT, DFLT_LABEL_FONT_SIZE); + fprintf(out, "%%%%EndProlog\n"); return; } static void PSFileTrailer(FILE *out, PSState *state) { - fprintf(out,"restore\n"); + fprintf(out, "restore\n"); if (!state->args->wantEPS) - fprintf(out,"%%%%Trailer\n"); - fprintf(out,"%%%%EOF\n"); + fprintf(out, "%%%%Trailer\n"); + fprintf(out, "%%%%EOF\n"); #ifdef NOTYET - fprintf(out,"%%%%BoundingBox %d %d\n"); - fprintf(out,"%%%%DocumentFonts: \n"); + fprintf(out, "%%%%BoundingBox %d %d\n"); + fprintf(out, "%%%%DocumentFonts: \n"); #endif return; } @@ -696,314 +737,330 @@ PSFileTrailer(FILE *out, PSState *state) static void PSPageSetup(FILE *out, PSState *state, Bool drawBorder) { -XkbGeometryPtr geom; + XkbGeometryPtr geom; - geom= state->geom; - if (state->kbPerPage==1) { - fprintf(out,"%%%%Page: %d %d\n",state->nPages+1,state->nPages+1); - fprintf(out,"%%%%BeginPageSetup\n"); + geom = state->geom; + if (state->kbPerPage == 1) { + fprintf(out, "%%%%Page: %d %d\n", state->nPages + 1, state->nPages + 1); + fprintf(out, "%%%%BeginPageSetup\n"); } - else if ((state->nPages&1)==0) { /* even page */ - int realPage; - realPage= state->nPages/2+1; - fprintf(out,"%%%%Page: %d %d\n",realPage,realPage); - fprintf(out,"%%%%BeginPageSetup\n"); - fprintf(out,"%% Keyboard %d\n",state->nPages+1); - if (state->nPages==0) { - fprintf(out,"/realwidth devwidth def\n"); - fprintf(out,"/realheight devheight def\n"); - fprintf(out,"/devheight realheight 3 div def\n"); - } - fprintf(out,"0 devheight dup 2 div add translate\n"); + else if ((state->nPages & 1) == 0) { /* even page */ + int realPage; + + realPage = state->nPages / 2 + 1; + fprintf(out, "%%%%Page: %d %d\n", realPage, realPage); + fprintf(out, "%%%%BeginPageSetup\n"); + fprintf(out, "%% Keyboard %d\n", state->nPages + 1); + if (state->nPages == 0) { + fprintf(out, "/realwidth devwidth def\n"); + fprintf(out, "/realheight devheight def\n"); + fprintf(out, "/devheight realheight 3 div def\n"); + } + fprintf(out, "0 devheight dup 2 div add translate\n"); } - else { - fprintf(out,"%% Keyboard %d\n",state->nPages+1); + else { + fprintf(out, "%% Keyboard %d\n", state->nPages + 1); } - fprintf(out,"save\n"); - fprintf(out,"landscape?\n"); + fprintf(out, "save\n"); + fprintf(out, "landscape?\n"); if (state->args->scaleToFit) { - fprintf(out,"%% Scale keyboard to fit on the page\n"); - fprintf(out,"/kbdscale pwidth 72 sub kbdwidth div def\n"); - fprintf(out,"/kbdscalewidth kbdwidth kbdscale mul def\n"); - fprintf(out,"/kbdscaleheight kbdheight kbdscale mul def\n"); - fprintf(out,"/kbx 36 def\n"); - fprintf(out,"/kby pheight kbdscaleheight sub 2 div def\n"); - PSGSave(out,state); - fprintf(out,"kbx kby translate\n"); - fprintf(out,"kbdscale kbdscale scale\n"); + fprintf(out, "%% Scale keyboard to fit on the page\n"); + fprintf(out, "/kbdscale pwidth 72 sub kbdwidth div def\n"); + fprintf(out, "/kbdscalewidth kbdwidth kbdscale mul def\n"); + fprintf(out, "/kbdscaleheight kbdheight kbdscale mul def\n"); + fprintf(out, "/kbx 36 def\n"); + fprintf(out, "/kby pheight kbdscaleheight sub 2 div def\n"); + PSGSave(out, state); + fprintf(out, "kbx kby translate\n"); + fprintf(out, "kbdscale kbdscale scale\n"); } else { - fprintf(out,"%% Draw keyboard full size\n"); - fprintf(out,"/kbdscale 1 def\n"); - fprintf(out,"/kbdscalewidth kbdwidth mm10 def\n"); - fprintf(out,"/kbdscaleheight kbdheight mm10 def\n"); - fprintf(out,"/kbx pwidth kbdscalewidth sub 2 div def\n"); - fprintf(out,"/kby pheight kbdscaleheight sub 2 div def\n"); - PSGSave(out,state); - fprintf(out,"kbx kby translate\n"); - fprintf(out,"72 254 div dup scale\n"); + fprintf(out, "%% Draw keyboard full size\n"); + fprintf(out, "/kbdscale 1 def\n"); + fprintf(out, "/kbdscalewidth kbdwidth mm10 def\n"); + fprintf(out, "/kbdscaleheight kbdheight mm10 def\n"); + fprintf(out, "/kbx pwidth kbdscalewidth sub 2 div def\n"); + fprintf(out, "/kby pheight kbdscaleheight sub 2 div def\n"); + PSGSave(out, state); + fprintf(out, "kbx kby translate\n"); + fprintf(out, "72 254 div dup scale\n"); } if (drawBorder) { - if (state->args->wantColor) { - PSSetColor(out,state,geom->base_color->pixel); - fprintf(out," 0 0 moveto\n"); - fprintf(out,"%3d 0 lineto\n",geom->width_mm); - fprintf(out,"%3d %3d lineto\n",geom->width_mm,geom->height_mm); - fprintf(out," 0 %3d lineto\n",geom->height_mm); - fprintf(out,"closepath fill\n"); - } - PSSetColor(out,state,state->black); - fprintf(out," 0 0 moveto\n"); - fprintf(out,"%3d 0 lineto\n",geom->width_mm); - fprintf(out,"%3d %3d lineto\n",geom->width_mm,geom->height_mm); - fprintf(out," 0 %3d lineto\n",geom->height_mm); - fprintf(out,"closepath stroke\n"); + if (state->args->wantColor) { + PSSetColor(out, state, geom->base_color->pixel); + fprintf(out, " 0 0 moveto\n"); + fprintf(out, "%3d 0 lineto\n", geom->width_mm); + fprintf(out, "%3d %3d lineto\n", geom->width_mm, geom->height_mm); + fprintf(out, " 0 %3d lineto\n", geom->height_mm); + fprintf(out, "closepath fill\n"); + } + PSSetColor(out, state, state->black); + fprintf(out, " 0 0 moveto\n"); + fprintf(out, "%3d 0 lineto\n", geom->width_mm); + fprintf(out, "%3d %3d lineto\n", geom->width_mm, geom->height_mm); + fprintf(out, " 0 %3d lineto\n", geom->height_mm); + fprintf(out, "closepath stroke\n"); } - fprintf(out,"%%%%EndPageSetup\n"); + fprintf(out, "%%%%EndPageSetup\n"); return; } static void PSPageTrailer(FILE *out, PSState *state) { -char * name; -XkbDescPtr xkb; -XkbGeometryPtr geom; -XkbPropertyPtr prop; -int p,baseline; - - xkb= state->xkb; - geom= state->geom; - if (state->args->grid>0) { - fprintf(out,"%% Draw a %dmm grid\n",state->args->grid); - fprintf(out,"0 setlinewidth\n"); - fprintf(out,"0.25 setgray\n"); - fprintf(out," 0 %d %d {\n",state->args->grid*10,geom->width_mm); - fprintf(out," /GX exch def\n"); - fprintf(out," GX 0 moveto GX %d lineto stroke\n",geom->height_mm); - fprintf(out,"} for\n"); - fprintf(out," 0 %d %d {\n",state->args->grid*10,geom->height_mm); - fprintf(out," /GY exch def\n"); - fprintf(out," 0 GY moveto %d GY lineto stroke\n",geom->width_mm); - fprintf(out,"} for\n"); + char *name; + XkbDescPtr xkb; + XkbGeometryPtr geom; + XkbPropertyPtr prop; + int p, baseline; + + xkb = state->xkb; + geom = state->geom; + if (state->args->grid > 0) { + fprintf(out, "%% Draw a %dmm grid\n", state->args->grid); + fprintf(out, "0 setlinewidth\n"); + fprintf(out, "0.25 setgray\n"); + fprintf(out, " 0 %d %d {\n", state->args->grid * 10, geom->width_mm); + fprintf(out, " /GX exch def\n"); + fprintf(out, " GX 0 moveto GX %d lineto stroke\n", geom->height_mm); + fprintf(out, "} for\n"); + fprintf(out, " 0 %d %d {\n", state->args->grid * 10, geom->height_mm); + fprintf(out, " /GY exch def\n"); + fprintf(out, " 0 GY moveto %d GY lineto stroke\n", geom->width_mm); + fprintf(out, "} for\n"); } - PSGRestore(out,state); - name= NULL; - for (p=0,prop=geom->properties;p<geom->num_properties;p++,prop++) { - if ((prop->value!=NULL)&&(uStrCaseEqual(prop->name,"description"))) { - name= prop->value; - break; - } + PSGRestore(out, state); + name = NULL; + for (p = 0, prop = geom->properties; p < geom->num_properties; p++, prop++) { + if ((prop->value != NULL) && (uStrCaseEqual(prop->name, "description"))) { + name = prop->value; + break; + } } - if ((!state->args->wantEPS)&& - ((state->kbPerPage==1)||((state->nPages&1)==1)|| - (state->nPages==state->totalKB))) { - if ((name==NULL)&&(geom->name!=None)) - name= XkbAtomGetString(state->dpy,geom->name); - - baseline= 16; - if ((name!=NULL)||(state->args->label==LABEL_SYMBOLS)) { - PSSetColor(out,state,state->black); - PSSetFont(out,state,FONT_LATIN1,14,False); - } - if (state->args->label==LABEL_SYMBOLS) { - char buf[40],*sName= NULL, *lbuf; - Atom sAtom; - - if (state->args->nLabelGroups==1) - sprintf(buf,"Group %d",state->args->baseLabelGroup+1); - else sprintf(buf,"Groups %d-%d",state->args->baseLabelGroup+1, - state->args->baseLabelGroup+state->args->nLabelGroups); - fprintf(out,"kbx kbdscalewidth 0 (%s) centeroffset pop add\n",buf); - fprintf(out," kby kbdscaleheight add %d add\n",baseline); - fprintf(out," moveto\n"); - fprintf(out,"1 -1 scale (%s) show 1 -1 scale\n",buf); - baseline+= 16; - - if (xkb->names!=NULL) sAtom= xkb->names->symbols; - else sAtom= None; - if (sAtom!=None) - sName= XkbAtomGetString(state->dpy,sAtom); - if (sName==NULL) - sName= "(unknown)"; - - lbuf = uAlloc(10+strlen(sName)); - if (!lbuf) { - uFatalError("Can't allocate memory for string\n"); - } - sprintf(lbuf,"Layout: %s",sName); - fprintf(out,"kbx kbdscalewidth 0 (%s) centeroffset pop add\n",lbuf); - fprintf(out," kby kbdscaleheight add %d add\n",baseline); - fprintf(out," moveto\n"); - fprintf(out,"1 -1 scale (%s) show 1 -1 scale\n",lbuf); - baseline+= 16; - free(lbuf); - } - if (name!=NULL) { - fprintf(out,"kbx kbdscalewidth 0 (%s) centeroffset pop add\n",name); - fprintf(out," kby kbdscaleheight add %d add\n",baseline); - fprintf(out," moveto\n"); - fprintf(out,"1 -1 scale (%s) show 1 -1 scale\n",name); - baseline+= 16; - } - if (state->args->label==LABEL_KEYCODE) { - char *sName= NULL, *lbuf; - Atom sAtom; - - if (xkb->names!=NULL) sAtom= xkb->names->keycodes; - else sAtom= None; - if (sAtom!=None) - sName= XkbAtomGetString(state->dpy,sAtom); - if (sName==NULL) - sName= "(unknown)"; - - lbuf = uAlloc(12+strlen(sName)); - if (!lbuf) { - uFatalError("Can't allocate memory for string\n"); - } - sprintf(lbuf,"Keycodes: %s",sName); - fprintf(out,"kbx kbdscalewidth 0 (%s) centeroffset pop add\n",lbuf); - fprintf(out," kby kbdscaleheight add %d add\n",baseline); - fprintf(out," moveto\n"); - fprintf(out,"1 -1 scale (%s) show 1 -1 scale\n",lbuf); - baseline+= 16; - free(lbuf); - } - if (state->args->copies>1) { - for (p=1;p<state->args->copies;p++) - fprintf(out,"copypage\n"); - } - fprintf(out,"showpage\n"); - fprintf(out,"restore\n"); - fprintf(out,"%% Done with keyboard/page %d\n",state->nPages+1); + if ((!state->args->wantEPS) && + ((state->kbPerPage == 1) || ((state->nPages & 1) == 1) || + (state->nPages == state->totalKB))) { + if ((name == NULL) && (geom->name != None)) + name = XkbAtomGetString(state->dpy, geom->name); + + baseline = 16; + if ((name != NULL) || (state->args->label == LABEL_SYMBOLS)) { + PSSetColor(out, state, state->black); + PSSetFont(out, state, FONT_LATIN1, 14, False); + } + if (state->args->label == LABEL_SYMBOLS) { + char buf[40], *sName = NULL, *lbuf; + Atom sAtom; + + if (state->args->nLabelGroups == 1) + sprintf(buf, "Group %d", state->args->baseLabelGroup + 1); + else + sprintf(buf, "Groups %d-%d", state->args->baseLabelGroup + 1, + state->args->baseLabelGroup + + state->args->nLabelGroups); + fprintf(out, "kbx kbdscalewidth 0 (%s) centeroffset pop add\n", + buf); + fprintf(out, " kby kbdscaleheight add %d add\n", baseline); + fprintf(out, " moveto\n"); + fprintf(out, "1 -1 scale (%s) show 1 -1 scale\n", buf); + baseline += 16; + + if (xkb->names != NULL) + sAtom = xkb->names->symbols; + else + sAtom = None; + if (sAtom != None) + sName = XkbAtomGetString(state->dpy, sAtom); + if (sName == NULL) + sName = "(unknown)"; + + lbuf = uAlloc(10 + strlen(sName)); + if (!lbuf) { + uFatalError("Can't allocate memory for string\n"); + } + sprintf(lbuf, "Layout: %s", sName); + fprintf(out, "kbx kbdscalewidth 0 (%s) centeroffset pop add\n", + lbuf); + fprintf(out, " kby kbdscaleheight add %d add\n", baseline); + fprintf(out, " moveto\n"); + fprintf(out, "1 -1 scale (%s) show 1 -1 scale\n", lbuf); + baseline += 16; + free(lbuf); + } + if (name != NULL) { + fprintf(out, "kbx kbdscalewidth 0 (%s) centeroffset pop add\n", + name); + fprintf(out, " kby kbdscaleheight add %d add\n", baseline); + fprintf(out, " moveto\n"); + fprintf(out, "1 -1 scale (%s) show 1 -1 scale\n", name); + baseline += 16; + } + if (state->args->label == LABEL_KEYCODE) { + char *sName = NULL, *lbuf; + Atom sAtom; + + if (xkb->names != NULL) + sAtom = xkb->names->keycodes; + else + sAtom = None; + if (sAtom != None) + sName = XkbAtomGetString(state->dpy, sAtom); + if (sName == NULL) + sName = "(unknown)"; + + lbuf = uAlloc(12 + strlen(sName)); + if (!lbuf) { + uFatalError("Can't allocate memory for string\n"); + } + sprintf(lbuf, "Keycodes: %s", sName); + fprintf(out, "kbx kbdscalewidth 0 (%s) centeroffset pop add\n", + lbuf); + fprintf(out, " kby kbdscaleheight add %d add\n", baseline); + fprintf(out, " moveto\n"); + fprintf(out, "1 -1 scale (%s) show 1 -1 scale\n", lbuf); + baseline += 16; + free(lbuf); + } + if (state->args->copies > 1) { + for (p = 1; p < state->args->copies; p++) + fprintf(out, "copypage\n"); + } + fprintf(out, "showpage\n"); + fprintf(out, "restore\n"); + fprintf(out, "%% Done with keyboard/page %d\n", state->nPages + 1); } else { - if ((!state->args->wantEPS)&&(state->args->label==LABEL_SYMBOLS)) { - char buf[40]; - baseline= 16; - PSSetColor(out,state,state->black); - PSSetFont(out,state,FONT_LATIN1,14,False); - if (state->args->nLabelGroups==1) - sprintf(buf,"Group %d",state->args->baseLabelGroup+1); - else sprintf(buf,"Groups %d-%d",state->args->baseLabelGroup+1, - state->args->baseLabelGroup+state->args->nLabelGroups+1); - fprintf(out,"kbx kbdscalewidth 0 (%s) centeroffset pop add\n",buf); - fprintf(out," kby kbdscaleheight add %d add\n",baseline); - fprintf(out," moveto\n"); - fprintf(out,"1 -1 scale (%s) show 1 -1 scale\n",buf); - baseline+= 16; - } - fprintf(out,"restore\n"); - fprintf(out,"%% Done with keyboard %d\n",state->nPages+1); - fprintf(out,"0 devheight -1 mul translate %% next keyboard\n"); + if ((!state->args->wantEPS) && (state->args->label == LABEL_SYMBOLS)) { + char buf[40]; + + baseline = 16; + PSSetColor(out, state, state->black); + PSSetFont(out, state, FONT_LATIN1, 14, False); + if (state->args->nLabelGroups == 1) + sprintf(buf, "Group %d", state->args->baseLabelGroup + 1); + else + sprintf(buf, "Groups %d-%d", state->args->baseLabelGroup + 1, + state->args->baseLabelGroup + + state->args->nLabelGroups + 1); + fprintf(out, "kbx kbdscalewidth 0 (%s) centeroffset pop add\n", + buf); + fprintf(out, " kby kbdscaleheight add %d add\n", baseline); + fprintf(out, " moveto\n"); + fprintf(out, "1 -1 scale (%s) show 1 -1 scale\n", buf); + baseline += 16; + } + fprintf(out, "restore\n"); + fprintf(out, "%% Done with keyboard %d\n", state->nPages + 1); + fprintf(out, "0 devheight -1 mul translate %% next keyboard\n"); } state->nPages++; - state->color= state->black; - state->font= -1; + state->color = state->black; + state->font = -1; return; } static void PSDoodad(FILE *out, PSState *state, XkbDoodadPtr doodad) { -XkbDescPtr xkb; -char *name,*dname; -int sz,leading; - - xkb= state->xkb; - if (doodad->any.name!=None) - dname= XkbAtomGetString(xkb->dpy,doodad->any.name); - else dname= "NoName"; + XkbDescPtr xkb; + char *name, *dname; + int sz, leading; + + xkb = state->xkb; + if (doodad->any.name != None) + dname = XkbAtomGetString(xkb->dpy, doodad->any.name); + else + dname = "NoName"; switch (doodad->any.type) { - case XkbOutlineDoodad: - case XkbSolidDoodad: - name= XkbAtomGetString(xkb->dpy, - XkbShapeDoodadShape(xkb->geom,&doodad->shape)->name); - if (state->args->wantColor) { - PSSetColor(out,state,doodad->shape.color_ndx); - if (doodad->any.type!=XkbOutlineDoodad) { - fprintf(out,"true %d %d %d %s %% Doodad %s\n", - doodad->shape.angle, - doodad->shape.left,doodad->shape.top, - name,dname); - PSSetColor(out,state,state->black); - } - fprintf(out,"false %d %d %d %s %% Doodad %s\n", - doodad->shape.angle, - doodad->shape.left,doodad->shape.top, - name,dname); - } - else { - fprintf(out,"false %d %d %d %s %% Doodad %s\n", - doodad->shape.angle, - doodad->shape.left,doodad->shape.top, - name,dname); - } - break; - case XkbTextDoodad: - fprintf(out,"%% Doodad %s\n",dname); - PSSetColor(out,state,doodad->text.color_ndx); - PSGSave(out,state); - fprintf(out,"%d %d translate\n",doodad->text.left,doodad->text.top); - if (doodad->text.angle!=0) - fprintf(out,"%s rotate\n", - XkbGeomFPText(doodad->text.angle,XkbMessage)); - sz= 14; - if (doodad->text.font) { - FontStuff stuff; - if (CrackXLFDName(doodad->text.font,&stuff)) { - if (stuff.ptSize>0) - sz= stuff.ptSize/10; - ClearFontStuff(&stuff); - } - } - PSSetFont(out,state,FONT_LATIN1,sz,True); - leading= (sz*12)/10; - if (strchr(doodad->text.text,'\n')==NULL) { - fprintf(out,"0 %d pts moveto 1 -1 scale\n",(leading*8)/10); - fprintf(out,"(%s) show\n",doodad->text.text); - } - else { - char *tmp,*buf,*end; - int offset= (leading*8/10); - tmp= buf= uStringDup(doodad->text.text); - while (tmp!=NULL) { - end= strchr(tmp,'\n'); - if (end!=NULL) - *end++= '\0'; - fprintf(out,"0 %d pts moveto 1 -1 scale\n",offset); - fprintf(out,"(%s) show 1 -1 scale\n",tmp); - offset+= leading; - tmp= end; - } - free(buf); - } - PSGRestore(out,state); - break; - case XkbIndicatorDoodad: - name= XkbAtomGetString(xkb->dpy, - XkbIndicatorDoodadShape(xkb->geom,&doodad->indicator)->name); - if (state->args->wantColor) { - PSSetColor(out,state,doodad->indicator.off_color_ndx); - fprintf(out,"true 0 %d %d %s %% Doodad %s\n", - doodad->indicator.left,doodad->indicator.top, - name,dname); - PSSetColor(out,state,state->black); - } - fprintf(out,"false 0 %d %d %s %% Doodad %s\n", - doodad->indicator.left,doodad->indicator.top, - name,dname); - break; - case XkbLogoDoodad: - name= XkbAtomGetString(xkb->dpy, - XkbLogoDoodadShape(xkb->geom,&doodad->logo)->name); - if (state->args->wantColor) - PSSetColor(out,state,doodad->shape.color_ndx); - fprintf(out,"false %d %d %d %s %% Doodad %s\n", - doodad->shape.angle, - doodad->shape.left,doodad->shape.top, - name,dname); - break; + case XkbOutlineDoodad: + case XkbSolidDoodad: + name = XkbAtomGetString(xkb->dpy, + XkbShapeDoodadShape(xkb->geom, + &doodad->shape)->name); + if (state->args->wantColor) { + PSSetColor(out, state, doodad->shape.color_ndx); + if (doodad->any.type != XkbOutlineDoodad) { + fprintf(out, "true %d %d %d %s %% Doodad %s\n", + doodad->shape.angle, + doodad->shape.left, doodad->shape.top, name, dname); + PSSetColor(out, state, state->black); + } + fprintf(out, "false %d %d %d %s %% Doodad %s\n", + doodad->shape.angle, + doodad->shape.left, doodad->shape.top, name, dname); + } + else { + fprintf(out, "false %d %d %d %s %% Doodad %s\n", + doodad->shape.angle, + doodad->shape.left, doodad->shape.top, name, dname); + } + break; + case XkbTextDoodad: + fprintf(out, "%% Doodad %s\n", dname); + PSSetColor(out, state, doodad->text.color_ndx); + PSGSave(out, state); + fprintf(out, "%d %d translate\n", doodad->text.left, doodad->text.top); + if (doodad->text.angle != 0) + fprintf(out, "%s rotate\n", + XkbGeomFPText(doodad->text.angle, XkbMessage)); + sz = 14; + if (doodad->text.font) { + FontStuff stuff; + + if (CrackXLFDName(doodad->text.font, &stuff)) { + if (stuff.ptSize > 0) + sz = stuff.ptSize / 10; + ClearFontStuff(&stuff); + } + } + PSSetFont(out, state, FONT_LATIN1, sz, True); + leading = (sz * 12) / 10; + if (strchr(doodad->text.text, '\n') == NULL) { + fprintf(out, "0 %d pts moveto 1 -1 scale\n", (leading * 8) / 10); + fprintf(out, "(%s) show\n", doodad->text.text); + } + else { + char *tmp, *buf, *end; + int offset = (leading * 8 / 10); + + tmp = buf = uStringDup(doodad->text.text); + while (tmp != NULL) { + end = strchr(tmp, '\n'); + if (end != NULL) + *end++ = '\0'; + fprintf(out, "0 %d pts moveto 1 -1 scale\n", offset); + fprintf(out, "(%s) show 1 -1 scale\n", tmp); + offset += leading; + tmp = end; + } + free(buf); + } + PSGRestore(out, state); + break; + case XkbIndicatorDoodad: + name = XkbAtomGetString(xkb->dpy, + XkbIndicatorDoodadShape(xkb->geom, + &doodad->indicator)-> + name); + if (state->args->wantColor) { + PSSetColor(out, state, doodad->indicator.off_color_ndx); + fprintf(out, "true 0 %d %d %s %% Doodad %s\n", + doodad->indicator.left, doodad->indicator.top, name, dname); + PSSetColor(out, state, state->black); + } + fprintf(out, "false 0 %d %d %s %% Doodad %s\n", + doodad->indicator.left, doodad->indicator.top, name, dname); + break; + case XkbLogoDoodad: + name = XkbAtomGetString(xkb->dpy, + XkbLogoDoodadShape(xkb->geom, + &doodad->logo)->name); + if (state->args->wantColor) + PSSetColor(out, state, doodad->shape.color_ndx); + fprintf(out, "false %d %d %d %s %% Doodad %s\n", + doodad->shape.angle, + doodad->shape.left, doodad->shape.top, name, dname); + break; } return; } @@ -1011,159 +1068,233 @@ int sz,leading; /***====================================================================***/ static Bool -PSKeycapsSymbol(KeySym sym, unsigned char *buf, - int *font_rtrn, int *sz_rtrn, PSState *state) +PSKeycapsSymbol(KeySym sym, unsigned char *buf, + int *font_rtrn, int *sz_rtrn, PSState *state) { - if (state->args->wantSymbols==NO_SYMBOLS) - return False; - - if (font_rtrn!=NULL) - *font_rtrn= FONT_ISOCAPS; - if (sz_rtrn!=NULL) - *sz_rtrn= SZ_LARGE; - buf[1]= '\0'; + if (state->args->wantSymbols == NO_SYMBOLS) + return False; + + if (font_rtrn != NULL) + *font_rtrn = FONT_ISOCAPS; + if (sz_rtrn != NULL) + *sz_rtrn = SZ_LARGE; + buf[1] = '\0'; switch (sym) { - case XK_Shift_L: case XK_Shift_R: - buf[0]= XKC_ISO_Shift; return True; - case XK_Shift_Lock: - buf[0]= XKC_ISO_Shift_Lock; return True; - case XK_ISO_Lock: - buf[0]= XKC_ISO_Caps_Lock; return True; - case XK_BackSpace: - buf[0]= XKC_ISO_Backspace; return True; - case XK_Return: - buf[0]= XKC_ISO_Return; return True; - case XK_Up: case XK_KP_Up: - buf[0]= XKC_ISO_Up; return True; - case XK_Down: case XK_KP_Down: - buf[0]= XKC_ISO_Down; return True; - case XK_Left: case XK_KP_Left: - buf[0]= XKC_ISO_Left; return True; - case XK_Right: case XK_KP_Right: - buf[0]= XKC_ISO_Right; return True; - case XK_Tab: - buf[0]= XKC_ISO_Tab; return True; - case XK_ISO_Left_Tab: - buf[0]= XKC_ISO_Left_Tab; return True; + case XK_Shift_L: + case XK_Shift_R: + buf[0] = XKC_ISO_Shift; + return True; + case XK_Shift_Lock: + buf[0] = XKC_ISO_Shift_Lock; + return True; + case XK_ISO_Lock: + buf[0] = XKC_ISO_Caps_Lock; + return True; + case XK_BackSpace: + buf[0] = XKC_ISO_Backspace; + return True; + case XK_Return: + buf[0] = XKC_ISO_Return; + return True; + case XK_Up: + case XK_KP_Up: + buf[0] = XKC_ISO_Up; + return True; + case XK_Down: + case XK_KP_Down: + buf[0] = XKC_ISO_Down; + return True; + case XK_Left: + case XK_KP_Left: + buf[0] = XKC_ISO_Left; + return True; + case XK_Right: + case XK_KP_Right: + buf[0] = XKC_ISO_Right; + return True; + case XK_Tab: + buf[0] = XKC_ISO_Tab; + return True; + case XK_ISO_Left_Tab: + buf[0] = XKC_ISO_Left_Tab; + return True; } - if (state->args->wantSymbols!=ALL_SYMBOLS) - return False; + if (state->args->wantSymbols != ALL_SYMBOLS) + return False; switch (sym) { - case XK_Caps_Lock: - buf[0]= XKC_ISO_Caps_Lock; return True; - case XK_Num_Lock: - buf[0]= XKC_ISO_Num_Lock; return True; - case XK_ISO_Level3_Shift: - buf[0]= XKC_ISO_Level3_Shift; return True; - case XK_ISO_Level3_Lock: - buf[0]= XKC_ISO_Level3_Lock; return True; - case XK_ISO_Next_Group: case XK_ISO_Group_Shift: - buf[0]= XKC_ISO_Next_Group; return True; - case XK_ISO_Next_Group_Lock: - buf[0]= XKC_ISO_Next_Group_Lock;return True; - case XK_space: - buf[0]= XKC_ISO_Space; return True; - case XK_nobreakspace: - buf[0]= XKC_ISO_No_Break_Space; return True; - case XK_Insert: - buf[0]= XKC_ISO_Insert; return True; - case XK_ISO_Continuous_Underline: - buf[0]= XKC_ISO_Continuous_Underline;return True; - case XK_ISO_Discontinuous_Underline: - buf[0]= XKC_ISO_Discontinuous_Underline;return True; - case XK_ISO_Emphasize: - buf[0]= XKC_ISO_Emphasize; return True; - case XK_Multi_key: - buf[0]= XKC_ISO_Compose; return True; - case XK_ISO_Center_Object: - buf[0]= XKC_ISO_Center_Object; return True; - case XK_Delete: - buf[0]= XKC_ISO_Delete; return True; - case XK_Clear: - buf[0]= XKC_ISO_Clear_Screen; return True; - case XK_Scroll_Lock: - buf[0]= XKC_ISO_Scroll_Lock; return True; - case XK_Help: - buf[0]= XKC_ISO_Help; return True; - case XK_Print: - buf[0]= XKC_ISO_Print_Screen; return True; - case XK_ISO_Enter: - buf[0]= XKC_ISO_Enter; return True; - case XK_Alt_L: case XK_Alt_R: - buf[0]= XKC_ISO_Alt; return True; - case XK_Control_L: case XK_Control_R: - buf[0]= XKC_ISO_Control; return True; - case XK_Pause: - buf[0]= XKC_ISO_Pause; return True; - case XK_Break: - buf[0]= XKC_ISO_Break; return True; - case XK_Escape: - buf[0]= XKC_ISO_Escape; return True; - case XK_Undo: - buf[0]= XKC_ISO_Undo; return True; - case XK_ISO_Fast_Cursor_Up: - buf[0]= XKC_ISO_Fast_Cursor_Up; return True; - case XK_ISO_Fast_Cursor_Down: - buf[0]= XKC_ISO_Fast_Cursor_Down;return True; - case XK_ISO_Fast_Cursor_Left: - buf[0]= XKC_ISO_Fast_Cursor_Left;return True; - case XK_ISO_Fast_Cursor_Right: - buf[0]= XKC_ISO_Fast_Cursor_Right;return True; - case XK_Home: - buf[0]= XKC_ISO_Home; return True; - case XK_End: - buf[0]= XKC_ISO_End; return True; - case XK_Page_Up: - buf[0]= XKC_ISO_Page_Up; return True; - case XK_Page_Down: - buf[0]= XKC_ISO_Page_Down; return True; - case XK_ISO_Move_Line_Up: - buf[0]= XKC_ISO_Move_Line_Up; return True; - case XK_ISO_Move_Line_Down: - buf[0]= XKC_ISO_Move_Line_Down; return True; - case XK_ISO_Partial_Line_Up: - buf[0]= XKC_ISO_Partial_Line_Up;return True; - case XK_ISO_Partial_Line_Down: - buf[0]= XKC_ISO_Partial_Line_Down;return True; - case XK_ISO_Partial_Space_Left: - buf[0]= XKC_ISO_Partial_Space_Left;return True; - case XK_ISO_Partial_Space_Right: - buf[0]= XKC_ISO_Partial_Space_Right;return True; - case XK_ISO_Set_Margin_Left: - buf[0]= XKC_ISO_Set_Margin_Left;return True; - case XK_ISO_Set_Margin_Right: - buf[0]= XKC_ISO_Set_Margin_Right;return True; - case XK_ISO_Release_Margin_Left: - buf[0]= XKC_ISO_Release_Margin_Left;return True; - case XK_ISO_Release_Margin_Right: - buf[0]= XKC_ISO_Release_Margin_Right;return True; - case XK_ISO_Release_Both_Margins: - buf[0]= XKC_ISO_Release_Both_Margins;return True; - case XK_ISO_Prev_Group: - buf[0]= XKC_ISO_Prev_Group; return True; - case XK_ISO_Prev_Group_Lock: - buf[0]= XKC_ISO_Prev_Group_Lock; return True; + case XK_Caps_Lock: + buf[0] = XKC_ISO_Caps_Lock; + return True; + case XK_Num_Lock: + buf[0] = XKC_ISO_Num_Lock; + return True; + case XK_ISO_Level3_Shift: + buf[0] = XKC_ISO_Level3_Shift; + return True; + case XK_ISO_Level3_Lock: + buf[0] = XKC_ISO_Level3_Lock; + return True; + case XK_ISO_Next_Group: + case XK_ISO_Group_Shift: + buf[0] = XKC_ISO_Next_Group; + return True; + case XK_ISO_Next_Group_Lock: + buf[0] = XKC_ISO_Next_Group_Lock; + return True; + case XK_space: + buf[0] = XKC_ISO_Space; + return True; + case XK_nobreakspace: + buf[0] = XKC_ISO_No_Break_Space; + return True; + case XK_Insert: + buf[0] = XKC_ISO_Insert; + return True; + case XK_ISO_Continuous_Underline: + buf[0] = XKC_ISO_Continuous_Underline; + return True; + case XK_ISO_Discontinuous_Underline: + buf[0] = XKC_ISO_Discontinuous_Underline; + return True; + case XK_ISO_Emphasize: + buf[0] = XKC_ISO_Emphasize; + return True; + case XK_Multi_key: + buf[0] = XKC_ISO_Compose; + return True; + case XK_ISO_Center_Object: + buf[0] = XKC_ISO_Center_Object; + return True; + case XK_Delete: + buf[0] = XKC_ISO_Delete; + return True; + case XK_Clear: + buf[0] = XKC_ISO_Clear_Screen; + return True; + case XK_Scroll_Lock: + buf[0] = XKC_ISO_Scroll_Lock; + return True; + case XK_Help: + buf[0] = XKC_ISO_Help; + return True; + case XK_Print: + buf[0] = XKC_ISO_Print_Screen; + return True; + case XK_ISO_Enter: + buf[0] = XKC_ISO_Enter; + return True; + case XK_Alt_L: + case XK_Alt_R: + buf[0] = XKC_ISO_Alt; + return True; + case XK_Control_L: + case XK_Control_R: + buf[0] = XKC_ISO_Control; + return True; + case XK_Pause: + buf[0] = XKC_ISO_Pause; + return True; + case XK_Break: + buf[0] = XKC_ISO_Break; + return True; + case XK_Escape: + buf[0] = XKC_ISO_Escape; + return True; + case XK_Undo: + buf[0] = XKC_ISO_Undo; + return True; + case XK_ISO_Fast_Cursor_Up: + buf[0] = XKC_ISO_Fast_Cursor_Up; + return True; + case XK_ISO_Fast_Cursor_Down: + buf[0] = XKC_ISO_Fast_Cursor_Down; + return True; + case XK_ISO_Fast_Cursor_Left: + buf[0] = XKC_ISO_Fast_Cursor_Left; + return True; + case XK_ISO_Fast_Cursor_Right: + buf[0] = XKC_ISO_Fast_Cursor_Right; + return True; + case XK_Home: + buf[0] = XKC_ISO_Home; + return True; + case XK_End: + buf[0] = XKC_ISO_End; + return True; + case XK_Page_Up: + buf[0] = XKC_ISO_Page_Up; + return True; + case XK_Page_Down: + buf[0] = XKC_ISO_Page_Down; + return True; + case XK_ISO_Move_Line_Up: + buf[0] = XKC_ISO_Move_Line_Up; + return True; + case XK_ISO_Move_Line_Down: + buf[0] = XKC_ISO_Move_Line_Down; + return True; + case XK_ISO_Partial_Line_Up: + buf[0] = XKC_ISO_Partial_Line_Up; + return True; + case XK_ISO_Partial_Line_Down: + buf[0] = XKC_ISO_Partial_Line_Down; + return True; + case XK_ISO_Partial_Space_Left: + buf[0] = XKC_ISO_Partial_Space_Left; + return True; + case XK_ISO_Partial_Space_Right: + buf[0] = XKC_ISO_Partial_Space_Right; + return True; + case XK_ISO_Set_Margin_Left: + buf[0] = XKC_ISO_Set_Margin_Left; + return True; + case XK_ISO_Set_Margin_Right: + buf[0] = XKC_ISO_Set_Margin_Right; + return True; + case XK_ISO_Release_Margin_Left: + buf[0] = XKC_ISO_Release_Margin_Left; + return True; + case XK_ISO_Release_Margin_Right: + buf[0] = XKC_ISO_Release_Margin_Right; + return True; + case XK_ISO_Release_Both_Margins: + buf[0] = XKC_ISO_Release_Both_Margins; + return True; + case XK_ISO_Prev_Group: + buf[0] = XKC_ISO_Prev_Group; + return True; + case XK_ISO_Prev_Group_Lock: + buf[0] = XKC_ISO_Prev_Group_Lock; + return True; } #ifdef NOTYET - if (font_rtrn!=NULL) - font_rtrn= FONT_MOUSECAPS; + if (font_rtrn != NULL) + font_rtrn = FONT_MOUSECAPS; switch (sym) { - case XK_Pointer_Up: - buf[0]= XKC_Mouse_Pointer_Up; return True; - case XK_Pointer_Down: - buf[0]= XKC_Mouse_Pointer_Down; return True; - case XK_Pointer_Left: - buf[0]= XKC_Mouse_Pointer_Left; return True; - case XK_Pointer_Right: - buf[0]= XKC_Mouse_Pointer_Right;return True; - case XK_Pointer_Button1: - buf[0]= XKC_Mouse_Pointer_Button1;return True; - case XK_Pointer_Button2: - buf[0]= XKC_Mouse_Pointer_Button2;return True; - case XK_Pointer_Button3: - buf[0]= XKC_Mouse_Pointer_Button3;return True; - case XK_Pointer_Button4: - buf[0]= XKC_Mouse_Pointer_Button4;return True; + case XK_Pointer_Up: + buf[0] = XKC_Mouse_Pointer_Up; + return True; + case XK_Pointer_Down: + buf[0] = XKC_Mouse_Pointer_Down; + return True; + case XK_Pointer_Left: + buf[0] = XKC_Mouse_Pointer_Left; + return True; + case XK_Pointer_Right: + buf[0] = XKC_Mouse_Pointer_Right; + return True; + case XK_Pointer_Button1: + buf[0] = XKC_Mouse_Pointer_Button1; + return True; + case XK_Pointer_Button2: + buf[0] = XKC_Mouse_Pointer_Button2; + return True; + case XK_Pointer_Button3: + buf[0] = XKC_Mouse_Pointer_Button3; + return True; + case XK_Pointer_Button4: + buf[0] = XKC_Mouse_Pointer_Button4; + return True; } #endif return False; @@ -1171,91 +1302,215 @@ PSKeycapsSymbol(KeySym sym, unsigned char *buf, static Bool PSNonLatin1Symbol(KeySym sym, unsigned char *buf, - int *font_rtrn, int *sz_rtrn, PSState *state) + int *font_rtrn, int *sz_rtrn, PSState *state) { - if (state->args->wantSymbols==NO_SYMBOLS) - return False; - - if (font_rtrn!=NULL) - *font_rtrn= FONT_TEXT; - if (sz_rtrn!=NULL) - *sz_rtrn= SZ_LARGE; - buf[1]= '\0'; + if (state->args->wantSymbols == NO_SYMBOLS) + return False; + + if (font_rtrn != NULL) + *font_rtrn = FONT_TEXT; + if (sz_rtrn != NULL) + *sz_rtrn = SZ_LARGE; + buf[1] = '\0'; switch (sym) { - case XK_breve: buf[0]= 0xC6; return True; - case XK_abovedot: buf[0]= 0xC7; return True; - case XK_doubleacute: buf[0]= 0xCD; return True; - case XK_ogonek: buf[0]= 0xCE; return True; - case XK_caron: buf[0]= 0xCF; return True; - case XK_Lstroke: buf[0]= 0xE8; return True; - case XK_idotless: buf[0]= 0xF5; return True; - case XK_lstroke: buf[0]= 0xF8; return True; + case XK_breve: + buf[0] = 0xC6; + return True; + case XK_abovedot: + buf[0] = 0xC7; + return True; + case XK_doubleacute: + buf[0] = 0xCD; + return True; + case XK_ogonek: + buf[0] = 0xCE; + return True; + case XK_caron: + buf[0] = 0xCF; + return True; + case XK_Lstroke: + buf[0] = 0xE8; + return True; + case XK_idotless: + buf[0] = 0xF5; + return True; + case XK_lstroke: + buf[0] = 0xF8; + return True; } - if (font_rtrn!=NULL) - *font_rtrn= FONT_SYMBOL; - if (sz_rtrn!=NULL) - *sz_rtrn= SZ_MEDIUM; - if ((sym&(~0xff))==0x700) { - switch (sym) { - /* Greek symbol */ - case XK_Greek_ALPHA: buf[0]= 0x41; return True; - case XK_Greek_BETA: buf[0]= 0x42; return True; - case XK_Greek_CHI: buf[0]= 0x43; return True; - case XK_Greek_DELTA: buf[0]= 0x44; return True; - case XK_Greek_EPSILON: buf[0]= 0x45; return True; - case XK_Greek_PHI: buf[0]= 0x46; return True; - case XK_Greek_GAMMA: buf[0]= 0x47; return True; - case XK_Greek_ETA: buf[0]= 0x48; return True; - case XK_Greek_IOTA: buf[0]= 0x49; return True; - case XK_Greek_KAPPA: buf[0]= 0x4B; return True; - case XK_Greek_LAMDA: buf[0]= 0x4C; return True; - case XK_Greek_MU: buf[0]= 0x4D; return True; - case XK_Greek_NU: buf[0]= 0x4E; return True; - case XK_Greek_OMICRON: buf[0]= 0x4F; return True; - case XK_Greek_PI: buf[0]= 0x50; return True; - case XK_Greek_THETA: buf[0]= 0x51; return True; - case XK_Greek_RHO: buf[0]= 0x52; return True; - case XK_Greek_SIGMA: buf[0]= 0x53; return True; - case XK_Greek_TAU: buf[0]= 0x54; return True; - case XK_Greek_UPSILON: buf[0]= 0x55; return True; - case XK_Greek_OMEGA: buf[0]= 0x57; return True; - case XK_Greek_XI: buf[0]= 0x58; return True; - case XK_Greek_PSI: buf[0]= 0x59; return True; - case XK_Greek_ZETA: buf[0]= 0x5A; return True; - - case XK_Greek_alpha: buf[0]= 0x61; return True; - case XK_Greek_beta: buf[0]= 0x62; return True; - case XK_Greek_chi: buf[0]= 0x63; return True; - case XK_Greek_delta: buf[0]= 0x64; return True; - case XK_Greek_epsilon: buf[0]= 0x65; return True; - case XK_Greek_phi: buf[0]= 0x66; return True; - case XK_Greek_gamma: buf[0]= 0x67; return True; - case XK_Greek_eta: buf[0]= 0x68; return True; - case XK_Greek_iota: buf[0]= 0x69; return True; - case XK_Greek_kappa: buf[0]= 0x6B; return True; - case XK_Greek_lamda: buf[0]= 0x6C; return True; - case XK_Greek_mu: buf[0]= 0x6D; return True; - case XK_Greek_nu: buf[0]= 0x6E; return True; - case XK_Greek_omicron: buf[0]= 0x6F; return True; - case XK_Greek_pi: buf[0]= 0x70; return True; - case XK_Greek_theta: buf[0]= 0x71; return True; - case XK_Greek_rho: buf[0]= 0x72; return True; - case XK_Greek_sigma: buf[0]= 0x73; return True; - case XK_Greek_tau: buf[0]= 0x74; return True; - case XK_Greek_upsilon: buf[0]= 0x75; return True; - case XK_Greek_omega: buf[0]= 0x77; return True; - case XK_Greek_xi: buf[0]= 0x78; return True; - case XK_Greek_psi: buf[0]= 0x79; return True; - case XK_Greek_zeta: buf[0]= 0x7A; return True; - } + if (font_rtrn != NULL) + *font_rtrn = FONT_SYMBOL; + if (sz_rtrn != NULL) + *sz_rtrn = SZ_MEDIUM; + if ((sym & (~0xff)) == 0x700) { + switch (sym) { + /* Greek symbol */ + case XK_Greek_ALPHA: + buf[0] = 0x41; + return True; + case XK_Greek_BETA: + buf[0] = 0x42; + return True; + case XK_Greek_CHI: + buf[0] = 0x43; + return True; + case XK_Greek_DELTA: + buf[0] = 0x44; + return True; + case XK_Greek_EPSILON: + buf[0] = 0x45; + return True; + case XK_Greek_PHI: + buf[0] = 0x46; + return True; + case XK_Greek_GAMMA: + buf[0] = 0x47; + return True; + case XK_Greek_ETA: + buf[0] = 0x48; + return True; + case XK_Greek_IOTA: + buf[0] = 0x49; + return True; + case XK_Greek_KAPPA: + buf[0] = 0x4B; + return True; + case XK_Greek_LAMDA: + buf[0] = 0x4C; + return True; + case XK_Greek_MU: + buf[0] = 0x4D; + return True; + case XK_Greek_NU: + buf[0] = 0x4E; + return True; + case XK_Greek_OMICRON: + buf[0] = 0x4F; + return True; + case XK_Greek_PI: + buf[0] = 0x50; + return True; + case XK_Greek_THETA: + buf[0] = 0x51; + return True; + case XK_Greek_RHO: + buf[0] = 0x52; + return True; + case XK_Greek_SIGMA: + buf[0] = 0x53; + return True; + case XK_Greek_TAU: + buf[0] = 0x54; + return True; + case XK_Greek_UPSILON: + buf[0] = 0x55; + return True; + case XK_Greek_OMEGA: + buf[0] = 0x57; + return True; + case XK_Greek_XI: + buf[0] = 0x58; + return True; + case XK_Greek_PSI: + buf[0] = 0x59; + return True; + case XK_Greek_ZETA: + buf[0] = 0x5A; + return True; + + case XK_Greek_alpha: + buf[0] = 0x61; + return True; + case XK_Greek_beta: + buf[0] = 0x62; + return True; + case XK_Greek_chi: + buf[0] = 0x63; + return True; + case XK_Greek_delta: + buf[0] = 0x64; + return True; + case XK_Greek_epsilon: + buf[0] = 0x65; + return True; + case XK_Greek_phi: + buf[0] = 0x66; + return True; + case XK_Greek_gamma: + buf[0] = 0x67; + return True; + case XK_Greek_eta: + buf[0] = 0x68; + return True; + case XK_Greek_iota: + buf[0] = 0x69; + return True; + case XK_Greek_kappa: + buf[0] = 0x6B; + return True; + case XK_Greek_lamda: + buf[0] = 0x6C; + return True; + case XK_Greek_mu: + buf[0] = 0x6D; + return True; + case XK_Greek_nu: + buf[0] = 0x6E; + return True; + case XK_Greek_omicron: + buf[0] = 0x6F; + return True; + case XK_Greek_pi: + buf[0] = 0x70; + return True; + case XK_Greek_theta: + buf[0] = 0x71; + return True; + case XK_Greek_rho: + buf[0] = 0x72; + return True; + case XK_Greek_sigma: + buf[0] = 0x73; + return True; + case XK_Greek_tau: + buf[0] = 0x74; + return True; + case XK_Greek_upsilon: + buf[0] = 0x75; + return True; + case XK_Greek_omega: + buf[0] = 0x77; + return True; + case XK_Greek_xi: + buf[0] = 0x78; + return True; + case XK_Greek_psi: + buf[0] = 0x79; + return True; + case XK_Greek_zeta: + buf[0] = 0x7A; + return True; + } } switch (sym) { - case XK_leftarrow: buf[0]= 0xAC; return True; - case XK_uparrow: buf[0]= 0xAD; return True; - case XK_rightarrow: buf[0]= 0xAE; return True; - case XK_downarrow: buf[0]= 0xAF; return True; - case XK_horizconnector: buf[0]= 0xBE; return True; - case XK_trademark: buf[0]= 0xE4; return True; + case XK_leftarrow: + buf[0] = 0xAC; + return True; + case XK_uparrow: + buf[0] = 0xAD; + return True; + case XK_rightarrow: + buf[0] = 0xAE; + return True; + case XK_downarrow: + buf[0] = 0xAF; + return True; + case XK_horizconnector: + buf[0] = 0xBE; + return True; + case XK_trademark: + buf[0] = 0xE4; + return True; } return False; } @@ -1264,57 +1519,109 @@ static KeySym CheckSymbolAlias(KeySym sym, PSState *state) { if (XkbKSIsKeypad(sym)) { - if ((sym>=XK_KP_0)&&(sym<=XK_KP_9)) - sym= (sym-XK_KP_0)+XK_0; - else switch (sym) { - case XK_KP_Space: return XK_space; - case XK_KP_Tab: return XK_Tab; - case XK_KP_Enter: return XK_Return; - case XK_KP_F1: return XK_F1; - case XK_KP_F2: return XK_F2; - case XK_KP_F3: return XK_F3; - case XK_KP_F4: return XK_F4; - case XK_KP_Home: return XK_Home; - case XK_KP_Left: return XK_Left; - case XK_KP_Up: return XK_Up; - case XK_KP_Right: return XK_Right; - case XK_KP_Down: return XK_Down; - case XK_KP_Page_Up: return XK_Page_Up; - case XK_KP_Page_Down: return XK_Page_Down; - case XK_KP_End: return XK_End; - case XK_KP_Begin: return XK_Begin; - case XK_KP_Insert: return XK_Insert; - case XK_KP_Delete: return XK_Delete; - case XK_KP_Equal: return XK_equal; - case XK_KP_Multiply: return XK_asterisk; - case XK_KP_Add: return XK_plus; - case XK_KP_Subtract: return XK_minus; - case XK_KP_Divide: return XK_slash; - } + if ((sym >= XK_KP_0) && (sym <= XK_KP_9)) + sym = (sym - XK_KP_0) + XK_0; + else + switch (sym) { + case XK_KP_Space: + return XK_space; + case XK_KP_Tab: + return XK_Tab; + case XK_KP_Enter: + return XK_Return; + case XK_KP_F1: + return XK_F1; + case XK_KP_F2: + return XK_F2; + case XK_KP_F3: + return XK_F3; + case XK_KP_F4: + return XK_F4; + case XK_KP_Home: + return XK_Home; + case XK_KP_Left: + return XK_Left; + case XK_KP_Up: + return XK_Up; + case XK_KP_Right: + return XK_Right; + case XK_KP_Down: + return XK_Down; + case XK_KP_Page_Up: + return XK_Page_Up; + case XK_KP_Page_Down: + return XK_Page_Down; + case XK_KP_End: + return XK_End; + case XK_KP_Begin: + return XK_Begin; + case XK_KP_Insert: + return XK_Insert; + case XK_KP_Delete: + return XK_Delete; + case XK_KP_Equal: + return XK_equal; + case XK_KP_Multiply: + return XK_asterisk; + case XK_KP_Add: + return XK_plus; + case XK_KP_Subtract: + return XK_minus; + case XK_KP_Divide: + return XK_slash; + } } else if (XkbKSIsDeadKey(sym)) { - switch (sym) { - case XK_dead_grave: sym= XK_grave; break; - case XK_dead_acute: sym= XK_acute; break; - case XK_dead_circumflex: sym= XK_asciicircum; break; - case XK_dead_tilde: sym= XK_asciitilde; break; - case XK_dead_macron: sym= XK_macron; break; - case XK_dead_breve: sym= XK_breve; break; - case XK_dead_abovedot: sym= XK_abovedot; break; - case XK_dead_diaeresis: sym= XK_diaeresis; break; - case XK_dead_abovering: sym= XK_degree; break; - case XK_dead_doubleacute: sym= XK_doubleacute; break; - case XK_dead_caron: sym= XK_caron; break; - case XK_dead_cedilla: sym= XK_cedilla; break; - case XK_dead_ogonek: sym= XK_ogonek; break; - case XK_dead_iota: sym= XK_Greek_iota; break; - case XK_dead_voiced_sound: - sym= XK_voicedsound; - break; - case XK_dead_semivoiced_sound: - sym= XK_semivoicedsound; - break; - } + switch (sym) { + case XK_dead_grave: + sym = XK_grave; + break; + case XK_dead_acute: + sym = XK_acute; + break; + case XK_dead_circumflex: + sym = XK_asciicircum; + break; + case XK_dead_tilde: + sym = XK_asciitilde; + break; + case XK_dead_macron: + sym = XK_macron; + break; + case XK_dead_breve: + sym = XK_breve; + break; + case XK_dead_abovedot: + sym = XK_abovedot; + break; + case XK_dead_diaeresis: + sym = XK_diaeresis; + break; + case XK_dead_abovering: + sym = XK_degree; + break; + case XK_dead_doubleacute: + sym = XK_doubleacute; + break; + case XK_dead_caron: + sym = XK_caron; + break; + case XK_dead_cedilla: + sym = XK_cedilla; + break; + case XK_dead_ogonek: + sym = XK_ogonek; + break; + case XK_dead_iota: + sym = XK_Greek_iota; + break; + case XK_dead_voiced_sound: + sym = XK_voicedsound; + break; + case XK_dead_semivoiced_sound: + sym = XK_semivoicedsound; + break; + } } return sym; } @@ -1322,107 +1629,134 @@ CheckSymbolAlias(KeySym sym, PSState *state) static Bool FindKeysymsByName(XkbDescPtr xkb, char *name, PSState *state, KeyTop *top) { -static unsigned char buf[30]; -int kc; -KeySym sym,*syms,topSyms[NLABELS]; -int level,group; -int eG,nG,gI,l,g; - - bzero(top,sizeof(KeyTop)); - kc= XkbFindKeycodeByName(xkb,name,True); - if (state->args!=NULL) { - level= state->args->labelLevel; - group= state->args->baseLabelGroup; + static unsigned char buf[30]; + int kc; + KeySym sym, *syms, topSyms[NLABELS]; + int level, group; + int eG, nG, gI, l, g; + + bzero(top, sizeof(KeyTop)); + kc = XkbFindKeycodeByName(xkb, name, True); + if (state->args != NULL) { + level = state->args->labelLevel; + group = state->args->baseLabelGroup; } - else level= group= 0; - syms= XkbKeySymsPtr(xkb,kc); - eG= group; - nG= XkbKeyNumGroups(xkb,kc); - gI= XkbKeyGroupInfo(xkb,kc); - if ((state->args->wantDiffs)&&(eG>=XkbKeyNumGroups(xkb,kc))) - return False; /* XXX was a return with no value */ - if (nG==0) { - return False; + else + level = group = 0; + syms = XkbKeySymsPtr(xkb, kc); + eG = group; + nG = XkbKeyNumGroups(xkb, kc); + gI = XkbKeyGroupInfo(xkb, kc); + if ((state->args->wantDiffs) && (eG >= XkbKeyNumGroups(xkb, kc))) + return False; /* XXX was a return with no value */ + if (nG == 0) { + return False; } - else if (nG==1) { - eG= 0; + else if (nG == 1) { + eG = 0; } - else if (eG>=XkbKeyNumGroups(xkb,kc)) { - switch (XkbOutOfRangeGroupAction(gI)) { - default: - eG%= nG; - break; - case XkbClampIntoRange: - eG= nG-1; - break; - case XkbRedirectIntoRange: - eG= XkbOutOfRangeGroupNumber(gI); - if (eG>=nG) - eG= 0; - break; - } + else if (eG >= XkbKeyNumGroups(xkb, kc)) { + switch (XkbOutOfRangeGroupAction(gI)) { + default: + eG %= nG; + break; + case XkbClampIntoRange: + eG = nG - 1; + break; + case XkbRedirectIntoRange: + eG = XkbOutOfRangeGroupNumber(gI); + if (eG >= nG) + eG = 0; + break; + } } - for (g=0;g<state->args->nLabelGroups;g++) { - if ((eG+g)>=nG) - continue; - for (l=0;l<2;l++) { - int font,sz; - if (level+l>=XkbKeyGroupWidth(xkb,kc,(eG+g))) - continue; - sym= syms[((eG+g)*XkbKeyGroupsWidth(xkb,kc))+(level+l)]; - - if (state->args->wantSymbols!=NO_SYMBOLS) - sym= CheckSymbolAlias(sym,state); - topSyms[(g*2)+l]= sym; - - if (PSKeycapsSymbol(sym,buf,&font,&sz,state)) { - top->font[(g*2)+l]= font; - top->size[(g*2)+l]= sz; - } - else if (((sym&(~0xff))==0)&&isprint(sym)&&(!isspace(sym))) { - if (sym=='(') sprintf((char *)buf,"\\("); - else if (sym==')') sprintf((char *)buf,"\\)"); - else if (sym=='\\') sprintf((char *)buf,"\\\\"); - else sprintf((char *)buf,"%c",(char)sym); - top->font[(g*2)+l]= FONT_LATIN1; - top->size[(g*2)+l]= SZ_MEDIUM; - switch (buf[0]) { - case '.': case ':': case ',': case ';': - case '\'': case '"': case '`': case '~': - case '^': case 0250: case 0270: case 0267: - case 0260: case 0252: case 0272: case 0271: - case 0262: case 0263: case 0264: case 0255: - case 0254: case 0257: - top->size[(g*2)+l]= SZ_LARGE; - break; - } - } - else if (PSNonLatin1Symbol(sym,buf,&font,&sz,state)) { - top->font[(g*2)+l]= font; - top->size[(g*2)+l]= sz; - } - else { - char *tmp; - tmp= XKeysymToString(sym); - if (tmp!=NULL) strcpy((char *)buf,tmp); - else sprintf((char *)buf,"(%ld)",sym); - top->font[(g*2)+l]= FONT_LATIN1; - if (strlen((char *)buf)<9) - top->size[(g*2)+l]= SZ_SMALL; - else top->size[(g*2)+l]= SZ_TINY; - } - top->present|= (1<<((g*2)+l)); - strncpy(top->label[(g*2)+l],(char *)buf,LABEL_LEN-1); - top->label[(g*2)+l][LABEL_LEN-1]= '\0'; - } - if (((g==0)&&(top->present&G1LX_MASK)==G1LX_MASK)|| - ((g==1)&&(top->present&G2LX_MASK)==G2LX_MASK)) { - KeySym lower,upper; - XConvertCase(topSyms[(g*2)],&lower,&upper); - if ((topSyms[(g*2)]==lower)&&(topSyms[(g*2)+1]==upper)) { - top->alpha[g]= True; - } - } + for (g = 0; g < state->args->nLabelGroups; g++) { + if ((eG + g) >= nG) + continue; + for (l = 0; l < 2; l++) { + int font, sz; + + if (level + l >= XkbKeyGroupWidth(xkb, kc, (eG + g))) + continue; + sym = syms[((eG + g) * XkbKeyGroupsWidth(xkb, kc)) + (level + l)]; + + if (state->args->wantSymbols != NO_SYMBOLS) + sym = CheckSymbolAlias(sym, state); + topSyms[(g * 2) + l] = sym; + + if (PSKeycapsSymbol(sym, buf, &font, &sz, state)) { + top->font[(g * 2) + l] = font; + top->size[(g * 2) + l] = sz; + } + else if (((sym & (~0xff)) == 0) && isprint(sym) && (!isspace(sym))) { + if (sym == '(') + sprintf((char *) buf, "\\("); + else if (sym == ')') + sprintf((char *) buf, "\\)"); + else if (sym == '\\') + sprintf((char *) buf, "\\\\"); + else + sprintf((char *) buf, "%c", (char) sym); + top->font[(g * 2) + l] = FONT_LATIN1; + top->size[(g * 2) + l] = SZ_MEDIUM; + switch (buf[0]) { + case '.': + case ':': + case ',': + case ';': + case '\'': + case '"': + case '`': + case '~': + case '^': + case 0250: + case 0270: + case 0267: + case 0260: + case 0252: + case 0272: + case 0271: + case 0262: + case 0263: + case 0264: + case 0255: + case 0254: + case 0257: + top->size[(g * 2) + l] = SZ_LARGE; + break; + } + } + else if (PSNonLatin1Symbol(sym, buf, &font, &sz, state)) { + top->font[(g * 2) + l] = font; + top->size[(g * 2) + l] = sz; + } + else { + char *tmp; + + tmp = XKeysymToString(sym); + if (tmp != NULL) + strcpy((char *) buf, tmp); + else + sprintf((char *) buf, "(%ld)", sym); + top->font[(g * 2) + l] = FONT_LATIN1; + if (strlen((char *) buf) < 9) + top->size[(g * 2) + l] = SZ_SMALL; + else + top->size[(g * 2) + l] = SZ_TINY; + } + top->present |= (1 << ((g * 2) + l)); + strncpy(top->label[(g * 2) + l], (char *) buf, LABEL_LEN - 1); + top->label[(g * 2) + l][LABEL_LEN - 1] = '\0'; + } + if (((g == 0) && (top->present & G1LX_MASK) == G1LX_MASK) || + ((g == 1) && (top->present & G2LX_MASK) == G2LX_MASK)) { + KeySym lower, upper; + + XConvertCase(topSyms[(g * 2)], &lower, &upper); + if ((topSyms[(g * 2)] == lower) && (topSyms[(g * 2) + 1] == upper)) { + top->alpha[g] = True; + } + } } return True; } @@ -1430,10 +1764,10 @@ int eG,nG,gI,l,g; static void PSDrawLabel(FILE *out, char *label, int x, int y, int w, int h) { - fprintf(out,"%d %d (%s) centeroffset\n",w,h,label); - fprintf(out,"%d add exch\n",y); - fprintf(out,"%d add exch moveto\n",x); - fprintf(out,"1 -1 scale (%s) show 1 -1 scale\n",label); + fprintf(out, "%d %d (%s) centeroffset\n", w, h, label); + fprintf(out, "%d add exch\n", y); + fprintf(out, "%d add exch moveto\n", x); + fprintf(out, "1 -1 scale (%s) show 1 -1 scale\n", label); return; } @@ -1447,131 +1781,140 @@ PSDrawLabel(FILE *out, char *label, int x, int y, int w, int h) static void PSLabelKey(FILE *out, PSState *state, KeyTop *top, int x, int y, - XkbBoundsPtr bounds, int kc, int btm) + XkbBoundsPtr bounds, int kc, int btm) { -char keycode[10]; -int w,h,i; -int row_y[3]; -int col_x[3]; -int row_h[3]; -int col_w[3]; -Bool present[NLABELS]; -int sym_row[NLABELS]; -int sym_col[NLABELS]; - - w= XkbBoundsWidth(bounds); - h= XkbBoundsHeight(bounds); - row_y[TOP_ROW]= y+bounds->y1+(h/10); - row_y[BOTTOM_ROW]= y+bounds->y1+(h/2)+(h/10); - row_y[CENTER_ROW]= y+bounds->y1+(h/10); - row_h[TOP_ROW]= h/2; - row_h[BOTTOM_ROW]= h/2; - row_h[CENTER_ROW]= h; - - col_x[LEFT_COL]= x+bounds->x1; - col_x[RIGHT_COL]= x+bounds->x1+w/2; - col_x[CENTER_COL]= x+bounds->x1; - col_w[LEFT_COL]= w/2; - col_w[RIGHT_COL]= w/2; - col_w[CENTER_COL]= w; - - present[G1L1]= False; - sym_row[G1L1]= BOTTOM_ROW; - sym_col[G1L1]= LEFT_COL; - - present[G1L2]= False; - sym_row[G1L2]= TOP_ROW; - sym_col[G1L2]= LEFT_COL; - - present[G2L1]= False; - sym_row[G2L1]= BOTTOM_ROW; - sym_col[G2L1]= RIGHT_COL; - - present[G2L2]= False; - sym_row[G2L2]= TOP_ROW; - sym_col[G2L2]= RIGHT_COL; - - present[CENTER]= False; - sym_row[CENTER]= CENTER_ROW; - sym_col[CENTER]= CENTER_COL; - - if (top->present&CENTER_MASK) { - present[CENTER]= True; - } - else switch (top->present&GXLX_MASK) { - case G1L1_MASK: - present[G1L1]= True; - sym_row[G1L1]= CENTER_ROW; - sym_col[G1L1]= CENTER_COL; - break; - case G1LX_MASK: - present[G1L2]= True; - if (!top->alpha[0]) { - present[G1L1]= True; - if ((strlen(top->label[G1L1])>1)&&(top->label[G1L1][0]!='\\')) - sym_col[G1L1]= CENTER_COL; - if ((strlen(top->label[G1L2])>1)&&(top->label[G1L1][0]!='\\')) - sym_col[G1L2]= CENTER_COL; - } - break; - default: - if ((top->present&G1LX_MASK)==G1LX_MASK) { - present[G1L2]= True; - if (!top->alpha[0]) - present[G1L1]= True; - } - else if ((top->present&G1LX_MASK)==G1L1_MASK) { - present[G1L1]= True; - } - else if ((top->present&G1LX_MASK)==G1L2_MASK) { - present[G1L2]= True; - } - if ((top->present&G2LX_MASK)==G2LX_MASK) { - present[G2L2]= True; - if (!top->alpha[1]) - present[G2L1]= True; - } - else if ((top->present&G2LX_MASK)==G2L1_MASK) { - present[G2L1]= True; - } - else if ((top->present&G2LX_MASK)==G2L2_MASK) { - present[G2L2]= True; - } - break; - case 0: - return; + char keycode[10]; + int w, h, i; + int row_y[3]; + int col_x[3]; + int row_h[3]; + int col_w[3]; + Bool present[NLABELS]; + int sym_row[NLABELS]; + int sym_col[NLABELS]; + + w = XkbBoundsWidth(bounds); + h = XkbBoundsHeight(bounds); + row_y[TOP_ROW] = y + bounds->y1 + (h / 10); + row_y[BOTTOM_ROW] = y + bounds->y1 + (h / 2) + (h / 10); + row_y[CENTER_ROW] = y + bounds->y1 + (h / 10); + row_h[TOP_ROW] = h / 2; + row_h[BOTTOM_ROW] = h / 2; + row_h[CENTER_ROW] = h; + + col_x[LEFT_COL] = x + bounds->x1; + col_x[RIGHT_COL] = x + bounds->x1 + w / 2; + col_x[CENTER_COL] = x + bounds->x1; + col_w[LEFT_COL] = w / 2; + col_w[RIGHT_COL] = w / 2; + col_w[CENTER_COL] = w; + + present[G1L1] = False; + sym_row[G1L1] = BOTTOM_ROW; + sym_col[G1L1] = LEFT_COL; + + present[G1L2] = False; + sym_row[G1L2] = TOP_ROW; + sym_col[G1L2] = LEFT_COL; + + present[G2L1] = False; + sym_row[G2L1] = BOTTOM_ROW; + sym_col[G2L1] = RIGHT_COL; + + present[G2L2] = False; + sym_row[G2L2] = TOP_ROW; + sym_col[G2L2] = RIGHT_COL; + + present[CENTER] = False; + sym_row[CENTER] = CENTER_ROW; + sym_col[CENTER] = CENTER_COL; + + if (top->present & CENTER_MASK) { + present[CENTER] = True; } - for (i=0;i<NLABELS;i++) { - if (present[i]) { - int len,size; - if (top->size[i]==SZ_AUTO) { - len= strlen(top->label[i]); - if (len==1) { - if (top->font[i]==FONT_ISOCAPS) - size= 18; - else size= 14; - } - else if (len<10) size= 12; - else size= 10; - } - else if (top->size[i]==SZ_TINY) - size= 10; - else if (top->size[i]==SZ_SMALL) - size= 12; - else if (top->size[i]==SZ_LARGE) - size= 18; - else if (top->size[i]==SZ_XLARGE) - size= 24; - else size= 14; - PSSetFont(out,state,top->font[i],size,True); - PSDrawLabel(out,top->label[i],col_x[sym_col[i]],row_y[sym_row[i]], - col_w[sym_col[i]],row_h[sym_row[i]]); - } + else + switch (top->present & GXLX_MASK) { + case G1L1_MASK: + present[G1L1] = True; + sym_row[G1L1] = CENTER_ROW; + sym_col[G1L1] = CENTER_COL; + break; + case G1LX_MASK: + present[G1L2] = True; + if (!top->alpha[0]) { + present[G1L1] = True; + if ((strlen(top->label[G1L1]) > 1) && + (top->label[G1L1][0] != '\\')) + sym_col[G1L1] = CENTER_COL; + if ((strlen(top->label[G1L2]) > 1) && + (top->label[G1L1][0] != '\\')) + sym_col[G1L2] = CENTER_COL; + } + break; + default: + if ((top->present & G1LX_MASK) == G1LX_MASK) { + present[G1L2] = True; + if (!top->alpha[0]) + present[G1L1] = True; + } + else if ((top->present & G1LX_MASK) == G1L1_MASK) { + present[G1L1] = True; + } + else if ((top->present & G1LX_MASK) == G1L2_MASK) { + present[G1L2] = True; + } + if ((top->present & G2LX_MASK) == G2LX_MASK) { + present[G2L2] = True; + if (!top->alpha[1]) + present[G2L1] = True; + } + else if ((top->present & G2LX_MASK) == G2L1_MASK) { + present[G2L1] = True; + } + else if ((top->present & G2LX_MASK) == G2L2_MASK) { + present[G2L2] = True; + } + break; + case 0: + return; + } + for (i = 0; i < NLABELS; i++) { + if (present[i]) { + int len, size; + + if (top->size[i] == SZ_AUTO) { + len = strlen(top->label[i]); + if (len == 1) { + if (top->font[i] == FONT_ISOCAPS) + size = 18; + else + size = 14; + } + else if (len < 10) + size = 12; + else + size = 10; + } + else if (top->size[i] == SZ_TINY) + size = 10; + else if (top->size[i] == SZ_SMALL) + size = 12; + else if (top->size[i] == SZ_LARGE) + size = 18; + else if (top->size[i] == SZ_XLARGE) + size = 24; + else + size = 14; + PSSetFont(out, state, top->font[i], size, True); + PSDrawLabel(out, top->label[i], col_x[sym_col[i]], + row_y[sym_row[i]], col_w[sym_col[i]], + row_h[sym_row[i]]); + } } if (state->args->wantKeycodes) { - sprintf(keycode,"%d",kc); - PSSetFont(out,state,FONT_LATIN1,8,True); - PSDrawLabel(out,keycode,x+bounds->x1,y+btm-5,w,0); + sprintf(keycode, "%d", kc); + PSSetFont(out, state, FONT_LATIN1, 8, True); + PSDrawLabel(out, keycode, x + bounds->x1, y + btm - 5, w, 0); } return; } @@ -1579,223 +1922,237 @@ int sym_col[NLABELS]; static void PSSection(FILE *out, PSState *state, XkbSectionPtr section) { -int r,offset; -XkbRowPtr row; -Display * dpy; -XkbDescPtr xkb; - - xkb= state->xkb; - dpy= xkb->dpy; - fprintf(out,"%% Begin Section '%s'\n",(section->name!=None? - XkbAtomGetString(dpy,section->name): - "NoName")); - PSGSave(out,state); - fprintf(out,"%d %d translate\n",section->left,section->top); - if (section->angle!=0) - fprintf(out,"%s rotate\n",XkbGeomFPText(section->angle,XkbMessage)); + int r, offset; + XkbRowPtr row; + Display *dpy; + XkbDescPtr xkb; + + xkb = state->xkb; + dpy = xkb->dpy; + fprintf(out, "%% Begin Section '%s'\n", (section->name != None ? + XkbAtomGetString(dpy, section-> name) : "NoName")); + PSGSave(out, state); + fprintf(out, "%d %d translate\n", section->left, section->top); + if (section->angle != 0) + fprintf(out, "%s rotate\n", XkbGeomFPText(section->angle, XkbMessage)); if (section->doodads) { - XkbDrawablePtr first,draw; - first= draw= XkbGetOrderedDrawables(NULL,section); - while (draw) { - if (draw->type==XkbDW_Section) - PSSection(out,state,draw->u.section); - else PSDoodad(out,state,draw->u.doodad); - draw= draw->next; - } - XkbFreeOrderedDrawables(first); + XkbDrawablePtr first, draw; + + first = draw = XkbGetOrderedDrawables(NULL, section); + while (draw) { + if (draw->type == XkbDW_Section) + PSSection(out, state, draw->u.section); + else + PSDoodad(out, state, draw->u.doodad); + draw = draw->next; + } + XkbFreeOrderedDrawables(first); } - for (r=0,row=section->rows;r<section->num_rows;r++,row++) { - int k; - XkbKeyPtr key; - XkbShapePtr shape; - if (row->vertical) offset= row->top; - else offset= row->left; - fprintf(out,"%% Begin %s %d\n",row->vertical?"column":"row",r+1); - for (k=0,key=row->keys;k<row->num_keys;k++,key++) { - shape= XkbKeyShape(xkb->geom,key); - offset+= key->gap; - if (row->vertical) { - if (state->args->wantColor) { - if (key->color_ndx!=state->white) { - PSSetColor(out,state,key->color_ndx); - fprintf(out,"true 0 %d %d %s %% %s\n", - row->left,offset, - XkbAtomGetString(dpy,shape->name), - XkbKeyNameText(key->name.name,XkbMessage)); - } - PSSetColor(out,state,state->black); - } - fprintf(out,"false 0 %d %d %s %% %s\n",row->left,offset, - XkbAtomGetString(dpy,shape->name), - XkbKeyNameText(key->name.name,XkbMessage)); - offset+= shape->bounds.y2; - } - else { - if (state->args->wantColor) { - if (key->color_ndx!=state->white) { - PSSetColor(out,state,key->color_ndx); - fprintf(out,"true 0 %d %d %s %% %s\n",offset,row->top, - XkbAtomGetString(dpy,shape->name), - XkbKeyNameText(key->name.name,XkbMessage)); - } - PSSetColor(out,state,state->black); - } - fprintf(out,"false 0 %d %d %s %% %s\n",offset,row->top, - XkbAtomGetString(dpy,shape->name), - XkbKeyNameText(key->name.name,XkbMessage)); - offset+= shape->bounds.x2; - } - } + for (r = 0, row = section->rows; r < section->num_rows; r++, row++) { + int k; + XkbKeyPtr key; + XkbShapePtr shape; + + if (row->vertical) + offset = row->top; + else + offset = row->left; + fprintf(out, "%% Begin %s %d\n", row->vertical ? "column" : "row", + r + 1); + for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { + shape = XkbKeyShape(xkb->geom, key); + offset += key->gap; + if (row->vertical) { + if (state->args->wantColor) { + if (key->color_ndx != state->white) { + PSSetColor(out, state, key->color_ndx); + fprintf(out, "true 0 %d %d %s %% %s\n", + row->left, offset, + XkbAtomGetString(dpy, shape->name), + XkbKeyNameText(key->name.name, XkbMessage)); + } + PSSetColor(out, state, state->black); + } + fprintf(out, "false 0 %d %d %s %% %s\n", row->left, offset, + XkbAtomGetString(dpy, shape->name), + XkbKeyNameText(key->name.name, XkbMessage)); + offset += shape->bounds.y2; + } + else { + if (state->args->wantColor) { + if (key->color_ndx != state->white) { + PSSetColor(out, state, key->color_ndx); + fprintf(out, "true 0 %d %d %s %% %s\n", offset, + row->top, XkbAtomGetString(dpy, shape->name), + XkbKeyNameText(key->name.name, XkbMessage)); + } + PSSetColor(out, state, state->black); + } + fprintf(out, "false 0 %d %d %s %% %s\n", offset, row->top, + XkbAtomGetString(dpy, shape->name), + XkbKeyNameText(key->name.name, XkbMessage)); + offset += shape->bounds.x2; + } + } } - for (r=0,row=section->rows;r<section->num_rows;r++,row++) { - int k,kc=0; - XkbKeyPtr key; - XkbShapePtr shape; - XkbBoundsRec bounds; - if (state->args->label==LABEL_NONE) - break; - if (row->vertical) offset= row->top; - else offset= row->left; - fprintf(out,"%% Begin %s %d labels\n",row->vertical?"column":"row",r+1); - PSSetColor(out,state,xkb->geom->label_color->pixel); - PSSetFont(out,state,FONT_LATIN1,12,True); - for (k=0,key=row->keys;k<row->num_keys;k++,key++) { - char * name,*name2,buf[30],buf2[30]; - int x,y; - KeyTop top; - - shape= XkbKeyShape(xkb->geom,key); - XkbComputeShapeTop(shape,&bounds); - offset+= key->gap; - name= name2= NULL; - if (state->args->label==LABEL_SYMBOLS) { - if (!FindKeysymsByName(xkb,key->name.name,state,&top)) { - fprintf(out,"%% No label for %s\n", - XkbKeyNameText(key->name.name,XkbMessage)); - } - } - else { - char *olKey; - - if (section->num_overlays>0) - olKey= XkbFindOverlayForKey(xkb->geom,section, - key->name.name); - else olKey= NULL; - - if (state->args->label==LABEL_KEYNAME) { - name= XkbKeyNameText(key->name.name,XkbMessage); - if (olKey) - name2= XkbKeyNameText(olKey,XkbMessage); - } - else if (state->args->label==LABEL_KEYCODE) { - name= buf; - sprintf(name,"%d",XkbFindKeycodeByName(xkb,key->name.name, - True)); - if (olKey) { - name2= buf2; - sprintf(name,"%d",XkbFindKeycodeByName(xkb,olKey,True)); - } - } - bzero(&top,sizeof(KeyTop)); - if (name2!=NULL) { - top.present|= G1LX_MASK; - strncpy(top.label[G1L1],name,LABEL_LEN-1); - top.label[G1L1][LABEL_LEN-1]= '\0'; - strncpy(top.label[G1L2],name2,LABEL_LEN-1); - top.label[G1L2][LABEL_LEN-1]= '\0'; - } - else if (name!=NULL) { - top.present|= CENTER_MASK; - strncpy(top.label[CENTER],name,LABEL_LEN-1); - top.label[CENTER][LABEL_LEN-1]= '\0'; - } - else { - fprintf(out,"%% No label for %s\n", - XkbKeyNameText(key->name.name,XkbMessage)); - } - } - if (row->vertical) { - x= row->left; - y= offset; - offset+= shape->bounds.y2; - } - else { - x= offset; - y= row->top; - offset+= shape->bounds.x2; - } - name= key->name.name; - fprintf(out,"%% %s\n",XkbKeyNameText(name,XkbMessage)); - if (state->args->wantKeycodes) - kc= XkbFindKeycodeByName(xkb,key->name.name,True); - PSLabelKey(out,state,&top,x,y,&bounds,kc,shape->bounds.y2); - } + for (r = 0, row = section->rows; r < section->num_rows; r++, row++) { + int k, kc = 0; + XkbKeyPtr key; + XkbShapePtr shape; + XkbBoundsRec bounds; + + if (state->args->label == LABEL_NONE) + break; + if (row->vertical) + offset = row->top; + else + offset = row->left; + fprintf(out, "%% Begin %s %d labels\n", + row->vertical ? "column" : "row", r + 1); + PSSetColor(out, state, xkb->geom->label_color->pixel); + PSSetFont(out, state, FONT_LATIN1, 12, True); + for (k = 0, key = row->keys; k < row->num_keys; k++, key++) { + char *name, *name2, buf[30], buf2[30]; + int x, y; + KeyTop top; + + shape = XkbKeyShape(xkb->geom, key); + XkbComputeShapeTop(shape, &bounds); + offset += key->gap; + name = name2 = NULL; + if (state->args->label == LABEL_SYMBOLS) { + if (!FindKeysymsByName(xkb, key->name.name, state, &top)) { + fprintf(out, "%% No label for %s\n", + XkbKeyNameText(key->name.name, XkbMessage)); + } + } + else { + char *olKey; + + if (section->num_overlays > 0) + olKey = XkbFindOverlayForKey(xkb->geom, section, + key->name.name); + else + olKey = NULL; + + if (state->args->label == LABEL_KEYNAME) { + name = XkbKeyNameText(key->name.name, XkbMessage); + if (olKey) + name2 = XkbKeyNameText(olKey, XkbMessage); + } + else if (state->args->label == LABEL_KEYCODE) { + name = buf; + sprintf(name, "%d", + XkbFindKeycodeByName(xkb, key->name.name, True)); + if (olKey) { + name2 = buf2; + sprintf(name, "%d", + XkbFindKeycodeByName(xkb, olKey, True)); + } + } + bzero(&top, sizeof(KeyTop)); + if (name2 != NULL) { + top.present |= G1LX_MASK; + strncpy(top.label[G1L1], name, LABEL_LEN - 1); + top.label[G1L1][LABEL_LEN - 1] = '\0'; + strncpy(top.label[G1L2], name2, LABEL_LEN - 1); + top.label[G1L2][LABEL_LEN - 1] = '\0'; + } + else if (name != NULL) { + top.present |= CENTER_MASK; + strncpy(top.label[CENTER], name, LABEL_LEN - 1); + top.label[CENTER][LABEL_LEN - 1] = '\0'; + } + else { + fprintf(out, "%% No label for %s\n", + XkbKeyNameText(key->name.name, XkbMessage)); + } + } + if (row->vertical) { + x = row->left; + y = offset; + offset += shape->bounds.y2; + } + else { + x = offset; + y = row->top; + offset += shape->bounds.x2; + } + name = key->name.name; + fprintf(out, "%% %s\n", XkbKeyNameText(name, XkbMessage)); + if (state->args->wantKeycodes) + kc = XkbFindKeycodeByName(xkb, key->name.name, True); + PSLabelKey(out, state, &top, x, y, &bounds, kc, shape->bounds.y2); + } } - PSGRestore(out,state); + PSGRestore(out, state); return; } Bool GeometryToPostScript(FILE *out, XkbFileInfo *pResult, XKBPrintArgs *args) { -XkbDrawablePtr first,draw; -PSState state; -Bool dfltBorder; -int i; - - if ((!pResult)||(!pResult->xkb)||(!pResult->xkb->geom)) - return False; - state.xkb= pResult->xkb; - state.dpy= pResult->xkb->dpy; - state.geom= pResult->xkb->geom; - state.color= state.black= state.white= -1; - state.font= -1; - state.nPages= 0; - state.totalKB= 1; - state.kbPerPage= 1; - state.x1= state.y1= state.x2= state.y2= 0; - state.args= args; - - if ((args->label==LABEL_SYMBOLS)&&(pResult->xkb->ctrls)) { - if (args->nTotalGroups==0) - state.totalKB= pResult->xkb->ctrls->num_groups/args->nLabelGroups; - else state.totalKB= args->nTotalGroups; - if (state.totalKB<1) - state.totalKB= 1; - else if (state.totalKB>1) - state.kbPerPage= 2; + XkbDrawablePtr first, draw; + PSState state; + Bool dfltBorder; + int i; + + if ((!pResult) || (!pResult->xkb) || (!pResult->xkb->geom)) + return False; + state.xkb = pResult->xkb; + state.dpy = pResult->xkb->dpy; + state.geom = pResult->xkb->geom; + state.color = state.black = state.white = -1; + state.font = -1; + state.nPages = 0; + state.totalKB = 1; + state.kbPerPage = 1; + state.x1 = state.y1 = state.x2 = state.y2 = 0; + state.args = args; + + if ((args->label == LABEL_SYMBOLS) && (pResult->xkb->ctrls)) { + if (args->nTotalGroups == 0) + state.totalKB = + pResult->xkb->ctrls->num_groups / args->nLabelGroups; + else + state.totalKB = args->nTotalGroups; + if (state.totalKB < 1) + state.totalKB = 1; + else if (state.totalKB > 1) + state.kbPerPage = 2; } - if (args->nKBPerPage!=0) - state.kbPerPage= args->nKBPerPage; - - PSProlog(out,&state); - first= XkbGetOrderedDrawables(state.geom,NULL); - - for (draw=first,dfltBorder=True;draw!=NULL;draw=draw->next) { - if ((draw->type!=XkbDW_Section)&& - ((draw->u.doodad->any.type==XkbOutlineDoodad)|| - (draw->u.doodad->any.type==XkbSolidDoodad))) { - char *name; - name= XkbAtomGetString(state.dpy,draw->u.doodad->any.name); - if ((name!=NULL)&&(uStrCaseEqual(name,"edges"))) { - dfltBorder= False; - break; - } - } + if (args->nKBPerPage != 0) + state.kbPerPage = args->nKBPerPage; + + PSProlog(out, &state); + first = XkbGetOrderedDrawables(state.geom, NULL); + + for (draw = first, dfltBorder = True; draw != NULL; draw = draw->next) { + if ((draw->type != XkbDW_Section) && + ((draw->u.doodad->any.type == XkbOutlineDoodad) || + (draw->u.doodad->any.type == XkbSolidDoodad))) { + char *name; + + name = XkbAtomGetString(state.dpy, draw->u.doodad->any.name); + if ((name != NULL) && (uStrCaseEqual(name, "edges"))) { + dfltBorder = False; + break; + } + } } - for (i=0;i<state.totalKB;i++) { - PSPageSetup(out,&state,dfltBorder); - for (draw=first;draw!=NULL;draw=draw->next) { - if (draw->type==XkbDW_Section) - PSSection(out,&state,draw->u.section); - else { - PSDoodad(out,&state,draw->u.doodad); - } - } - PSPageTrailer(out,&state); - state.args->baseLabelGroup+= state.args->nLabelGroups; + for (i = 0; i < state.totalKB; i++) { + PSPageSetup(out, &state, dfltBorder); + for (draw = first; draw != NULL; draw = draw->next) { + if (draw->type == XkbDW_Section) + PSSection(out, &state, draw->u.section); + else { + PSDoodad(out, &state, draw->u.doodad); + } + } + PSPageTrailer(out, &state); + state.args->baseLabelGroup += state.args->nLabelGroups; } XkbFreeOrderedDrawables(first); - PSFileTrailer(out,&state); + PSFileTrailer(out, &state); return True; } |