7 char dev_dir
[PATHLEN
]; /* device directory */
8 char dev_dev
[PATHLEN
]; /* output device name */
9 int dev_res
; /* device resolution */
10 int dev_uwid
; /* device unitwidth */
11 int dev_hor
; /* minimum horizontal movement */
12 int dev_ver
; /* minimum vertical movement */
15 static char fn_name
[NFONTS
][FNLEN
]; /* font names */
16 static struct font
*fn_font
[NFONTS
]; /* font structs */
17 static int fn_n
; /* number of mounted fonts */
19 /* .fspecial request */
20 static char fspecial_fn
[NFONTS
][FNLEN
]; /* .fspecial first arguments */
21 static char fspecial_sp
[NFONTS
][FNLEN
]; /* .fspecial special fonts */
22 static int fspecial_n
; /* number of fonts in fspecial_sp[] */
24 static void skipline(FILE* filp
)
29 } while (c
!= '\n' && c
!= EOF
);
32 static void dev_prologue(void)
34 out("x T %s\n", dev_dev
);
35 out("x res %d %d %d\n", dev_res
, dev_hor
, dev_ver
);
39 int dev_mnt(int pos
, char *id
, char *name
)
43 sprintf(path
, "%s/dev%s/%s", dev_dir
, dev_dev
, name
);
48 font_close(fn_font
[pos
]);
49 if (fn_name
[pos
] != name
) /* ignore if fn_name[pos] is passed */
50 strcpy(fn_name
[pos
], id
);
52 out("x font %d %s\n", pos
, name
);
56 int dev_open(char *dir
, char *dev
)
64 sprintf(path
, "%s/dev%s/DESC", dir
, dev
);
65 desc
= fopen(path
, "r");
68 while (fscanf(desc
, "%s", tok
) == 1) {
73 if (!strcmp("fonts", tok
)) {
74 fscanf(desc
, "%d", &fn_n
);
75 for (i
= 0; i
< fn_n
; i
++)
76 fscanf(desc
, "%s", fn_name
[i
+ 1]);
80 if (!strcmp("sizes", tok
)) {
81 while (fscanf(desc
, "%s", tok
) == 1)
82 if (!strcmp("0", tok
))
86 if (!strcmp("res", tok
)) {
87 fscanf(desc
, "%d", &dev_res
);
90 if (!strcmp("unitwidth", tok
)) {
91 fscanf(desc
, "%d", &dev_uwid
);
94 if (!strcmp("hor", tok
)) {
95 fscanf(desc
, "%d", &dev_hor
);
98 if (!strcmp("ver", tok
)) {
99 fscanf(desc
, "%d", &dev_ver
);
102 if (!strcmp("charset", tok
))
108 for (i
= 0; i
< fn_n
; i
++)
110 dev_mnt(i
, fn_name
[i
], fn_name
[i
]);
114 static void dev_epilogue(void)
124 for (i
= 0; i
< fn_n
; i
++) {
126 font_close(fn_font
[i
]);
131 /* glyph handling functions */
133 struct glyph
*dev_glyph(char *c
, int fn
)
137 if ((c
[0] == c_ec
|| c
[0] == c_ni
) && c
[1] == c_ec
)
139 if (c
[0] == c_ec
&& c
[1] == '(')
142 g
= font_find(fn_font
[fn
], c
);
145 for (i
= 0; i
< fspecial_n
; i
++)
146 if (dev_pos(fspecial_fn
[i
]) == fn
&& dev_pos(fspecial_sp
[i
]) >= 0)
147 if ((g
= font_find(dev_font(dev_pos(fspecial_sp
[i
])), c
)))
149 for (i
= 0; i
< fn_n
; i
++)
150 if (fn_font
[i
] && fn_font
[i
]->special
)
151 if ((g
= font_find(fn_font
[i
], c
)))
156 struct glyph
*dev_glyph_byid(char *id
, int fn
)
158 return font_glyph(fn_font
[fn
], id
);
161 int dev_kernpair(char *c1
, char *c2
)
166 /* return the mounted position of a font */
167 int dev_pos(char *id
)
170 if (isdigit(id
[0])) {
172 if (num
< 0 || num
>= fn_n
|| !fn_font
[num
]) {
173 errmsg("bad font position\n");
178 for (i
= 1; i
< fn_n
; i
++)
179 if (!strcmp(fn_name
[i
], id
))
181 if (!strcmp(fn_name
[0], id
))
183 return dev_mnt(0, id
, id
);
186 /* return the mounted position of a font struct */
187 int dev_fontpos(struct font
*fn
)
190 for (i
= 0; i
< fn_n
; i
++)
191 if (fn_font
[i
] == fn
)
196 /* return the font struct at pos */
197 struct font
*dev_font(int pos
)
199 return pos
>= 0 && pos
< fn_n
? fn_font
[pos
] : NULL
;
202 int dev_getcs(int fn
)
204 return dev_font(fn
)->cs
;
207 void dev_setcs(int fn
, int cs
)
210 dev_font(fn
)->cs
= cs
;
213 int dev_getbd(int fn
)
215 return dev_font(fn
)->bd
;
218 void dev_setbd(int fn
, int bd
)
221 dev_font(fn
)->bd
= bd
;
224 void tr_fspecial(char **args
)
232 for (i
= 2; i
< NARGS
; i
++) {
233 if (args
[i
] && fspecial_n
< LEN(fspecial_fn
)) {
234 strcpy(fspecial_fn
[fspecial_n
], fn
);
235 strcpy(fspecial_sp
[fspecial_n
], args
[i
]);