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 }
|