annotate tools/x11fonts.c @ 0:5242703e91d3 tip

Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author tomwalters
date Fri, 20 May 2011 15:19:45 +0100
parents
children
rev   line source
tomwalters@0 1 /*
tomwalters@0 2 List font names in font style.
tomwalters@0 3
tomwalters@0 4 Usage: x11fonts [options] name_pattern
tomwalters@0 5
tomwalters@0 6 To enter name_patterns with wildcards, use forward quote,
tomwalters@0 7 (eg. x11fonts 'vt*' finds all font names beginning with vt).
tomwalters@0 8
tomwalters@0 9 Option -l = list font names
tomwalters@0 10 Default option = display font names (X11).
tomwalters@0 11
tomwalters@0 12 The display format is: "i/n fontname"
tomwalters@0 13 where the displayed name is the i'th out of n names which match the
tomwalters@0 14 given name_pattern.
tomwalters@0 15 The name is displayed at the current cursor position.
tomwalters@0 16
tomwalters@0 17 The centre mouse button gets the next fontname in the list.
tomwalters@0 18 The left button exits.
tomwalters@0 19 The right button clears the display screen.
tomwalters@0 20 */
tomwalters@0 21
tomwalters@0 22 #include <stdio.h>
tomwalters@0 23 #include <math.h>
tomwalters@0 24 #include "x11coord.h"
tomwalters@0 25
tomwalters@0 26 #define FONTNAME_SIZE 256
tomwalters@0 27
tomwalters@0 28 char printlist=0;
tomwalters@0 29 char printcount=0;
tomwalters@0 30 char printpath=0;
tomwalters@0 31
tomwalters@0 32 char **list = (char **)0 ;
tomwalters@0 33 char **pattern = (char **)0 ;
tomwalters@0 34 int num_patterns ;
tomwalters@0 35
tomwalters@0 36 int prompt_height ;
tomwalters@0 37 int Y0 = 0 ;
tomwalters@0 38 int Y = 0 ;
tomwalters@0 39
tomwalters@0 40 char prompt[FONTNAME_SIZE] ;
tomwalters@0 41
tomwalters@0 42 main(argc, argv)
tomwalters@0 43 int argc ;
tomwalters@0 44 char *argv[] ;
tomwalters@0 45 {
tomwalters@0 46 Window w;
tomwalters@0 47 int i, j, n;
tomwalters@0 48
tomwalters@0 49 /* Search args list while args are single chars to prevent fontnames */
tomwalters@0 50 /* which start with a `-' from being interpreted as args */
tomwalters@0 51
tomwalters@0 52 while ( --argc > 0 && **++argv == '-' && strlen( *argv ) < 3 )
tomwalters@0 53 switch (*++*argv) {
tomwalters@0 54 case 'l': ++printlist; break;
tomwalters@0 55 case 'n': ++printcount; break;
tomwalters@0 56 case 'P': ++printpath; break;
tomwalters@0 57 case 'h':
tomwalters@0 58 case 'H': help();
tomwalters@0 59 }
tomwalters@0 60
tomwalters@0 61 if ( argc == 0 ) num_patterns = 1 ;
tomwalters@0 62 else num_patterns = argc ;
tomwalters@0 63
tomwalters@0 64 pattern = (char **)malloc( num_patterns * sizeof(char *) ) ;
tomwalters@0 65 for ( i=0 ; i < num_patterns ; i++ )
tomwalters@0 66 pattern[i] = (char *)malloc( FONTNAME_SIZE * sizeof(char) ) ;
tomwalters@0 67
tomwalters@0 68 if ( argc == 0 )
tomwalters@0 69 sprintf( pattern[0], "*\0" );
tomwalters@0 70 else
tomwalters@0 71 for ( i=0 ; i < num_patterns ; i++ )
tomwalters@0 72 sprintf( pattern[i], "%s\0", *argv++ ) ;
tomwalters@0 73
tomwalters@0 74
tomwalters@0 75 set_window_parameters(BOXXORG,BOXYORG, BOXWIDTH,BOXHEIGHT);
tomwalters@0 76 xopen();
tomwalters@0 77
tomwalters@0 78 if ( printpath ) {
tomwalters@0 79 list = XGetFontPath( theDisplay, &n ) ;
tomwalters@0 80 for ( j=0 ; j < n ; j++ )
tomwalters@0 81 printf("%s\n", list[j]);
tomwalters@0 82 XFreeFontPath( list ) ;
tomwalters@0 83 exit( 0 ) ;
tomwalters@0 84 }
tomwalters@0 85
tomwalters@0 86 if ( printcount || printlist ) {
tomwalters@0 87 for ( i=0 ; i < num_patterns ; i++ ) {
tomwalters@0 88 list = XListFonts(theDisplay, pattern[i], 1000, &n);
tomwalters@0 89 if (n>0) {
tomwalters@0 90 if ( printcount )
tomwalters@0 91 printf("%d of %s\n", n, pattern[i]);
tomwalters@0 92 else if ( printlist )
tomwalters@0 93 for ( j=0 ; j < n ; j++ )
tomwalters@0 94 printf("%3d %s\n", j+1, list[j]);
tomwalters@0 95 }
tomwalters@0 96 else
tomwalters@0 97 fprintf(stderr, "no font names found to match pattern = %s\n", pattern[i] ) ;
tomwalters@0 98
tomwalters@0 99 XFreeFontNames(list);
tomwalters@0 100 }
tomwalters@0 101 exit( 0 ) ;
tomwalters@0 102 }
tomwalters@0 103
tomwalters@0 104 if ( setFont( theFontString ) == NULL ) {
tomwalters@0 105 fprintf( stderr,"x11fonts: no prompts as can't load default font \"%s\"\n", theFontString ) ;
tomwalters@0 106 prompt_height = 0 ;
tomwalters@0 107 }
tomwalters@0 108 else
tomwalters@0 109 prompt_height = line(1) ;
tomwalters@0 110
tomwalters@0 111 w = xcreate("fonts", ButtonPressMask | ExposureMask);
tomwalters@0 112 xevent_monitor(w);
tomwalters@0 113
tomwalters@0 114 if ( list != (char **)0 ) XFreeFontNames(list);
tomwalters@0 115 XCloseDisplay( theDisplay ) ;
tomwalters@0 116 }
tomwalters@0 117
tomwalters@0 118
tomwalters@0 119 xevent_monitor(w)
tomwalters@0 120 Window w;
tomwalters@0 121 {
tomwalters@0 122 XEvent event;
tomwalters@0 123 int n, i = 0, j = 0 ;
tomwalters@0 124
tomwalters@0 125 for ( ; ; ) {
tomwalters@0 126 XNextEvent(theDisplay,&event); switch (event.type) {
tomwalters@0 127 case ButtonPress:
tomwalters@0 128 switch(event.xbutton.button) {
tomwalters@0 129 case Button1: /* Left */
tomwalters@0 130 Y = Y0 ;
tomwalters@0 131 if ( j < n ) {
tomwalters@0 132 XClearArea( theDisplay, w, 0, Y+2*prompt_height, BOXWIDTH, BOXHEIGHT-Y, 0 ) ;
tomwalters@0 133 print_alphabet(w, list, j++, n);
tomwalters@0 134 }
tomwalters@0 135 break ;
tomwalters@0 136 case Button2: /* Middle */
tomwalters@0 137 Y0 = Y ;
tomwalters@0 138 if (j<n) print_alphabet(w, list, j++, n);
tomwalters@0 139 break;
tomwalters@0 140 case Button3: /* Right */
tomwalters@0 141 if ( ++i >= num_patterns ) return ;
tomwalters@0 142 j = 0 ;
tomwalters@0 143 if ( list != (char **)0 ) XFreeFontNames(list);
tomwalters@0 144 list = XListFonts(theDisplay, pattern[i], 1000, &n);
tomwalters@0 145 if ( prompt_height ) {
tomwalters@0 146 setFont( theFontString ) ;
tomwalters@0 147 XClearArea( theDisplay, w, 0, 0, BOXWIDTH, 2*prompt_height, 0 ) ;
tomwalters@0 148 if ( n > 0 ) {
tomwalters@0 149 sprintf( prompt, "pattern = %s", pattern[i]);
tomwalters@0 150 topline(w,prompt);
tomwalters@0 151 }
tomwalters@0 152 else {
tomwalters@0 153 sprintf( prompt, "no font names found to match pattern = %s", pattern[i] ) ;
tomwalters@0 154 topline(w,prompt);
tomwalters@0 155 }
tomwalters@0 156 }
tomwalters@0 157 break;
tomwalters@0 158 default:
tomwalters@0 159 fprintf(stderr,"button %d not used\n", event.xbutton.button);
tomwalters@0 160 }
tomwalters@0 161 break;
tomwalters@0 162 case Expose:
tomwalters@0 163 if ( event.xexpose.count == 0 ) {
tomwalters@0 164 list = XListFonts(theDisplay, pattern[i], 1000, &n);
tomwalters@0 165 if ( prompt_height ) {
tomwalters@0 166 setFont( theFontString ) ;
tomwalters@0 167 if (n>0) {
tomwalters@0 168 sprintf( prompt, "pattern = %s", pattern[i]);
tomwalters@0 169 topline(w,prompt);
tomwalters@0 170 }
tomwalters@0 171 else {
tomwalters@0 172 sprintf( prompt, "no font names found to match pattern = %s", pattern[i] ) ;
tomwalters@0 173 topline(w,prompt);
tomwalters@0 174 }
tomwalters@0 175 }
tomwalters@0 176 if ( n > 0 ) {
tomwalters@0 177 Y = Y0 ;
tomwalters@0 178 print_alphabet(w, list, j++, n);
tomwalters@0 179 }
tomwalters@0 180 }
tomwalters@0 181 break;
tomwalters@0 182 default:
tomwalters@0 183 fprintf(stderr,"event type %d not found\n", event.type);
tomwalters@0 184 }
tomwalters@0 185 }
tomwalters@0 186 }
tomwalters@0 187
tomwalters@0 188
tomwalters@0 189
tomwalters@0 190 char alphabet[] = "abcdefghijklmnopqrstuvwxyz\
tomwalters@0 191 ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
tomwalters@0 192
tomwalters@0 193 print_alphabet(w, fontlist, m, n)
tomwalters@0 194 Window w;
tomwalters@0 195 char **fontlist;
tomwalters@0 196 int m,n;
tomwalters@0 197 {
tomwalters@0 198 int i,j,k, x,y;
tomwalters@0 199 char str[128];
tomwalters@0 200
tomwalters@0 201 if ( prompt_height ) {
tomwalters@0 202
tomwalters@0 203 setFont( theFontString ) ;
tomwalters@0 204 sprintf(str, "[%d/%d] %s", m+1, n, fontlist[m]);
tomwalters@0 205
tomwalters@0 206 Y += line(3) ;
tomwalters@0 207 XDrawString(theDisplay,w,theGC,0,Y,str,strlen(str)) ;
tomwalters@0 208
tomwalters@0 209 y = line(2);
tomwalters@0 210 }
tomwalters@0 211 else y = 0 ;
tomwalters@0 212
tomwalters@0 213 setFont( fontlist[m] );
tomwalters@0 214 if (y < line(2)) Y += line(2); /* set to start of larger font */
tomwalters@0 215 else Y += y ;
tomwalters@0 216
tomwalters@0 217 y = Y ;
tomwalters@0 218 for (i=0, k=0 ; i<nlines() && k<62; i++) {
tomwalters@0 219 x = leftmargin();
tomwalters@0 220 for (j=0 ; j<(ncols())-1 && k<62; j++) {
tomwalters@0 221 XDrawString(theDisplay, w, theGC, x,y, &alphabet[k++], 1);
tomwalters@0 222 x += colwidth();
tomwalters@0 223 }
tomwalters@0 224 y += lineheight();
tomwalters@0 225 }
tomwalters@0 226 Y = y ;
tomwalters@0 227
tomwalters@0 228
tomwalters@0 229 if ( Y > BOXHEIGHT ) {
tomwalters@0 230 Y = Y0 = 0 ;
tomwalters@0 231 XClearArea( theDisplay, w, 0, 2*prompt_height, BOXWIDTH, BOXHEIGHT-prompt_height, 0 ) ;
tomwalters@0 232 print_alphabet(w, fontlist, m, n) ;
tomwalters@0 233 }
tomwalters@0 234 }
tomwalters@0 235
tomwalters@0 236
tomwalters@0 237 help()
tomwalters@0 238 {
tomwalters@0 239 fprintf(stderr,"Usage: x11fonts [options] [name_patterns]\n");
tomwalters@0 240 fprintf(stderr,"(name_patterns containing wild-cards must be quoted. Default = \"*\") \n");
tomwalters@0 241 fprintf(stderr,"options: \n");
tomwalters@0 242 fprintf(stderr," -n = print count of matching font names found in search path\n");
tomwalters@0 243 fprintf(stderr," -l = list matching font names \n");
tomwalters@0 244 fprintf(stderr," -P = print the current font search path\n");
tomwalters@0 245 exit(1);
tomwalters@0 246 }