1 /* Copyright (C) 2008-2012 by George Williams */
2 /*
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are met:
5 
6  * Redistributions of source code must retain the above copyright notice, this
7  * list of conditions and the following disclaimer.
8 
9  * Redistributions in binary form must reproduce the above copyright notice,
10  * this list of conditions and the following disclaimer in the documentation
11  * and/or other materials provided with the distribution.
12 
13  * The name of the author may not be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15 
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include <fontforge-config.h>
29 
30 #include "gdrawP.h"		/* Need resolution of screen */
31 #include "ggadget.h"
32 #include "ggadgetP.h"
33 #include "gresedit.h"
34 #include "gwidget.h"
35 #include "ustring.h"
36 
37 struct tofree {
38     GGadgetCreateData *gcd;
39     GTextInfo *lab;
40     GGadgetCreateData mainbox[2], flagsbox, colbox, extrabox, ibox, fontbox,
41 	sabox;
42     GGadgetCreateData *marray[11], *farray[5][6], *carray[12][9], *(*earray)[8];
43     GGadgetCreateData *iarray[4], *fontarray[5], *saarray[5];
44     char *fontname;
45     char **extradefs;
46     char bw[20], padding[20], rr[20];
47     GResInfo *res;
48     int startcid, fontcid, btcid;
49 };
50 
51 typedef struct greseditdlg {
52     struct tofree *tofree;
53     GWindow gw;
54     GGadget *tabset;
55     const char *def_res_file;
56     void (*change_res_filename)(const char *);
57     int done;
58 } GRE;
59 
60 static GTextInfo bordertype[] = {
61     { (unichar_t *) "None", NULL, 0, 0, (void *) (intpt) bt_none, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
62     { (unichar_t *) "Box", NULL, 0, 0, (void *) (intpt) bt_box, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
63     { (unichar_t *) "Raised", NULL, 0, 0, (void *) (intpt) bt_raised, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
64     { (unichar_t *) "Lowered", NULL, 0, 0, (void *) (intpt) bt_lowered, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
65     { (unichar_t *) "Engraved", NULL, 0, 0, (void *) (intpt) bt_engraved, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
66     { (unichar_t *) "Embossed", NULL, 0, 0, (void *) (intpt) bt_embossed, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
67     { (unichar_t *) "Double", NULL, 0, 0, (void *) (intpt) bt_double, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
68     GTEXTINFO_EMPTY
69 };
70 
71 static GTextInfo bordershape[] = {
72     { (unichar_t *) "Rect", NULL, 0, 0, (void *) (intpt) bs_rect, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
73     { (unichar_t *) "Round Rect", NULL, 0, 0, (void *) (intpt) bs_roundrect, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
74     { (unichar_t *) "Elipse", NULL, 0, 0, (void *) (intpt) bs_elipse, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
75     { (unichar_t *) "Diamond", NULL, 0, 0, (void *) (intpt) bs_diamond, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
76     GTEXTINFO_EMPTY
77 };
78 
GRE_RefreshAll(GRE * gre)79 static void GRE_RefreshAll(GRE *gre) {
80     GDrawRequestExpose(gre->gw,NULL,false);
81     GDrawRequestExpose(GTabSetGetSubwindow(gre->tabset,GTabSetGetSel(gre->tabset)),NULL,false);
82 }
83 
GFontSpec2String(GFont * font)84 static char *GFontSpec2String(GFont *font) {
85     int len;
86     char *fontname;
87     FontRequest rq;
88 
89     if ( font==NULL )
90 return( copy(""));
91 
92     GDrawDecomposeFont(font,&rq);
93     if ( rq.family_name!=NULL )
94 	len = 4*u_strlen(rq.family_name);
95     else
96 	len = strlen(rq.utf8_family_name);
97     len += 6 /* point size */ + 1 +
98 	    5 /* weight */ + 1 +
99 	    10 /* style */;
100     fontname = malloc(len);
101     if ( rq.family_name!=NULL ) {
102 	char *utf8_name = u2utf8_copy(rq.family_name);
103 	sprintf( fontname, "%d %s%dpt %s", rq.weight,
104 	    rq.style&1 ? "italic " : "",
105 	    rq.point_size,
106 	    utf8_name );
107 	free(utf8_name );
108     } else
109 	sprintf( fontname, "%d %s%dpt %s", rq.weight,
110 	    rq.style&1 ? "italic " : "",
111 	    rq.point_size,
112 	    rq.utf8_family_name );
113 return( fontname );
114 }
115 
GRE_Reflow(GRE * gre,GResInfo * res)116 static void GRE_Reflow(GRE *gre,GResInfo *res) {
117     if ( res->examples!=NULL &&
118 	    ( res->examples->creator==GHBoxCreate ||
119 	      res->examples->creator==GVBoxCreate ||
120 	      res->examples->creator==GHVBoxCreate ))
121 	GHVBoxReflow(res->examples->ret);
122     GRE_RefreshAll(gre);
123 }
124 
GRE_FigureInheritance(GRE * gre,GResInfo * parent,int cid_off_inh,int cid_off_data,int is_font,void * whatever,void (* do_something)(GRE * gre,int child_index,int cid_off_data,void * whatever))125 static void GRE_FigureInheritance( GRE *gre, GResInfo *parent, int cid_off_inh,
126 	int cid_off_data, int is_font, void *whatever,
127 	void (*do_something)(GRE *gre, int child_index, int cid_off_data, void *whatever)) {
128     /* Look through the gadget tree for gadgets which inherit from parent */
129     /*  (which just changed) then check if this child ggadget actually does */
130     /*  inherit this field. If it does, set the field to the new value, and */
131     /*  look for any grandchildren which inherit from the child, and so forth */
132     GResInfo *child;
133     int i;
134 
135     for ( i=0; (child = gre->tofree[i].res)!=NULL; ++i ) {
136 	if ( child->inherits_from==parent &&
137 		(( is_font && child->font!=NULL ) ||
138 		 ( !is_font && child->boxdata!=NULL)) ) {
139 	     /* Fonts may have a different cid offset depending on wether */
140 	     /* The ResInfo has a box or not */
141 	    if (( is_font && GGadgetIsChecked(GWidgetGetControl(gre->gw,gre->tofree[i].fontcid-2)) ) ||
142 		    ( !is_font && GGadgetIsChecked(GWidgetGetControl(gre->gw,gre->tofree[i].startcid+cid_off_inh)) )) {
143 		(do_something)(gre,i,cid_off_data,whatever);
144 		GRE_FigureInheritance(gre,child,cid_off_inh,cid_off_data,is_font,whatever,do_something);
145 	    }
146 	}
147     }
148 }
149 
inherit_color_change(GRE * gre,int childindex,int cid_off,void * whatever)150 static void inherit_color_change(GRE *gre, int childindex, int cid_off,
151 	void *whatever) {
152     GGadget *g = GWidgetGetControl(gre->gw,gre->tofree[childindex].startcid+cid_off);
153     Color col = (Color) (intpt) whatever;
154 
155     GColorButtonSetColor(g,col);
156     *((Color *) GGadgetGetUserData(g)) = col;
157 }
158 
inherit_list_change(GRE * gre,int childindex,int cid_off,void * whatever)159 static void inherit_list_change(GRE *gre, int childindex, int cid_off,
160 	void *whatever) {
161     GGadget *g = GWidgetGetControl(gre->gw,gre->tofree[childindex].startcid+cid_off);
162     int sel = (intpt) whatever;
163 
164     GGadgetSelectOneListItem(g,sel);
165     *((uint8 *) GGadgetGetUserData(g)) = sel;
166 }
167 
inherit_byte_change(GRE * gre,int childindex,int cid_off,void * whatever)168 static void inherit_byte_change(GRE *gre, int childindex, int cid_off,
169 	void *whatever) {
170     GGadget *g = GWidgetGetControl(gre->gw,gre->tofree[childindex].startcid+cid_off);
171     int val = (intpt) whatever;
172     char buf[20];
173 
174     sprintf( buf, "%d", val );
175     GGadgetSetTitle8(g,buf);
176     *((uint8 *) GGadgetGetUserData(g)) = val;
177 }
178 
inherit_flag_change(GRE * gre,int childindex,int cid_off,void * whatever)179 static void inherit_flag_change(GRE *gre, int childindex, int cid_off,
180 	void *whatever) {
181     GGadget *g = GWidgetGetControl(gre->gw,gre->tofree[childindex].startcid+cid_off);
182     int on = (intpt) whatever;
183     int flag = (intpt) GGadgetGetUserData(g);
184     GResInfo *res = gre->tofree[childindex].res;
185 
186     if ( on )
187 	res->boxdata->flags |= flag;
188     else
189 	res->boxdata->flags &= ~flag;
190     GGadgetSetChecked(g,on);
191 }
192 
193 struct inherit_font_data { char *spec; GFont *font; };
194 
inherit_font_change(GRE * gre,int childindex,int cid_off,void * whatever)195 static void inherit_font_change(GRE *gre, int childindex, int cid_off,
196 	void *whatever) {
197     GGadget *g = GWidgetGetControl(gre->gw,gre->tofree[childindex].fontcid);
198     struct inherit_font_data *ifd = (struct inherit_font_data *) whatever;
199 
200     if ( ifd->font!=NULL )
201 	*(gre->tofree[childindex].res->font) = ifd->font;
202     GGadgetSetTitle8(g,ifd->spec);
203 }
204 
GRE_InheritColChange(GGadget * g,GEvent * e)205 static int GRE_InheritColChange(GGadget *g, GEvent *e) {
206 
207     if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
208 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
209 	int cid = GGadgetGetCid(g), on = GGadgetIsChecked(g);
210 	GGadgetSetEnabled(GWidgetGetControl(gre->gw,cid+1),!on);
211 	g = GWidgetGetControl(gre->gw,cid+2);
212 	GGadgetSetEnabled(g,!on);
213 	if ( on ) {
214 	    int index = GTabSetGetSel(gre->tabset);
215 	    GResInfo *res = gre->tofree[index].res;
216 	    int offset = ((char *) GGadgetGetUserData(g)) - ((char *) (res->boxdata));
217 	    Color col = *((Color *) (((char *) (res->inherits_from->boxdata))+offset));
218 	    if ( col!= *(Color *) GGadgetGetUserData(g) ) {
219 		int cid_off = cid - gre->tofree[index].startcid;
220 		GColorButtonSetColor(g,col);
221 		*((Color *) GGadgetGetUserData(g)) = col;
222 		GRE_FigureInheritance(gre,res,cid_off,cid_off+2,false,
223 			(void *) (intpt) col, inherit_color_change);
224 		GRE_RefreshAll(gre);
225 	    }
226 	}
227     }
228 return( true );
229 }
230 
GRE_InheritListChange(GGadget * g,GEvent * e)231 static int GRE_InheritListChange(GGadget *g, GEvent *e) {
232 
233     if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
234 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
235 	int cid = GGadgetGetCid(g), on = GGadgetIsChecked(g);
236 	GGadgetSetEnabled(GWidgetGetControl(gre->gw,cid+1),!on);
237 	g = GWidgetGetControl(gre->gw,cid+2);
238 	GGadgetSetEnabled(g,!on);
239 	if ( on ) {
240 	    int index = GTabSetGetSel(gre->tabset);
241 	    GResInfo *res = gre->tofree[index].res;
242 	    int offset = ((char *) GGadgetGetUserData(g)) - ((char *) (res->boxdata));
243 	    int sel = *((uint8 *) (((char *) (res->inherits_from->boxdata))+offset));
244 	    if ( sel != *(uint8 *) GGadgetGetUserData(g) ) {
245 		int cid_off = cid - gre->tofree[index].startcid;
246 		GGadgetSelectOneListItem(g,sel);
247 		*((uint8 *) GGadgetGetUserData(g)) = sel;
248 		GRE_FigureInheritance(gre,res,cid_off,cid_off+2,false,
249 			(void *) (intpt) sel, inherit_list_change);
250 		GRE_Reflow(gre,res);
251 	    }
252 	}
253     }
254 return( true );
255 }
256 
GRE_InheritByteChange(GGadget * g,GEvent * e)257 static int GRE_InheritByteChange(GGadget *g, GEvent *e) {
258 
259     if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
260 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
261 	int cid = GGadgetGetCid(g), on = GGadgetIsChecked(g);
262 	GGadgetSetEnabled(GWidgetGetControl(gre->gw,cid+1),!on);
263 	g = GWidgetGetControl(gre->gw,cid+2);
264 	GGadgetSetEnabled(g,!on);
265 	if ( on ) {
266 	    int index = GTabSetGetSel(gre->tabset);
267 	    GResInfo *res = gre->tofree[index].res;
268 	    int offset = ((char *) GGadgetGetUserData(g)) - ((char *) (res->boxdata));
269 	    int val = *((uint8 *) (((char *) (res->inherits_from->boxdata))+offset));
270 	    if ( val != *(uint8 *) GGadgetGetUserData(g) ) {
271 		int cid_off = cid - gre->tofree[index].startcid;
272 		char buf[20];
273 		sprintf( buf, "%d", val );
274 		GGadgetSetTitle8(g,buf);
275 		*((uint8 *) GGadgetGetUserData(g)) = val;
276 		GRE_FigureInheritance(gre,res,cid_off,cid_off+2,false,
277 			(void *) (intpt) val, inherit_byte_change);
278 		GRE_Reflow(gre,res);
279 	    }
280 	}
281     }
282 return( true );
283 }
284 
GRE_InheritFlagChange(GGadget * g,GEvent * e)285 static int GRE_InheritFlagChange(GGadget *g, GEvent *e) {
286 
287     if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
288 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
289 	int cid = GGadgetGetCid(g), on = GGadgetIsChecked(g);
290 	g = GWidgetGetControl(gre->gw,cid+1);
291 	GGadgetSetEnabled(g,!on);
292 	if ( on ) {
293 	    int index = GTabSetGetSel(gre->tabset);
294 	    GResInfo *res = gre->tofree[index].res;
295 	    int flag = (intpt) GGadgetGetUserData(g);
296 	    if ( (res->boxdata->flags&flag) != (res->inherits_from->boxdata->flags&flag)) {
297 		int cid_off = cid - gre->tofree[index].startcid;
298 		int on = (res->inherits_from->boxdata->flags&flag)?1:0 ;
299 		GGadgetSetChecked(g,on);
300 		if ( on )
301 		    res->boxdata->flags |= flag;
302 		else
303 		    res->boxdata->flags &= ~flag;
304 		GRE_FigureInheritance(gre,res,cid_off,cid_off+2,false,
305 			(void *) (intpt) on, inherit_flag_change);
306 		GRE_Reflow(gre,res);
307 	    }
308 	}
309     }
310 return( true );
311 }
312 
GRE_InheritFontChange(GGadget * g,GEvent * e)313 static int GRE_InheritFontChange(GGadget *g, GEvent *e) {
314 
315     if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
316 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
317 	int cid = GGadgetGetCid(g), on = GGadgetIsChecked(g);
318 	GGadgetSetEnabled(GWidgetGetControl(gre->gw,cid+1),!on);
319 	g = GWidgetGetControl(gre->gw,cid+2);
320 	GGadgetSetEnabled(g,!on);
321 	if ( on ) {
322 	    int index = GTabSetGetSel(gre->tabset);
323 	    GResInfo *res = gre->tofree[index].res;
324 	    int pi;
325 	    for ( pi=0; gre->tofree[pi].res!=NULL && gre->tofree[pi].res!=res->inherits_from; ++pi );
326 	    if ( gre->tofree[pi].res!=NULL ) {
327 		struct inherit_font_data ifd;
328 		int cid_off = cid - gre->tofree[index].startcid;
329 
330 		ifd.spec = GGadgetGetTitle8(GWidgetGetControl(gre->gw,gre->tofree[pi].fontcid));
331 		ifd.font = *gre->tofree[pi].res->font;
332 		*res->font = ifd.font;
333 
334 		GGadgetSetTitle8(g,ifd.spec);
335 		GRE_FigureInheritance(gre,res,cid_off,cid_off+2,true,
336 			(void *) &ifd, inherit_font_change);
337 		free( ifd.spec );
338 	    }
339 	}
340     }
341 return( true );
342 }
343 
GRE_FlagChanged(GGadget * g,GEvent * e)344 static int GRE_FlagChanged(GGadget *g, GEvent *e) {
345 
346     if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
347 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
348 	int index = GTabSetGetSel(gre->tabset);
349 	GResInfo *res = gre->tofree[index].res;
350 	int cid_off = GGadgetGetCid(g) - gre->tofree[index].startcid;
351 	int on;
352 	if ( (on = GGadgetIsChecked(g)) )
353 	    res->boxdata->flags |= (int) (intpt) GGadgetGetUserData(g);
354 	else
355 	    res->boxdata->flags &= ~(int) (intpt) GGadgetGetUserData(g);
356 	GRE_FigureInheritance(gre,res,cid_off-1,cid_off,false,
357 		(void *) (intpt) on, inherit_flag_change);
358 	GRE_Reflow(gre,res);
359     }
360 return( true );
361 }
362 
GRE_ListChanged(GGadget * g,GEvent * e)363 static int GRE_ListChanged(GGadget *g, GEvent *e) {
364 
365     if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) {
366 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
367 	int index = GTabSetGetSel(gre->tabset);
368 	GResInfo *res = gre->tofree[index].res;
369 	int cid_off = GGadgetGetCid(g) - gre->tofree[index].startcid;
370 	int sel = GGadgetGetFirstListSelectedItem(g);
371 
372 	*((uint8 *) GGadgetGetUserData(g)) = sel;
373 	GRE_FigureInheritance(gre,res,cid_off-2,cid_off,false,
374 		(void *) (intpt) sel, inherit_list_change);
375 	GRE_Reflow(gre,res);
376     }
377 return( true );
378 }
379 
GRE_BoolChanged(GGadget * g,GEvent * e)380 static int GRE_BoolChanged(GGadget *g, GEvent *e) {
381 
382     if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
383 	*((int *) GGadgetGetUserData(g)) = GGadgetIsChecked(g);
384     }
385 return( true );
386 }
387 
GRE_ByteChanged(GGadget * g,GEvent * e)388 static int GRE_ByteChanged(GGadget *g, GEvent *e) {
389 
390     if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) {
391 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
392 	char *txt = GGadgetGetTitle8(g), *end;
393 	int val = strtol(txt,&end,10);
394 	int index = GTabSetGetSel(gre->tabset);
395 	GResInfo *res = gre->tofree[index].res;
396 	if ( *end=='\0' && val>=0 && val<=255 ) {
397 	    int cid_off = GGadgetGetCid(g) - gre->tofree[index].startcid;
398 	    *((uint8 *) GGadgetGetUserData(g)) = val;
399 	    GRE_FigureInheritance(gre,res,cid_off-2,cid_off,false,
400 		    (void *) (intpt) val, inherit_byte_change);
401 	    GRE_Reflow(gre,res);
402 	}
403 	free(txt);
404     }
405 return( true );
406 }
407 
GRE_IntChanged(GGadget * g,GEvent * e)408 static int GRE_IntChanged(GGadget *g, GEvent *e) {
409 
410     if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) {
411 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
412 	char *txt = GGadgetGetTitle8(g), *end;
413 	int val = strtol(txt,&end,10);
414 	int index = GTabSetGetSel(gre->tabset);
415 	GResInfo *res = gre->tofree[index].res;
416 	if ( *end=='\0' ) {
417 	    *((int *) GGadgetGetUserData(g)) = val;
418 	    GRE_Reflow(gre,res);
419 	}
420 	free(txt);
421     }
422 return( true );
423 }
424 
GRE_DoubleChanged(GGadget * g,GEvent * e)425 static int GRE_DoubleChanged(GGadget *g, GEvent *e) {
426 
427     if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) {
428 	char *txt = GGadgetGetTitle8(g), *end;
429 	double val = strtod(txt,&end);
430 	if ( *end=='\0' )
431 	    *((double *) GGadgetGetUserData(g)) = val;
432 	free(txt);
433     }
434 return( true );
435 }
436 
GRE_ColorChanged(GGadget * g,GEvent * e)437 static int GRE_ColorChanged(GGadget *g, GEvent *e) {
438 
439     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
440 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
441 	int index = GTabSetGetSel(gre->tabset);
442 	GResInfo *res = gre->tofree[index].res;
443 	int cid_off = GGadgetGetCid(g) - gre->tofree[index].startcid;
444 	Color col = GColorButtonGetColor(g);
445 
446 	*((Color *) GGadgetGetUserData(g)) = col;
447 	GRE_FigureInheritance(gre,res,cid_off-2,cid_off,false,
448 		(void *) (intpt) col, inherit_color_change);
449 	GRE_RefreshAll(gre);
450     }
451 return( true );
452 }
453 
GRE_ExtraColorChanged(GGadget * g,GEvent * e)454 static int GRE_ExtraColorChanged(GGadget *g, GEvent *e) {
455 
456     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
457 	Color col = GColorButtonGetColor(g);
458 
459 	*((Color *) GGadgetGetUserData(g)) = col;
460     }
461 return( true );
462 }
463 
GRE_FontChanged(GGadget * g,GEvent * e)464 static int GRE_FontChanged(GGadget *g, GEvent *e) {
465     struct inherit_font_data ifd;
466 
467     if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) {
468 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
469 	int index = GTabSetGetSel(gre->tabset);
470 	GResInfo *res = gre->tofree[index].res;
471 	int cid_off = GGadgetGetCid(g) - gre->tofree[index].startcid;
472 	char *fontdesc = GGadgetGetTitle8(g);
473 	ifd.spec = fontdesc;
474 	ifd.font = NULL;
475 
476 	GRE_FigureInheritance(gre,res,cid_off-2,cid_off,true,
477 		(void *) &ifd, inherit_font_change);
478 	free(fontdesc);
479     } else if ( e->type==et_controlevent && e->u.control.subtype == et_textfocuschanged &&
480 	    !e->u.control.u.tf_focus.gained_focus ) {
481 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
482 	if ( gre->tabset!=NULL ) {
483 	    int index = GTabSetGetSel(gre->tabset);
484 	    GResInfo *res = gre->tofree[index].res;
485 	    int cid_off = GGadgetGetCid(g) - gre->tofree[index].startcid;
486 	    char *fontdesc = GGadgetGetTitle8(g);
487 	    GFont *new = GResource_font_cvt(fontdesc,NULL);
488 
489 	    if ( new==NULL )
490 		gwwv_post_error(_("Bad font"),_("Bad font specification"));
491 	    else {
492 		ifd.spec = fontdesc;
493 		ifd.font = new;
494 
495 		*((GFont **) GGadgetGetUserData(g)) = new;
496 		GRE_FigureInheritance(gre,res,cid_off-2,cid_off,true,
497 			(void *) &ifd, inherit_font_change);
498 		GRE_Reflow(gre,res);
499 	    }
500 	    free(fontdesc);
501 	}
502     }
503 return( true );
504 }
505 
GRE_ParseFont(GGadget * g)506 static void GRE_ParseFont(GGadget *g) {
507     char *fontdesc = GGadgetGetTitle8(g);
508     GFont *new = GResource_font_cvt(fontdesc,NULL);
509 
510     if ( new==NULL )
511 	gwwv_post_error(_("Bad font"),_("Bad font specification"));
512     else {
513 	*((GFont **) GGadgetGetUserData(g)) = new;
514     }
515     free(fontdesc);
516 }
517 
GRE_ExtraFontChanged(GGadget * g,GEvent * e)518 static int GRE_ExtraFontChanged(GGadget *g, GEvent *e) {
519 
520     if ( e->type==et_controlevent && e->u.control.subtype == et_textfocuschanged &&
521 	    !e->u.control.u.tf_focus.gained_focus ) {
522 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
523 	if ( gre->tabset!=NULL ) {
524 	    GRE_ParseFont(g);
525 	}
526     }
527 return( true );
528 }
529 
GRE_StringChanged(GGadget * g,GEvent * e)530 static int GRE_StringChanged(GGadget *g, GEvent *e) {
531 
532     if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) {
533 	/*GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));*/
534     }
535 return( true );
536 }
537 
GRE_ImageChanged(GGadget * g,GEvent * e)538 static int GRE_ImageChanged(GGadget *g, GEvent *e) {
539 
540     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
541 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
542 	GResImage **ri = GGadgetGetUserData(g);
543 	char *new;
544 	GImage *newi;
545 	GRect size;
546 	new = gwwv_open_filename_with_path("Find Image",
547 		(*ri)==NULL?NULL: (*ri)->filename,
548 		"*.{png,jpeg,jpg,tiff,bmp,xbm}",NULL,
549 		_GGadget_GetImagePath());
550 	if ( new==NULL )
551 return( true );
552 	newi = GImageRead(new);
553 	if ( newi==NULL ) {
554 	    gwwv_post_error(_("Could not open image"),_("Could not open %s"), new );
555 	    free( new );
556 	} else if ( *ri==NULL ) {
557 	    *ri = calloc(1,sizeof(GResImage));
558 	    (*ri)->filename = new;
559 	    (*ri)->image = newi;
560 	    GGadgetSetTitle8(g,"...");
561 	} else {
562 	    free( (*ri)->filename );
563 	    (*ri)->filename = new;
564 	    if ( !_GGadget_ImageInCache((*ri)->image ) )
565 		GImageDestroy((*ri)->image);
566 	    (*ri)->image = newi;
567 	}
568 	((GButton *) g)->image = newi;
569 	GGadgetGetDesiredSize(g,&size,NULL);
570 	GGadgetResize(g,size.width,size.height);
571 	GRE_RefreshAll(gre);
572     }
573 return( true );
574 }
575 
GRE_DoCancel(GRE * gre)576 static void GRE_DoCancel(GRE *gre) {
577     int i;
578 
579     for ( i=0; gre->tofree[i].res!=NULL; ++i ) {
580 	GResInfo *res = gre->tofree[i].res;
581 	struct resed *extras;
582 	GResImage **_ri, *ri;
583 	if ( res->boxdata!=NULL )
584 	    *res->boxdata = res->orig_state;
585 	if ( res->extras!=NULL ) {
586 	    for ( extras = res->extras; extras->name!=NULL; extras++ ) {
587 		switch ( extras->type ) {
588 		  case rt_bool:
589 		  case rt_int:
590 		  case rt_color:
591 		  case rt_coloralpha:
592 		    *(int *) (extras->val) = extras->orig.ival;
593 		  break;
594 		  case rt_double:
595 		    *(int *) (extras->val) = extras->orig.dval;
596 		  break;
597 		  case rt_font:
598 		    *(GFont **) (extras->val) = extras->orig.fontval;
599 		  break;
600 		  case rt_image:
601 		    _ri = extras->val;
602 		    ri = *_ri;
603 		    if ( extras->orig.sval==NULL ) {
604 			if ( ri!=NULL ) {
605 			    free(ri->filename);
606 			    if ( ri->image!=NULL )
607 				GImageDestroy(ri->image);
608 			    free(ri);
609 			    *_ri = NULL;
610 			}
611 		    } else {
612 			if ( strcmp(extras->orig.sval,ri->filename)!=0 ) {
613 			    GImage *temp;
614 			    temp = GImageRead(extras->orig.sval);
615 			    if ( temp!=NULL ) {
616 				if ( !_GGadget_ImageInCache(ri->image ) )
617 				    GImageDestroy(ri->image);
618 				ri->image = temp;
619 			        free(ri->filename);
620 			        ri->filename = copy(extras->orig.sval);
621 			    }
622 			}
623 		    }
624 		  break;
625 		  case rt_string: case rt_stringlong:
626 		    /* These don't change dynamically */
627 		    /* Nothing to revert here */
628 		  break;
629 		}
630 	    }
631 	}
632     }
633     gre->done = true;
634 }
635 
GRE_ChangePane(GGadget * g,GEvent * e)636 static int GRE_ChangePane(GGadget *g, GEvent *e) {
637 
638     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
639 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
640 	GResInfo *new = GGadgetGetUserData(g);
641 	int i;
642 	for ( i=0; gre->tofree[i].res!=NULL && gre->tofree[i].res != new; ++i );
643 	if ( gre->tofree[i].res!=NULL )
644 	    GTabSetSetSel(gre->tabset,i);
645     }
646 return( true );
647 }
648 
GRE_Cancel(GGadget * g,GEvent * e)649 static int GRE_Cancel(GGadget *g, GEvent *e) {
650 
651     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
652 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
653 	GRE_DoCancel(gre);
654     }
655 return( true );
656 }
657 
TogglePrefs(GGadget * g,GEvent * e)658 static int TogglePrefs(GGadget *g, GEvent *e) {
659 
660     if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
661 	*((int *) GGadgetGetUserData(g)) = GGadgetIsChecked(g);
662     }
663 return( true );
664 }
665 
GRE_Save(GGadget * g,GEvent * e)666 static int GRE_Save(GGadget *g, GEvent *e) {
667     static char *shapes[] = { "rect", "roundrect", "elipse", "diamond", NULL };
668     static char *types[] = { "none", "box", "raised", "lowered", "engraved",
669         "embossed", "double", NULL };
670 
671     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
672         GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
673         char *filename;
674         FILE *output;
675         GGadgetCreateData gcd[2], *gcdp=NULL;
676         GTextInfo lab[1];
677         int update_prefs = true;
678         int i,j;
679         static char *flagnames[] = { "BorderInner", "BorderOuter", "ActiveInner",
680             "ShadowOuter", "DoDepressedBackground", "DrawDefault",
681             "GradientBG", NULL };
682         static char *colornames[] = { "NormalForeground", "DisabledForeground", "NormalBackground",
683             "DisabledBackground", "PressedBackground", "GradientStartCol", "BorderBrightest",
684             "BorderBrighter", "BorderDarker", "BorderDarkest", "BorderInnerCol", "BorderOuterCol",
685             "ActiveBorder",
686             NULL };
687         static char *intnames[] = { "BorderWidth", "Padding", "Radius", NULL };
688         struct resed *extras;
689 
690         if ( gre->change_res_filename != NULL ) {
691             memset(gcd,0,sizeof(gcd));
692             memset(lab,0,sizeof(lab));
693             lab[0].text = (unichar_t *) _("Store this filename in preferences");
694             lab[0].text_is_1byte = true;
695             gcd[0].gd.label = &lab[0];
696             gcd[0].gd.flags = gg_visible|gg_enabled|gg_cb_on;
697             gcd[0].gd.handle_controlevent = TogglePrefs;
698             gcd[0].data = &update_prefs;
699             gcd[0].creator = GCheckBoxCreate;
700             gcdp = gcd;
701         }
702 
703         filename = gwwv_save_filename_with_gadget(_("Save Resource file as..."),gre->def_res_file,NULL,gcdp);
704         if ( filename==NULL )
705             return true;
706         output = fopen( filename,"w" );
707         if ( output==NULL ) {
708             gwwv_post_error(_("Open failed"), _("Failed to open %s for output"), filename );
709             free(filename);
710             return true;
711         }
712         for ( i=0; gre->tofree[i].res!=NULL; ++i ) {
713             GResInfo *res = gre->tofree[i].res;
714             int cid = gre->tofree[i].startcid;
715             if ( res->boxdata!=NULL ) {
716                 for ( j=0; flagnames[j]!=NULL; ++j ) {
717                     if ( !GGadgetIsChecked( GWidgetGetControl(gre->gw,cid)) ||
718                         (res->override_mask&(1<<j)) ) {
719                     fprintf( output, "%s.%s.Box.%s: %s\n",
720                         res->progname, res->resname, flagnames[j],
721                             GGadgetIsChecked( GWidgetGetControl(gre->gw,cid+1))?"True" : "False" );
722                     }
723                     cid += 2;
724                 }
725                 for ( j=0; colornames[j]!=NULL; ++j ) {
726                     if ( !GGadgetIsChecked( GWidgetGetControl(gre->gw,cid))
727                         || (res->override_mask&(1<<(j+16))) ) {
728                     fprintf( output, "%s.%s.Box.%s: #%06x\n",
729                         res->progname, res->resname, colornames[j],
730                             GColorButtonGetColor( GWidgetGetControl(gre->gw,cid+2)) );
731                     }
732                     cid += 3;
733                 }
734                 if ( !GGadgetIsChecked( GWidgetGetControl(gre->gw,cid))
735                     || (res->override_mask&omf_border_type) ) {
736                     fprintf( output, "%s.%s.Box.BorderType: %s\n",
737                         res->progname, res->resname,
738                         types[ GGadgetGetFirstListSelectedItem(
739                              GWidgetGetControl(gre->gw,cid+2)) ] );
740                 }
741                 cid += 3;
742                 if ( !GGadgetIsChecked( GWidgetGetControl(gre->gw,cid))
743                     || (res->override_mask&omf_border_shape) ) {
744                     fprintf( output, "%s.%s.Box.BorderShape: %s\n",
745                         res->progname, res->resname,
746                         shapes[ GGadgetGetFirstListSelectedItem(
747                              GWidgetGetControl(gre->gw,cid+2)) ] );
748                 }
749                 cid += 3;
750                 for ( j=0; intnames[j]!=NULL; ++j ) {
751                     if ( !GGadgetIsChecked( GWidgetGetControl(gre->gw,cid))
752                         || (res->override_mask&(1<<(j+10))) ) {
753                     char *ival = GGadgetGetTitle8( GWidgetGetControl(gre->gw,cid+2));
754                     char *end;
755                     int val = strtol(ival,&end,10);
756                     if ( *end!='\0' || val<0 || val>255 )
757                         gwwv_post_error(_("Bad Number"), _("Bad numeric value for %s.%s"),
758                             res->resname, intnames[j]);
759                     fprintf( output, "%s.%s.Box.%s: %s\n",
760                         res->progname, res->resname, intnames[j], ival );
761                     free(ival);
762                     }
763                     cid += 3;
764                 }
765             }
766             if ( res->font!=NULL ) {
767                 if ( !GGadgetIsChecked( GWidgetGetControl(gre->gw,gre->tofree[i].fontcid-1))
768                       || (res->override_mask&omf_font) ) {
769                     char *ival = GGadgetGetTitle8( GWidgetGetControl(gre->gw,gre->tofree[i].fontcid));
770                     fprintf( output, "%s.%s.Font: %s\n",
771                         res->progname, res->resname, ival );
772                     free(ival);
773                 }
774             }
775             if ( res->extras!=NULL )
776                 for ( extras=res->extras; extras->name!=NULL; ++extras ) {
777                     GGadget *g = GWidgetGetControl(gre->gw,extras->cid);
778                 switch ( extras->type ) {
779                   case rt_bool:
780                     fprintf( output, "%s.%s%s%s: %s\n",
781                         res->progname, res->resname, *res->resname=='\0'?"":".",extras->resname,
782                         GGadgetIsChecked(g)?"True":"False");
783                     break;
784                   case rt_int: {
785                     char *ival = GGadgetGetTitle8( g );
786                     char *end;
787                     (void) strtol(ival,&end,10);
788                     if ( *end!='\0' )
789                         gwwv_post_error(_("Bad Number"), _("Bad numeric value for %s.%s"),
790                             res->resname, extras->name );
791                     fprintf( output, "%s.%s%s%s: %s\n",
792                         res->progname, res->resname, *res->resname=='\0'?"":".", extras->resname,
793                         ival );
794                     free(ival);
795                   } break;
796                   case rt_double: {
797                     char *dval = GGadgetGetTitle8( g );
798                     char *end;
799                     (void) strtod(dval,&end);
800                     if ( *end!='\0' )
801                         gwwv_post_error(_("Bad Number"), _("Bad numeric value for %s.%s"),
802                             res->resname, extras->name );
803                     fprintf( output, "%s.%s%s%s: %s\n",
804                         res->progname, res->resname, *res->resname=='\0'?"":".", extras->resname,
805                         dval );
806                     free(dval);
807                   } break;
808                   case rt_color:
809                   case rt_coloralpha:
810                     fprintf( output, "%s.%s%s%s: #%06x\n",
811                         res->progname, res->resname, *res->resname=='\0'?"":".", extras->resname,
812                         GColorButtonGetColor(g) );
813                   break;
814                   case rt_font: {
815                     char *fontdesc = GGadgetGetTitle8(g);
816                     if ( *fontdesc!='\0' )
817                         fprintf( output, "%s.%s%s%s: %s\n",
818                             res->progname, res->resname, *res->resname=='\0'?"":".", extras->resname,
819                             fontdesc );
820                     free(fontdesc);
821                   } break;
822                   case rt_image: {
823                     GResImage *ri = *((GResImage **) (extras->val));
824                     if ( ri!=NULL && ri->filename!=NULL ) {
825                         const char* const* paths = _GGadget_GetImagePath();
826                         int i;
827                         for ( i=0; paths[i]!=NULL; ++i ) {
828                             if ( strncmp(paths[i],ri->filename,strlen(paths[i]))==0 ) {
829                                 char *pt = ri->filename+strlen(paths[i]);
830                                 while ( *pt=='/' ) ++pt;
831                                 fprintf( output, "%s.%s%s%s: %s\n",
832                                     res->progname, res->resname, *res->resname=='\0'?"":".", extras->resname,
833                                     pt );
834                                 break;
835                             }
836                         }
837                         if ( paths[i]==NULL )
838                             fprintf( output, "%s.%s%s%s: %s\n",
839                                 res->progname, res->resname, *res->resname=='\0'?"":".", extras->resname,
840                                 ri->filename );
841                     }
842                   } break;
843                   case rt_string: case rt_stringlong: {
844                     char *sval = GGadgetGetTitle8( g );
845                     fprintf( output, "%s.%s%s%s: %s\n",
846                         res->progname, res->resname, *res->resname=='\0'?"":".", extras->resname,
847                         sval );
848                     free(sval);
849                   } break;
850         }
851         }
852         fprintf( output, "\n" );
853     }
854     if ( ferror(output) )
855         gwwv_post_error(_("Write failed"),_("An error occurred when writing the resource file"));
856     fclose(output);
857     if ( gre->change_res_filename != NULL && update_prefs )
858           (gre->change_res_filename)(filename);
859         free(filename);
860     }
861     return true;
862 }
863 
GRE_OK(GGadget * g,GEvent * e)864 static int GRE_OK(GGadget *g, GEvent *e) {
865     int i;
866     struct resed *extras;
867 
868     if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
869 	GRE *gre = GDrawGetUserData(GGadgetGetWindow(g));
870 	/* Handle fonts, strings and images */
871 	for ( i=0; gre->tofree[i].res!=NULL; ++i ) {
872 	    GResInfo *res = gre->tofree[i].res;
873 	    if ( res->boxdata!=NULL ) {
874 		static char *names[] = { N_("Border Width"), N_("Padding"), N_("Radius"), NULL };
875 		int j;
876 		for ( j=0; j<3; ++j ) {
877 		    char *sval = GGadgetGetTitle8(GWidgetGetControl(gre->gw,gre->tofree[i].btcid+6+3*j));
878 		    char *end;
879 		    int val = strtol(sval,&end,10);
880 		    if ( *end!='\0' || val<0 || val>255 ) {
881 			gwwv_post_error(_("Bad Number"), _("Bad numeric value for %s.%s must be between 0 and 255"),
882 				res->resname, _(names[j]) );
883 			free(sval);
884 return( true );
885 		    }
886 		    free(sval);
887 		}
888 	    }
889 	    if ( res->font!=NULL ) {
890 		/* We try to do this as we go along, but we wait for a focus */
891 		/*  out event to parse changes. Now if the last thing they were*/
892 		/*  doing was editing the font, then we might not get a focus */
893 		/*  out. So parse things here, just in case */
894 		GRE_ParseFont(GWidgetGetControl(gre->gw,gre->tofree[i].fontcid));
895 	    }
896 	    if ( res->extras!=NULL ) {
897 
898 		for ( extras = res->extras; extras->name!=NULL; extras++ ) {
899 		    switch ( extras->type ) {
900 		      case rt_int: {
901 			/* Has already been parsed and set -- unless there were */
902 			/*  an error. We need to complain about that */
903 			char *ival = GGadgetGetTitle8( GWidgetGetControl(gre->gw,extras->cid) );
904 			char *end;
905 			(void) strtol(ival,&end,10);
906 			if ( *end!='\0' ) {
907 			    gwwv_post_error(_("Bad Number"), _("Bad numeric value for %s.%s"),
908 				    res->resname, extras->name );
909 			    free(ival);
910 return( true );
911 			}
912 			free(ival);
913 		      } break;
914 		      case rt_double: {
915 			/* Has already been parsed and set -- unless there were */
916 			/*  an error. We need to complain about that */
917 			char *ival = GGadgetGetTitle8( GWidgetGetControl(gre->gw,extras->cid) );
918 			char *end;
919 			(void) strtod(ival,&end);
920 			if ( *end!='\0' ) {
921 			    gwwv_post_error(_("Bad Number"), _("Bad numeric value for %s.%s"),
922 				    res->resname, extras->name );
923 			    free(ival);
924 return( true );
925 			}
926 			free(ival);
927 		      } break;
928 		      case rt_bool:
929 		      case rt_color:
930 		      case rt_coloralpha:
931 		      case rt_image:
932 			/* These should have been set as we went along */
933 		      break;
934 		      case rt_font:
935 			GRE_ParseFont(GWidgetGetControl(gre->gw,extras->cid));
936 		      break;
937 		      case rt_string: case rt_stringlong:
938 		      {
939 			char *spec = GGadgetGetTitle8(GWidgetGetControl(gre->gw,extras->cid));
940 			/* We can't free the old value, because sometimes it is a */
941 			/*  static string, not something allocated */
942 			if ( *spec=='\0' ) { free( spec ); spec=NULL; }
943 			*(char **) (extras->val) = spec;
944 		      } break;
945 		    }
946 		}
947 	    }
948 	}
949 	gre->done = true;
950     }
951 return( true );
952 }
953 
gre_e_h(GWindow gw,GEvent * event)954 static int gre_e_h(GWindow gw, GEvent *event) {
955     if ( event->type==et_close ) {
956 	GRE *gre = GDrawGetUserData(gw);
957 	GRE_DoCancel(gre);
958     } else if ( event->type == et_char ) {
959 return( false );
960     }
961 return( true );
962 }
963 
GResEditDlg(GResInfo * all,const char * def_res_file,void (* change_res_filename)(const char *))964 static void GResEditDlg(GResInfo *all,const char *def_res_file,void (*change_res_filename)(const char *)) {
965     GResInfo *res, *parent;
966     int cnt;
967     GGadgetCreateData topgcd[4], topbox[3], *gcd, *barray[10], *tarray[3][2];
968     GTextInfo *lab, toplab[4];
969     GTabInfo *panes;
970     struct tofree *tofree;
971     struct resed *extras;
972     int i,j,k,l,cid;
973     static GBox small_blue_box;
974     extern GBox _GGadget_button_box;
975     GRE gre;
976     GRect pos;
977     GWindow gw;
978     GWindowAttrs wattrs;
979 
980     memset(&gre,0,sizeof(gre));
981     gre.def_res_file = def_res_file;
982     gre.change_res_filename = change_res_filename;
983 
984     memset(&wattrs,0,sizeof(wattrs));
985     wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_isdlg|wam_restrict;
986     wattrs.event_masks = ~(1<<et_charup);
987     wattrs.restrict_input_to_me = 1;
988     wattrs.is_dlg = true;
989     wattrs.cursor = ct_pointer;
990     wattrs.utf8_window_title = _("X Resource Editor");
991     pos.x = pos.y = 10;
992     pos.width = pos.height = 100;
993     gre.gw = gw = GDrawCreateTopWindow(NULL,&pos,gre_e_h,&gre,&wattrs);
994 
995     if ( small_blue_box.main_foreground==0 ) {
996 	extern void _GButtonInit(void);
997 	_GButtonInit();
998 	small_blue_box = _GGadget_button_box;
999 	small_blue_box.border_type = bt_box;
1000 	small_blue_box.border_shape = bs_rect;
1001 	small_blue_box.border_width = 0;
1002 	small_blue_box.flags = box_foreground_shadow_outer;
1003 	small_blue_box.padding = 0;
1004 	small_blue_box.main_foreground = 0x0000ff;
1005 	small_blue_box.border_darker = small_blue_box.main_foreground;
1006 	small_blue_box.border_darkest = small_blue_box.border_brighter =
1007 		small_blue_box.border_brightest =
1008 		small_blue_box.main_background = small_blue_box.main_background;
1009     }
1010 
1011     for ( res=all, cnt=0; res!=NULL; res=res->next, ++cnt );
1012 
1013     panes = calloc(cnt+1,sizeof(GTabInfo));
1014     gre.tofree = tofree = calloc(cnt+1,sizeof(struct tofree));
1015     cid = 0;
1016     for ( res=all, i=0; res!=NULL; res=res->next, ++i ) {
1017 	tofree[i].res = res;
1018 	tofree[i].startcid = cid+1;
1019 
1020 	cnt = 0;
1021 	if ( res->extras!=NULL )
1022 	    for ( extras=res->extras, cnt = 0; extras->name!=NULL; ++cnt, ++extras );
1023 	tofree[i].earray = calloc(cnt+1,sizeof(GGadgetCreateData*[8]));
1024 	tofree[i].extradefs = calloc(cnt+1,sizeof(char *));
1025 	cnt *= 2;
1026 	if ( res->initialcomment!=NULL )
1027 	    ++cnt;
1028 	if ( res->boxdata!=NULL )
1029 	    cnt += 3*18 + 8*2;
1030 	if ( res->font )
1031 	    cnt+=3;
1032 	if ( res->inherits_from!=NULL )
1033 	    cnt+=2;
1034 	if ( res->seealso1!=NULL ) {
1035 	    cnt+=2;
1036 	    if ( res->seealso2!=NULL )
1037 		++cnt;
1038 	}
1039 
1040 	tofree[i].gcd = gcd = calloc(cnt,sizeof(GGadgetCreateData));
1041 	tofree[i].lab = lab = calloc(cnt,sizeof(GTextInfo));
1042 
1043 	j=k=l=0;
1044 	if ( res->initialcomment!=NULL ) {
1045 	    lab[k].text = (unichar_t *) S_(res->initialcomment);
1046 	    lab[k].text_is_1byte = true;
1047 	    gcd[k].gd.label = &lab[k];
1048 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1049 	    gcd[k++].creator = GLabelCreate;
1050 	    tofree[i].marray[j++] = &gcd[k-1];
1051 	}
1052 	if ( res->examples!=NULL )
1053 	    tofree[i].marray[j++] = res->examples;
1054 	if ( res->inherits_from != NULL ) {
1055 	    lab[k].text = (unichar_t *) _("Inherits from");
1056 	    lab[k].text_is_1byte = true;
1057 	    gcd[k].gd.label = &lab[k];
1058 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1059 	    gcd[k++].creator = GLabelCreate;
1060 	    tofree[i].iarray[0] = &gcd[k-1];
1061 
1062 	    lab[k].text = (unichar_t *) S_(res->inherits_from->name);
1063 	    lab[k].text_is_1byte = true;
1064 	    gcd[k].gd.label = &lab[k];
1065 	    gcd[k].gd.flags = gg_visible|gg_enabled|gg_dontcopybox;
1066 	    gcd[k].gd.box = &small_blue_box;
1067 	    gcd[k].data = res->inherits_from;
1068 	    gcd[k].gd.handle_controlevent = GRE_ChangePane;
1069 	    gcd[k++].creator = GButtonCreate;
1070 	    tofree[i].iarray[1] = &gcd[k-1];
1071 
1072 	    tofree[i].iarray[2] = GCD_Glue; tofree[i].iarray[3] = NULL;
1073 	    tofree[i].ibox.gd.flags = gg_visible|gg_enabled;
1074 	    tofree[i].ibox.gd.u.boxelements = tofree[i].iarray;
1075 	    tofree[i].ibox.creator = GHBoxCreate;
1076 	    tofree[i].marray[j++] = &tofree[i].ibox;
1077 	} else if ( res->boxdata!=NULL ) {
1078 	    lab[k].text = (unichar_t *) _("Does not inherit from anything");
1079 	    lab[k].text_is_1byte = true;
1080 	    gcd[k].gd.label = &lab[k];
1081 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1082 	    gcd[k++].creator = GLabelCreate;
1083 	    tofree[i].marray[j++] = &gcd[k-1];
1084 	}
1085 
1086 	if ( res->boxdata!=NULL ) {
1087 	    res->orig_state = *res->boxdata;
1088 
1089 	    lab[k].text = (unichar_t *) _("Inherit");
1090 	    lab[k].text_is_1byte = true;
1091 	    gcd[k].gd.label = &lab[k];
1092 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1093 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1094 	    gcd[k].gd.cid = ++cid;
1095 	    gcd[k].gd.handle_controlevent = GRE_InheritFlagChange;
1096 	    gcd[k++].creator = GCheckBoxCreate;
1097 	    tofree[i].farray[l][0] = &gcd[k-1];
1098 
1099 	    lab[k].text = (unichar_t *) _("Outline Inner Border");
1100 	    lab[k].text_is_1byte = true;
1101 	    gcd[k].gd.label = &lab[k];
1102 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1103 	    gcd[k].gd.cid = ++cid;
1104 	    if ( res->boxdata->flags & box_foreground_border_inner )
1105 		gcd[k].gd.flags |= gg_cb_on;
1106 	    gcd[k].gd.handle_controlevent = GRE_FlagChanged;
1107 	    gcd[k].data = (void *) (intpt) box_foreground_border_inner;
1108 	    gcd[k++].creator = GCheckBoxCreate;
1109 	    tofree[i].farray[l][1] = &gcd[k-1];
1110 	    if ( res->inherits_from==NULL )
1111 		gcd[k-2].gd.flags &= ~gg_enabled;
1112 	    else if ( (res->inherits_from->boxdata->flags&box_foreground_border_inner) == (res->boxdata->flags&box_foreground_border_inner) ) {
1113 		gcd[k-2].gd.flags |= gg_cb_on;
1114 		gcd[k-1].gd.flags &= ~gg_enabled;
1115 	    }
1116 
1117 	    lab[k].text = (unichar_t *) _("Inherit");
1118 	    lab[k].text_is_1byte = true;
1119 	    gcd[k].gd.label = &lab[k];
1120 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1121 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1122 	    gcd[k].gd.cid = ++cid;
1123 	    gcd[k].gd.handle_controlevent = GRE_InheritFlagChange;
1124 	    gcd[k++].creator = GCheckBoxCreate;
1125 	    tofree[i].farray[l][2] = &gcd[k-1];
1126 
1127 	    lab[k].text = (unichar_t *) _("Outline Outer Border");
1128 	    lab[k].text_is_1byte = true;
1129 	    gcd[k].gd.label = &lab[k];
1130 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1131 	    gcd[k].gd.cid = ++cid;
1132 	    if ( res->boxdata->flags & box_foreground_border_outer )
1133 		gcd[k].gd.flags |= gg_cb_on;
1134 	    gcd[k].gd.handle_controlevent = GRE_FlagChanged;
1135 	    gcd[k].data = (void *) (intpt) box_foreground_border_outer;
1136 	    gcd[k++].creator = GCheckBoxCreate;
1137 	    tofree[i].farray[l][3] = &gcd[k-1];
1138 	    if ( res->inherits_from==NULL )
1139 		gcd[k-2].gd.flags &= ~gg_enabled;
1140 	    else if ( (res->inherits_from->boxdata->flags&box_foreground_border_outer) == (res->boxdata->flags&box_foreground_border_outer) ) {
1141 		gcd[k-2].gd.flags |= gg_cb_on;
1142 		gcd[k-1].gd.flags &= ~gg_enabled;
1143 	    }
1144 	    tofree[i].farray[l][4] = GCD_Glue;
1145 	    tofree[i].farray[l++][5] = NULL;
1146 
1147 
1148 	    lab[k].text = (unichar_t *) _("Inherit");
1149 	    lab[k].text_is_1byte = true;
1150 	    gcd[k].gd.label = &lab[k];
1151 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1152 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1153 	    gcd[k].gd.cid = ++cid;
1154 	    gcd[k].gd.handle_controlevent = GRE_InheritFlagChange;
1155 	    gcd[k++].creator = GCheckBoxCreate;
1156 	    tofree[i].farray[l][0] = &gcd[k-1];
1157 
1158 	    lab[k].text = (unichar_t *) _("Show Active Border");
1159 	    lab[k].text_is_1byte = true;
1160 	    gcd[k].gd.label = &lab[k];
1161 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1162 	    gcd[k].gd.cid = ++cid;
1163 	    if ( res->boxdata->flags & box_active_border_inner )
1164 		gcd[k].gd.flags |= gg_cb_on;
1165 	    gcd[k].gd.handle_controlevent = GRE_FlagChanged;
1166 	    gcd[k].data = (void *) (intpt) box_active_border_inner;
1167 	    gcd[k++].creator = GCheckBoxCreate;
1168 	    tofree[i].farray[l][1] = &gcd[k-1];
1169 	    if ( res->inherits_from==NULL )
1170 		gcd[k-2].gd.flags &= ~gg_enabled;
1171 	    else if ( (res->inherits_from->boxdata->flags&box_active_border_inner) == (res->boxdata->flags&box_active_border_inner) ) {
1172 		gcd[k-2].gd.flags |= gg_cb_on;
1173 		gcd[k-1].gd.flags &= ~gg_enabled;
1174 	    }
1175 
1176 	    lab[k].text = (unichar_t *) _("Inherit");
1177 	    lab[k].text_is_1byte = true;
1178 	    gcd[k].gd.label = &lab[k];
1179 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1180 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1181 	    gcd[k].gd.cid = ++cid;
1182 	    gcd[k].gd.handle_controlevent = GRE_InheritFlagChange;
1183 	    gcd[k++].creator = GCheckBoxCreate;
1184 	    tofree[i].farray[l][2] = &gcd[k-1];
1185 
1186 	    lab[k].text = (unichar_t *) _("Outer Shadow");
1187 	    lab[k].text_is_1byte = true;
1188 	    gcd[k].gd.label = &lab[k];
1189 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1190 	    gcd[k].gd.cid = ++cid;
1191 	    if ( res->boxdata->flags & box_foreground_shadow_outer )
1192 		gcd[k].gd.flags |= gg_cb_on;
1193 	    gcd[k].gd.handle_controlevent = GRE_FlagChanged;
1194 	    gcd[k].data = (void *) (intpt) box_foreground_shadow_outer;
1195 	    gcd[k++].creator = GCheckBoxCreate;
1196 	    tofree[i].farray[l][3] = &gcd[k-1];
1197 	    if ( res->inherits_from==NULL )
1198 		gcd[k-2].gd.flags &= ~gg_enabled;
1199 	    else if ( (res->inherits_from->boxdata->flags&box_foreground_shadow_outer) == (res->boxdata->flags&box_foreground_shadow_outer) ) {
1200 		gcd[k-2].gd.flags |= gg_cb_on;
1201 		gcd[k-1].gd.flags &= ~gg_enabled;
1202 	    }
1203 	    tofree[i].farray[l][4] = GCD_Glue;
1204 	    tofree[i].farray[l++][5] = NULL;
1205 
1206 
1207 	    lab[k].text = (unichar_t *) _("Inherit");
1208 	    lab[k].text_is_1byte = true;
1209 	    gcd[k].gd.label = &lab[k];
1210 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1211 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1212 	    gcd[k].gd.cid = ++cid;
1213 	    gcd[k].gd.handle_controlevent = GRE_InheritFlagChange;
1214 	    gcd[k++].creator = GCheckBoxCreate;
1215 	    tofree[i].farray[l][0] = &gcd[k-1];
1216 
1217 	    lab[k].text = (unichar_t *) _("Depressed Background");
1218 	    lab[k].text_is_1byte = true;
1219 	    gcd[k].gd.label = &lab[k];
1220 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1221 	    gcd[k].gd.cid = ++cid;
1222 	    if ( res->boxdata->flags & box_do_depressed_background )
1223 		gcd[k].gd.flags |= gg_cb_on;
1224 	    gcd[k].gd.handle_controlevent = GRE_FlagChanged;
1225 	    gcd[k].data = (void *) (intpt) box_do_depressed_background;
1226 	    gcd[k++].creator = GCheckBoxCreate;
1227 	    tofree[i].farray[l][1] = &gcd[k-1];
1228 	    if ( res->inherits_from==NULL )
1229 		gcd[k-2].gd.flags &= ~gg_enabled;
1230 	    else if ( (res->inherits_from->boxdata->flags&box_do_depressed_background) == (res->boxdata->flags&box_do_depressed_background) ) {
1231 		gcd[k-2].gd.flags |= gg_cb_on;
1232 		gcd[k-1].gd.flags &= ~gg_enabled;
1233 	    }
1234 
1235 	    lab[k].text = (unichar_t *) _("Inherit");
1236 	    lab[k].text_is_1byte = true;
1237 	    gcd[k].gd.label = &lab[k];
1238 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1239 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1240 	    gcd[k].gd.cid = ++cid;
1241 	    gcd[k].gd.handle_controlevent = GRE_InheritFlagChange;
1242 	    gcd[k++].creator = GCheckBoxCreate;
1243 	    tofree[i].farray[l][2] = &gcd[k-1];
1244 
1245 	    lab[k].text = (unichar_t *) _("Outline Default Button");
1246 	    lab[k].text_is_1byte = true;
1247 	    gcd[k].gd.label = &lab[k];
1248 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1249 	    gcd[k].gd.cid = ++cid;
1250 	    if ( res->boxdata->flags & box_draw_default )
1251 		gcd[k].gd.flags |= gg_cb_on;
1252 	    gcd[k].gd.handle_controlevent = GRE_FlagChanged;
1253 	    gcd[k].data = (void *) (intpt) box_draw_default;
1254 	    gcd[k++].creator = GCheckBoxCreate;
1255 	    tofree[i].farray[l][3] = &gcd[k-1];
1256 	    if ( res->inherits_from==NULL )
1257 		gcd[k-2].gd.flags &= ~gg_enabled;
1258 	    else if ( (res->inherits_from->boxdata->flags&box_draw_default) == (res->boxdata->flags&box_draw_default) ) {
1259 		gcd[k-2].gd.flags |= gg_cb_on;
1260 		gcd[k-1].gd.flags &= ~gg_enabled;
1261 	    }
1262 	    tofree[i].farray[l][4] = GCD_Glue;
1263 	    tofree[i].farray[l++][5] = NULL;
1264 
1265 
1266 	    lab[k].text = (unichar_t *) _("Inherit");
1267 	    lab[k].text_is_1byte = true;
1268 	    gcd[k].gd.label = &lab[k];
1269 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1270 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1271 	    gcd[k].gd.cid = ++cid;
1272 	    gcd[k].gd.handle_controlevent = GRE_InheritFlagChange;
1273 	    gcd[k++].creator = GCheckBoxCreate;
1274 	    tofree[i].farray[l][0] = &gcd[k-1];
1275 
1276 	    lab[k].text = (unichar_t *) _("Background Gradient");
1277 	    lab[k].text_is_1byte = true;
1278 	    gcd[k].gd.label = &lab[k];
1279 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1280 	    gcd[k].gd.cid = ++cid;
1281 	    if ( res->boxdata->flags & box_gradient_bg )
1282 		gcd[k].gd.flags |= gg_cb_on;
1283 	    gcd[k].gd.handle_controlevent = GRE_FlagChanged;
1284 	    gcd[k].data = (void *) (intpt) box_gradient_bg;
1285 	    gcd[k++].creator = GCheckBoxCreate;
1286 	    tofree[i].farray[l][1] = &gcd[k-1];
1287 	    if ( res->inherits_from==NULL )
1288 		gcd[k-2].gd.flags &= ~gg_enabled;
1289 	    else if ( (res->inherits_from->boxdata->flags&box_gradient_bg) == (res->boxdata->flags&box_gradient_bg) ) {
1290 		gcd[k-2].gd.flags |= gg_cb_on;
1291 		gcd[k-1].gd.flags &= ~gg_enabled;
1292 	    }
1293 	    tofree[i].farray[l][2] = GCD_Glue;
1294 	    tofree[i].farray[l][3] = GCD_Glue;
1295 	    tofree[i].farray[l][4] = GCD_Glue;
1296 	    tofree[i].farray[l++][5] = NULL;
1297 	    tofree[i].farray[l][0] = NULL;
1298 
1299 	    tofree[i].flagsbox.gd.flags = gg_enabled | gg_visible;
1300 	    tofree[i].flagsbox.gd.u.boxelements = tofree[i].farray[0];
1301 	    tofree[i].flagsbox.creator = GHVBoxCreate;
1302 	    tofree[i].marray[j++] = &tofree[i].flagsbox;
1303 
1304 	    l = 0;
1305 
1306 /* GT: "I." is an abreviation for "Inherits" */
1307 	    lab[k].text = (unichar_t *) _("I.");
1308 	    lab[k].text_is_1byte = true;
1309 	    gcd[k].gd.label = &lab[k];
1310 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1311 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1312 	    gcd[k].gd.cid = ++cid;
1313 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1314 	    gcd[k++].creator = GCheckBoxCreate;
1315 	    tofree[i].carray[l][0] = &gcd[k-1];
1316 
1317 	    lab[k].text = (unichar_t *) _("Normal Text Color:");
1318 	    lab[k].text_is_1byte = true;
1319 	    gcd[k].gd.label = &lab[k];
1320 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1321 	    gcd[k].gd.cid = ++cid;
1322 	    gcd[k++].creator = GLabelCreate;
1323 	    tofree[i].carray[l][1] = &gcd[k-1];
1324 
1325 	    gcd[k].gd.u.col = res->boxdata->main_foreground;
1326 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1327 	    gcd[k].gd.cid = ++cid;
1328 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1329 	    gcd[k].data = &res->boxdata->main_foreground;
1330 	    gcd[k++].creator = GColorButtonCreate;
1331 	    tofree[i].carray[l][2] = &gcd[k-1];
1332 	    tofree[i].carray[l][3] = GCD_Glue;
1333 	    if ( res->inherits_from==NULL )
1334 		gcd[k-3].gd.flags &= ~gg_enabled;
1335 	    else if ( res->inherits_from->boxdata->main_foreground == res->boxdata->main_foreground ) {
1336 		gcd[k-3].gd.flags |= gg_cb_on;
1337 		gcd[k-2].gd.flags &= ~gg_enabled;
1338 		gcd[k-1].gd.flags &= ~gg_enabled;
1339 	    }
1340 
1341 /* GT: "I." is an abreviation for "Inherits" */
1342 	    lab[k].text = (unichar_t *) _("I.");
1343 	    lab[k].text_is_1byte = true;
1344 	    gcd[k].gd.label = &lab[k];
1345 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1346 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1347 	    gcd[k].gd.cid = ++cid;
1348 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1349 	    gcd[k++].creator = GCheckBoxCreate;
1350 	    tofree[i].carray[l][4] = &gcd[k-1];
1351 
1352 	    lab[k].text = (unichar_t *) _("Disabled Text Color:");
1353 	    lab[k].text_is_1byte = true;
1354 	    gcd[k].gd.label = &lab[k];
1355 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1356 	    gcd[k].gd.cid = ++cid;
1357 	    gcd[k++].creator = GLabelCreate;
1358 	    tofree[i].carray[l][5] = &gcd[k-1];
1359 
1360 	    gcd[k].gd.u.col = res->boxdata->disabled_foreground;
1361 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1362 	    gcd[k].gd.cid = ++cid;
1363 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1364 	    gcd[k].data = &res->boxdata->disabled_foreground;
1365 	    gcd[k++].creator = GColorButtonCreate;
1366 	    tofree[i].carray[l][6] = &gcd[k-1];
1367 	    if ( res->inherits_from==NULL )
1368 		gcd[k-3].gd.flags &= ~gg_enabled;
1369 	    else if ( res->inherits_from->boxdata->disabled_foreground == res->boxdata->disabled_foreground ) {
1370 		gcd[k-3].gd.flags |= gg_cb_on;
1371 		gcd[k-2].gd.flags &= ~gg_enabled;
1372 		gcd[k-1].gd.flags &= ~gg_enabled;
1373 	    }
1374 
1375 	    tofree[i].carray[l][7] = GCD_Glue;
1376 	    tofree[i].carray[l++][8] = NULL;
1377 
1378 /* GT: "I." is an abreviation for "Inherits" */
1379 	    lab[k].text = (unichar_t *) _("I.");
1380 	    lab[k].text_is_1byte = true;
1381 	    gcd[k].gd.label = &lab[k];
1382 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1383 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1384 	    gcd[k].gd.cid = ++cid;
1385 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1386 	    gcd[k++].creator = GCheckBoxCreate;
1387 	    tofree[i].carray[l][0] = &gcd[k-1];
1388 
1389 	    lab[k].text = (unichar_t *) _("Normal Background:");
1390 	    lab[k].text_is_1byte = true;
1391 	    gcd[k].gd.label = &lab[k];
1392 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1393 	    gcd[k].gd.cid = ++cid;
1394 	    gcd[k++].creator = GLabelCreate;
1395 	    tofree[i].carray[l][1] = &gcd[k-1];
1396 
1397 	    gcd[k].gd.u.col = res->boxdata->main_background;
1398 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1399 	    gcd[k].gd.cid = ++cid;
1400 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1401 	    gcd[k].data = &res->boxdata->main_background;
1402 	    gcd[k++].creator = GColorButtonCreate;
1403 	    tofree[i].carray[l][2] = &gcd[k-1];
1404 	    tofree[i].carray[l][3] = GCD_Glue;
1405 	    if ( res->inherits_from==NULL )
1406 		gcd[k-3].gd.flags &= ~gg_enabled;
1407 	    else if ( res->inherits_from->boxdata->main_background == res->boxdata->main_background ) {
1408 		gcd[k-3].gd.flags |= gg_cb_on;
1409 		gcd[k-2].gd.flags &= ~gg_enabled;
1410 		gcd[k-1].gd.flags &= ~gg_enabled;
1411 	    }
1412 
1413 /* GT: "I." is an abreviation for "Inherits" */
1414 	    lab[k].text = (unichar_t *) _("I.");
1415 	    lab[k].text_is_1byte = true;
1416 	    gcd[k].gd.label = &lab[k];
1417 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1418 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1419 	    gcd[k].gd.cid = ++cid;
1420 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1421 	    gcd[k++].creator = GCheckBoxCreate;
1422 	    tofree[i].carray[l][4] = &gcd[k-1];
1423 
1424 	    lab[k].text = (unichar_t *) _("Disabled Background:");
1425 	    lab[k].text_is_1byte = true;
1426 	    gcd[k].gd.label = &lab[k];
1427 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1428 	    gcd[k].gd.cid = ++cid;
1429 	    gcd[k++].creator = GLabelCreate;
1430 	    tofree[i].carray[l][5] = &gcd[k-1];
1431 
1432 	    gcd[k].gd.u.col = res->boxdata->disabled_background;
1433 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1434 	    gcd[k].gd.cid = ++cid;
1435 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1436 	    gcd[k].data = &res->boxdata->disabled_background;
1437 	    gcd[k++].creator = GColorButtonCreate;
1438 	    tofree[i].carray[l][6] = &gcd[k-1];
1439 	    if ( res->inherits_from==NULL )
1440 		gcd[k-3].gd.flags &= ~gg_enabled;
1441 	    else if ( res->inherits_from->boxdata->disabled_background == res->boxdata->disabled_background ) {
1442 		gcd[k-3].gd.flags |= gg_cb_on;
1443 		gcd[k-2].gd.flags &= ~gg_enabled;
1444 		gcd[k-1].gd.flags &= ~gg_enabled;
1445 	    }
1446 
1447 	    tofree[i].carray[l][7] = GCD_Glue;
1448 	    tofree[i].carray[l++][8] = NULL;
1449 
1450 /* GT: "I." is an abreviation for "Inherits" */
1451 	    lab[k].text = (unichar_t *) _("I.");
1452 	    lab[k].text_is_1byte = true;
1453 	    gcd[k].gd.label = &lab[k];
1454 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1455 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1456 	    gcd[k].gd.cid = ++cid;
1457 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1458 	    gcd[k++].creator = GCheckBoxCreate;
1459 	    tofree[i].carray[l][0] = &gcd[k-1];
1460 
1461 	    lab[k].text = (unichar_t *) _("Depressed Background:");
1462 	    lab[k].text_is_1byte = true;
1463 	    gcd[k].gd.label = &lab[k];
1464 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1465 	    gcd[k].gd.cid = ++cid;
1466 	    gcd[k++].creator = GLabelCreate;
1467 	    tofree[i].carray[l][1] = &gcd[k-1];
1468 
1469 	    gcd[k].gd.u.col = res->boxdata->depressed_background;
1470 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1471 	    gcd[k].gd.cid = ++cid;
1472 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1473 	    gcd[k].data = &res->boxdata->depressed_background;
1474 	    gcd[k++].creator = GColorButtonCreate;
1475 	    tofree[i].carray[l][2] = &gcd[k-1];
1476 	    tofree[i].carray[l][3] = GCD_Glue;
1477 	    if ( res->inherits_from==NULL )
1478 		gcd[k-3].gd.flags &= ~gg_enabled;
1479 	    else if ( res->inherits_from->boxdata->depressed_background == res->boxdata->depressed_background ) {
1480 		gcd[k-3].gd.flags |= gg_cb_on;
1481 		gcd[k-2].gd.flags &= ~gg_enabled;
1482 		gcd[k-1].gd.flags &= ~gg_enabled;
1483 	    }
1484 
1485 /* GT: "I." is an abreviation for "Inherits" */
1486 	    lab[k].text = (unichar_t *) _("I.");
1487 	    lab[k].text_is_1byte = true;
1488 	    gcd[k].gd.label = &lab[k];
1489 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1490 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1491 	    gcd[k].gd.cid = ++cid;
1492 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1493 	    gcd[k++].creator = GCheckBoxCreate;
1494 	    tofree[i].carray[l][4] = &gcd[k-1];
1495 
1496 	    lab[k].text = (unichar_t *) _("Background Gradient:");
1497 	    lab[k].text_is_1byte = true;
1498 	    gcd[k].gd.label = &lab[k];
1499 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1500 	    gcd[k].gd.cid = ++cid;
1501 	    gcd[k++].creator = GLabelCreate;
1502 	    tofree[i].carray[l][5] = &gcd[k-1];
1503 
1504 	    gcd[k].gd.u.col = res->boxdata->gradient_bg_end;
1505 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1506 	    gcd[k].gd.cid = ++cid;
1507 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1508 	    gcd[k].data = &res->boxdata->gradient_bg_end;
1509 	    gcd[k++].creator = GColorButtonCreate;
1510 	    tofree[i].carray[l][6] = &gcd[k-1];
1511 	    if ( res->inherits_from==NULL )
1512 		gcd[k-3].gd.flags &= ~gg_enabled;
1513 	    else if ( res->inherits_from->boxdata->gradient_bg_end == res->boxdata->gradient_bg_end ) {
1514 		gcd[k-3].gd.flags |= gg_cb_on;
1515 		gcd[k-2].gd.flags &= ~gg_enabled;
1516 		gcd[k-1].gd.flags &= ~gg_enabled;
1517 	    }
1518 
1519 	    tofree[i].carray[l][7] = GCD_Glue;
1520 	    tofree[i].carray[l++][8] = NULL;
1521 
1522 /* GT: "I." is an abreviation for "Inherits" */
1523 	    lab[k].text = (unichar_t *) _("I.");
1524 	    lab[k].text_is_1byte = true;
1525 	    gcd[k].gd.label = &lab[k];
1526 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1527 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1528 	    gcd[k].gd.cid = ++cid;
1529 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1530 	    gcd[k++].creator = GCheckBoxCreate;
1531 	    tofree[i].carray[l][0] = &gcd[k-1];
1532 
1533 	    lab[k].text = (unichar_t *) _("Brightest Border:");
1534 	    lab[k].text_is_1byte = true;
1535 	    gcd[k].gd.label = &lab[k];
1536 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1537 	    gcd[k].gd.cid = ++cid;
1538 	    gcd[k++].creator = GLabelCreate;
1539 	    tofree[i].carray[l][1] = &gcd[k-1];
1540 
1541 	    gcd[k].gd.u.col = res->boxdata->border_brightest;
1542 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1543 	    gcd[k].gd.cid = ++cid;
1544 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1545 	    gcd[k].data = &res->boxdata->border_brightest;
1546 	    gcd[k++].creator = GColorButtonCreate;
1547 	    tofree[i].carray[l][2] = &gcd[k-1];
1548 	    tofree[i].carray[l][3] = GCD_Glue;
1549 	    if ( res->inherits_from==NULL )
1550 		gcd[k-3].gd.flags &= ~gg_enabled;
1551 	    else if ( res->inherits_from->boxdata->border_brightest == res->boxdata->border_brightest ) {
1552 		gcd[k-3].gd.flags |= gg_cb_on;
1553 		gcd[k-2].gd.flags &= ~gg_enabled;
1554 		gcd[k-1].gd.flags &= ~gg_enabled;
1555 	    }
1556 
1557 /* GT: "I." is an abreviation for "Inherits" */
1558 	    lab[k].text = (unichar_t *) _("I.");
1559 	    lab[k].text_is_1byte = true;
1560 	    gcd[k].gd.label = &lab[k];
1561 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1562 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1563 	    gcd[k].gd.cid = ++cid;
1564 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1565 	    gcd[k++].creator = GCheckBoxCreate;
1566 	    tofree[i].carray[l][4] = &gcd[k-1];
1567 
1568 	    lab[k].text = (unichar_t *) _("Brighter Border:");
1569 	    lab[k].text_is_1byte = true;
1570 	    gcd[k].gd.label = &lab[k];
1571 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1572 	    gcd[k].gd.cid = ++cid;
1573 	    gcd[k++].creator = GLabelCreate;
1574 	    tofree[i].carray[l][5] = &gcd[k-1];
1575 
1576 	    gcd[k].gd.u.col = res->boxdata->border_brighter;
1577 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1578 	    gcd[k].gd.cid = ++cid;
1579 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1580 	    gcd[k].data = &res->boxdata->border_brighter;
1581 	    gcd[k++].creator = GColorButtonCreate;
1582 	    tofree[i].carray[l][6] = &gcd[k-1];
1583 	    if ( res->inherits_from==NULL )
1584 		gcd[k-3].gd.flags &= ~gg_enabled;
1585 	    else if ( res->inherits_from->boxdata->border_brighter == res->boxdata->border_brighter ) {
1586 		gcd[k-3].gd.flags |= gg_cb_on;
1587 		gcd[k-2].gd.flags &= ~gg_enabled;
1588 		gcd[k-1].gd.flags &= ~gg_enabled;
1589 	    }
1590 
1591 	    tofree[i].carray[l][7] = GCD_Glue;
1592 	    tofree[i].carray[l++][8] = NULL;
1593 
1594 
1595 /* GT: "I." is an abreviation for "Inherits" */
1596 	    lab[k].text = (unichar_t *) _("I.");
1597 	    lab[k].text_is_1byte = true;
1598 	    gcd[k].gd.label = &lab[k];
1599 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1600 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1601 	    gcd[k].gd.cid = ++cid;
1602 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1603 	    gcd[k++].creator = GCheckBoxCreate;
1604 	    tofree[i].carray[l][0] = &gcd[k-1];
1605 
1606 	    lab[k].text = (unichar_t *) _("Darker Border:");
1607 	    lab[k].text_is_1byte = true;
1608 	    gcd[k].gd.label = &lab[k];
1609 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1610 	    gcd[k].gd.cid = ++cid;
1611 	    gcd[k++].creator = GLabelCreate;
1612 	    tofree[i].carray[l][1] = &gcd[k-1];
1613 
1614 	    gcd[k].gd.u.col = res->boxdata->border_darker;
1615 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1616 	    gcd[k].gd.cid = ++cid;
1617 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1618 	    gcd[k].data = &res->boxdata->border_darker;
1619 	    gcd[k++].creator = GColorButtonCreate;
1620 	    tofree[i].carray[l][2] = &gcd[k-1];
1621 	    tofree[i].carray[l][3] = GCD_Glue;
1622 	    if ( res->inherits_from==NULL )
1623 		gcd[k-3].gd.flags &= ~gg_enabled;
1624 	    else if ( res->inherits_from->boxdata->border_darker == res->boxdata->border_darker ) {
1625 		gcd[k-3].gd.flags |= gg_cb_on;
1626 		gcd[k-2].gd.flags &= ~gg_enabled;
1627 		gcd[k-1].gd.flags &= ~gg_enabled;
1628 	    }
1629 
1630 /* GT: "I." is an abreviation for "Inherits" */
1631 	    lab[k].text = (unichar_t *) _("I.");
1632 	    lab[k].text_is_1byte = true;
1633 	    gcd[k].gd.label = &lab[k];
1634 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1635 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1636 	    gcd[k].gd.cid = ++cid;
1637 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1638 	    gcd[k++].creator = GCheckBoxCreate;
1639 	    tofree[i].carray[l][4] = &gcd[k-1];
1640 
1641 	    lab[k].text = (unichar_t *) _("Darkest Border:");
1642 	    lab[k].text_is_1byte = true;
1643 	    gcd[k].gd.label = &lab[k];
1644 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1645 	    gcd[k].gd.cid = ++cid;
1646 	    gcd[k++].creator = GLabelCreate;
1647 	    tofree[i].carray[l][5] = &gcd[k-1];
1648 
1649 	    gcd[k].gd.u.col = res->boxdata->border_darkest;
1650 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1651 	    gcd[k].gd.cid = ++cid;
1652 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1653 	    gcd[k].data = &res->boxdata->border_darkest;
1654 	    gcd[k++].creator = GColorButtonCreate;
1655 	    tofree[i].carray[l][6] = &gcd[k-1];
1656 	    if ( res->inherits_from==NULL )
1657 		gcd[k-3].gd.flags &= ~gg_enabled;
1658 	    else if ( res->inherits_from->boxdata->border_darkest == res->boxdata->border_darkest ) {
1659 		gcd[k-3].gd.flags |= gg_cb_on;
1660 		gcd[k-2].gd.flags &= ~gg_enabled;
1661 		gcd[k-1].gd.flags &= ~gg_enabled;
1662 	    }
1663 
1664 	    tofree[i].carray[l][7] = GCD_Glue;
1665 	    tofree[i].carray[l++][8] = NULL;
1666 
1667 
1668 /* GT: "I." is an abreviation for "Inherits" */
1669 	    lab[k].text = (unichar_t *) _("I.");
1670 	    lab[k].text_is_1byte = true;
1671 	    gcd[k].gd.label = &lab[k];
1672 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1673 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1674 	    gcd[k].gd.cid = ++cid;
1675 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1676 	    gcd[k++].creator = GCheckBoxCreate;
1677 	    tofree[i].carray[l][0] = &gcd[k-1];
1678 
1679 	    lab[k].text = (unichar_t *) _("Inner Border:");
1680 	    lab[k].text_is_1byte = true;
1681 	    gcd[k].gd.label = &lab[k];
1682 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1683 	    gcd[k].gd.cid = ++cid;
1684 	    gcd[k++].creator = GLabelCreate;
1685 	    tofree[i].carray[l][1] = &gcd[k-1];
1686 
1687 	    gcd[k].gd.u.col = res->boxdata->border_inner;
1688 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1689 	    gcd[k].gd.cid = ++cid;
1690 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1691 	    gcd[k].data = &res->boxdata->border_inner;
1692 	    gcd[k++].creator = GColorButtonCreate;
1693 	    tofree[i].carray[l][2] = &gcd[k-1];
1694 	    tofree[i].carray[l][3] = GCD_Glue;
1695 	    if ( res->inherits_from==NULL )
1696 		gcd[k-3].gd.flags &= ~gg_enabled;
1697 	    else if ( res->inherits_from->boxdata->border_inner == res->boxdata->border_inner ) {
1698 		gcd[k-3].gd.flags |= gg_cb_on;
1699 		gcd[k-2].gd.flags &= ~gg_enabled;
1700 		gcd[k-1].gd.flags &= ~gg_enabled;
1701 	    }
1702 
1703 /* GT: "I." is an abreviation for "Inherits" */
1704 	    lab[k].text = (unichar_t *) _("I.");
1705 	    lab[k].text_is_1byte = true;
1706 	    gcd[k].gd.label = &lab[k];
1707 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1708 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1709 	    gcd[k].gd.cid = ++cid;
1710 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1711 	    gcd[k++].creator = GCheckBoxCreate;
1712 	    tofree[i].carray[l][4] = &gcd[k-1];
1713 
1714 	    lab[k].text = (unichar_t *) _("Outer Border:");
1715 	    lab[k].text_is_1byte = true;
1716 	    gcd[k].gd.label = &lab[k];
1717 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1718 	    gcd[k].gd.cid = ++cid;
1719 	    gcd[k++].creator = GLabelCreate;
1720 	    tofree[i].carray[l][5] = &gcd[k-1];
1721 
1722 	    gcd[k].gd.u.col = res->boxdata->border_outer;
1723 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1724 	    gcd[k].gd.cid = ++cid;
1725 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1726 	    gcd[k].data = &res->boxdata->border_outer;
1727 	    gcd[k++].creator = GColorButtonCreate;
1728 	    tofree[i].carray[l][6] = &gcd[k-1];
1729 	    if ( res->inherits_from==NULL )
1730 		gcd[k-3].gd.flags &= ~gg_enabled;
1731 	    else if ( res->inherits_from->boxdata->border_outer == res->boxdata->border_outer ) {
1732 		gcd[k-3].gd.flags |= gg_cb_on;
1733 		gcd[k-2].gd.flags &= ~gg_enabled;
1734 		gcd[k-1].gd.flags &= ~gg_enabled;
1735 	    }
1736 
1737 	    tofree[i].carray[l][7] = GCD_Glue;
1738 	    tofree[i].carray[l++][8] = NULL;
1739 
1740 
1741 /* GT: "I." is an abreviation for "Inherits" */
1742 	    lab[k].text = (unichar_t *) _("I.");
1743 	    lab[k].text_is_1byte = true;
1744 	    gcd[k].gd.label = &lab[k];
1745 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1746 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1747 	    gcd[k].gd.cid = ++cid;
1748 	    gcd[k].gd.handle_controlevent = GRE_InheritColChange;
1749 	    gcd[k++].creator = GCheckBoxCreate;
1750 	    tofree[i].carray[l][0] = &gcd[k-1];
1751 
1752 	    lab[k].text = (unichar_t *) _("Active Border:");
1753 	    lab[k].text_is_1byte = true;
1754 	    gcd[k].gd.label = &lab[k];
1755 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1756 	    gcd[k].gd.cid = ++cid;
1757 	    gcd[k++].creator = GLabelCreate;
1758 	    tofree[i].carray[l][1] = &gcd[k-1];
1759 
1760 	    gcd[k].gd.u.col = res->boxdata->active_border;
1761 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1762 	    gcd[k].gd.cid = ++cid;
1763 	    gcd[k].gd.handle_controlevent = GRE_ColorChanged;
1764 	    gcd[k].data = &res->boxdata->active_border;
1765 	    gcd[k++].creator = GColorButtonCreate;
1766 	    tofree[i].carray[l][2] = &gcd[k-1];
1767 	    tofree[i].carray[l][3] = GCD_Glue;
1768 	    if ( res->inherits_from==NULL )
1769 		gcd[k-3].gd.flags &= ~gg_enabled;
1770 	    else if ( res->inherits_from->boxdata->active_border == res->boxdata->active_border ) {
1771 		gcd[k-3].gd.flags |= gg_cb_on;
1772 		gcd[k-2].gd.flags &= ~gg_enabled;
1773 		gcd[k-1].gd.flags &= ~gg_enabled;
1774 	    }
1775 
1776 	    tofree[i].carray[l][4] = GCD_Glue;
1777 	    tofree[i].carray[l][5] = GCD_Glue;
1778 	    tofree[i].carray[l][6] = GCD_Glue;
1779 	    tofree[i].carray[l][7] = GCD_Glue;
1780 	    tofree[i].carray[l++][8] = NULL;
1781 
1782 /* GT: "I." is an abreviation for "Inherits" */
1783 	    lab[k].text = (unichar_t *) _("I.");
1784 	    lab[k].text_is_1byte = true;
1785 	    gcd[k].gd.label = &lab[k];
1786 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1787 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1788 	    gcd[k].gd.cid = ++cid;
1789 	    gcd[k].gd.handle_controlevent = GRE_InheritListChange;
1790 	    gcd[k++].creator = GCheckBoxCreate;
1791 	    tofree[i].carray[l][0] = &gcd[k-1];
1792 
1793 	    lab[k].text = (unichar_t *) _("Border Type:");
1794 	    lab[k].text_is_1byte = true;
1795 	    gcd[k].gd.label = &lab[k];
1796 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1797 	    gcd[k].gd.cid = ++cid;
1798 	    gcd[k++].creator = GLabelCreate;
1799 	    tofree[i].carray[l][1] = &gcd[k-1];
1800 
1801 	    gcd[k].gd.u.list = bordertype;
1802 	    gcd[k].gd.label = &bordertype[res->boxdata->border_type];
1803 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1804 	    gcd[k].gd.cid = tofree[i].btcid = ++cid;
1805 	    gcd[k].gd.handle_controlevent = GRE_ListChanged;
1806 	    gcd[k].data = &res->boxdata->border_type;
1807 	    gcd[k++].creator = GListButtonCreate;
1808 	    tofree[i].carray[l][2] = &gcd[k-1];
1809 	    tofree[i].carray[l][3] = GCD_ColSpan;
1810 	    if ( res->inherits_from==NULL )
1811 		gcd[k-3].gd.flags &= ~gg_enabled;
1812 	    else if ( res->inherits_from->boxdata->border_type == res->boxdata->border_type ) {
1813 		gcd[k-3].gd.flags |= gg_cb_on;
1814 		gcd[k-2].gd.flags &= ~gg_enabled;
1815 		gcd[k-1].gd.flags &= ~gg_enabled;
1816 	    }
1817 
1818 /* GT: "I." is an abreviation for "Inherits" */
1819 	    lab[k].text = (unichar_t *) _("I.");
1820 	    lab[k].text_is_1byte = true;
1821 	    gcd[k].gd.label = &lab[k];
1822 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1823 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1824 	    gcd[k].gd.cid = ++cid;
1825 	    gcd[k].gd.handle_controlevent = GRE_InheritListChange;
1826 	    gcd[k++].creator = GCheckBoxCreate;
1827 	    tofree[i].carray[l][4] = &gcd[k-1];
1828 
1829 	    lab[k].text = (unichar_t *) _("Border Shape:");
1830 	    lab[k].text_is_1byte = true;
1831 	    gcd[k].gd.label = &lab[k];
1832 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1833 	    gcd[k].gd.cid = ++cid;
1834 	    gcd[k++].creator = GLabelCreate;
1835 	    tofree[i].carray[l][5] = &gcd[k-1];
1836 
1837 	    gcd[k].gd.u.list = bordershape;
1838 	    gcd[k].gd.label = &bordershape[res->boxdata->border_shape];
1839 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1840 	    gcd[k].gd.cid = ++cid;
1841 	    gcd[k].gd.handle_controlevent = GRE_ListChanged;
1842 	    gcd[k].data = &res->boxdata->border_shape;
1843 	    gcd[k++].creator = GListButtonCreate;
1844 	    tofree[i].carray[l][6] = &gcd[k-1];
1845 	    if ( res->inherits_from==NULL )
1846 		gcd[k-3].gd.flags &= ~gg_enabled;
1847 	    else if ( res->inherits_from->boxdata->border_shape == res->boxdata->border_shape ) {
1848 		gcd[k-3].gd.flags |= gg_cb_on;
1849 		gcd[k-2].gd.flags &= ~gg_enabled;
1850 		gcd[k-1].gd.flags &= ~gg_enabled;
1851 	    }
1852 
1853 	    tofree[i].carray[l][7] = GCD_Glue;
1854 	    tofree[i].carray[l++][8] = NULL;
1855 
1856 /* GT: "I." is an abreviation for "Inherits" */
1857 	    lab[k].text = (unichar_t *) _("I.");
1858 	    lab[k].text_is_1byte = true;
1859 	    gcd[k].gd.label = &lab[k];
1860 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1861 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1862 	    gcd[k].gd.cid = ++cid;
1863 	    gcd[k].gd.handle_controlevent = GRE_InheritByteChange;
1864 	    gcd[k++].creator = GCheckBoxCreate;
1865 	    tofree[i].carray[l][0] = &gcd[k-1];
1866 
1867 	    lab[k].text = (unichar_t *) _("Border Width:");
1868 	    lab[k].text_is_1byte = true;
1869 	    gcd[k].gd.label = &lab[k];
1870 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1871 	    gcd[k].gd.cid = ++cid;
1872 	    gcd[k++].creator = GLabelCreate;
1873 	    tofree[i].carray[l][1] = &gcd[k-1];
1874 
1875 	    sprintf( tofree[i].bw, "%d", res->boxdata->border_width );
1876 	    lab[k].text = (unichar_t *) tofree[i].bw;
1877 	    lab[k].text_is_1byte = true;
1878 	    gcd[k].gd.pos.width = 50;
1879 	    gcd[k].gd.label = &lab[k];
1880 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1881 	    gcd[k].gd.cid = ++cid;
1882 	    gcd[k].gd.handle_controlevent = GRE_ByteChanged;
1883 	    gcd[k].data = &res->boxdata->border_width;
1884 	    gcd[k++].creator = GNumericFieldCreate;
1885 	    tofree[i].carray[l][2] = &gcd[k-1];
1886 	    tofree[i].carray[l][3] = GCD_ColSpan;
1887 	    if ( res->inherits_from==NULL )
1888 		gcd[k-3].gd.flags &= ~gg_enabled;
1889 	    else if ( res->inherits_from->boxdata->border_width == res->boxdata->border_width ) {
1890 		gcd[k-3].gd.flags |= gg_cb_on;
1891 		gcd[k-2].gd.flags &= ~gg_enabled;
1892 		gcd[k-1].gd.flags &= ~gg_enabled;
1893 	    }
1894 
1895 /* GT: "I." is an abreviation for "Inherits" */
1896 	    lab[k].text = (unichar_t *) _("I.");
1897 	    lab[k].text_is_1byte = true;
1898 	    gcd[k].gd.label = &lab[k];
1899 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1900 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1901 	    gcd[k].gd.cid = ++cid;
1902 	    gcd[k].gd.handle_controlevent = GRE_InheritByteChange;
1903 	    gcd[k++].creator = GCheckBoxCreate;
1904 	    tofree[i].carray[l][4] = &gcd[k-1];
1905 
1906 	    lab[k].text = (unichar_t *) _("Padding:");
1907 	    lab[k].text_is_1byte = true;
1908 	    gcd[k].gd.label = &lab[k];
1909 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1910 	    gcd[k].gd.cid = ++cid;
1911 	    gcd[k++].creator = GLabelCreate;
1912 	    tofree[i].carray[l][5] = &gcd[k-1];
1913 
1914 	    sprintf( tofree[i].padding, "%d", res->boxdata->padding );
1915 	    lab[k].text = (unichar_t *) tofree[i].padding;
1916 	    lab[k].text_is_1byte = true;
1917 	    gcd[k].gd.pos.width = 50;
1918 	    gcd[k].gd.label = &lab[k];
1919 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1920 	    gcd[k].gd.cid = ++cid;
1921 	    gcd[k].gd.handle_controlevent = GRE_ByteChanged;
1922 	    gcd[k].data = &res->boxdata->padding;
1923 	    gcd[k++].creator = GNumericFieldCreate;
1924 	    tofree[i].carray[l][6] = &gcd[k-1];
1925 	    if ( res->inherits_from==NULL )
1926 		gcd[k-3].gd.flags &= ~gg_enabled;
1927 	    else if ( res->inherits_from->boxdata->padding == res->boxdata->padding ) {
1928 		gcd[k-3].gd.flags |= gg_cb_on;
1929 		gcd[k-2].gd.flags &= ~gg_enabled;
1930 		gcd[k-1].gd.flags &= ~gg_enabled;
1931 	    }
1932 
1933 	    tofree[i].carray[l][7] = GCD_Glue;
1934 	    tofree[i].carray[l++][8] = NULL;
1935 
1936 /* GT: "I." is an abreviation for "Inherits" */
1937 	    lab[k].text = (unichar_t *) _("I.");
1938 	    lab[k].text_is_1byte = true;
1939 	    gcd[k].gd.label = &lab[k];
1940 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1941 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1942 	    gcd[k].gd.cid = ++cid;
1943 	    gcd[k].gd.handle_controlevent = GRE_InheritByteChange;
1944 	    gcd[k++].creator = GCheckBoxCreate;
1945 	    tofree[i].carray[l][0] = &gcd[k-1];
1946 
1947 	    lab[k].text = (unichar_t *) _("Radius:");
1948 	    lab[k].text_is_1byte = true;
1949 	    gcd[k].gd.label = &lab[k];
1950 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1951 	    gcd[k].gd.cid = ++cid;
1952 	    gcd[k++].creator = GLabelCreate;
1953 	    tofree[i].carray[l][1] = &gcd[k-1];
1954 
1955 	    sprintf( tofree[i].rr, "%d", res->boxdata->rr_radius );
1956 	    lab[k].text = (unichar_t *) tofree[i].rr;
1957 	    lab[k].text_is_1byte = true;
1958 	    gcd[k].gd.pos.width = 50;
1959 	    gcd[k].gd.label = &lab[k];
1960 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1961 	    gcd[k].gd.cid = ++cid;
1962 	    gcd[k].gd.handle_controlevent = GRE_ByteChanged;
1963 	    gcd[k].data = &res->boxdata->rr_radius;
1964 	    gcd[k++].creator = GNumericFieldCreate;
1965 	    tofree[i].carray[l][2] = &gcd[k-1];
1966 	    tofree[i].carray[l][3] = GCD_ColSpan;
1967 	    if ( res->inherits_from==NULL )
1968 		gcd[k-3].gd.flags &= ~gg_enabled;
1969 	    else if ( res->inherits_from->boxdata->rr_radius == res->boxdata->rr_radius ) {
1970 		gcd[k-3].gd.flags |= gg_cb_on;
1971 		gcd[k-2].gd.flags &= ~gg_enabled;
1972 		gcd[k-1].gd.flags &= ~gg_enabled;
1973 	    }
1974 
1975 	    tofree[i].carray[l][4] = GCD_Glue;
1976 	    tofree[i].carray[l][5] = GCD_Glue;
1977 	    tofree[i].carray[l][6] = GCD_Glue;
1978 	    tofree[i].carray[l][7] = GCD_Glue;
1979 	    tofree[i].carray[l++][8] = NULL;
1980 	    tofree[i].carray[l][0] = NULL;
1981 
1982 	    tofree[i].colbox.gd.flags = gg_enabled | gg_visible;
1983 	    tofree[i].colbox.gd.u.boxelements = tofree[i].carray[0];
1984 	    tofree[i].colbox.creator = GHVBoxCreate;
1985 	    tofree[i].marray[j++] = &tofree[i].colbox;
1986 	}
1987 
1988 	if ( res->font!=NULL ) {
1989 	    tofree[i].fontname = GFontSpec2String( *res->font );
1990 
1991 	    lab[k].text = (unichar_t *) _("I.");
1992 	    lab[k].text_is_1byte = true;
1993 	    gcd[k].gd.label = &lab[k];
1994 	    gcd[k].gd.flags = gg_visible|gg_enabled;
1995 	    gcd[k].gd.popup_msg = _("Inherits for same field in parent");
1996 	    gcd[k].gd.cid = ++cid;
1997 	    gcd[k].gd.handle_controlevent = GRE_InheritFontChange;
1998 	    gcd[k++].creator = GCheckBoxCreate;
1999 	    tofree[i].fontarray[0] = &gcd[k-1];
2000 
2001 	    lab[k].text = (unichar_t *) _("Font:");
2002 	    lab[k].text_is_1byte = true;
2003 	    gcd[k].gd.label = &lab[k];
2004 	    gcd[k].gd.flags = gg_visible|gg_enabled;
2005 	    gcd[k].gd.cid = ++cid;
2006 	    gcd[k++].creator = GLabelCreate;
2007 	    tofree[i].fontarray[1] = &gcd[k-1];
2008 
2009 	    lab[k].text = (unichar_t *) tofree[i].fontname;
2010 	    lab[k].text_is_1byte = true;
2011 	    gcd[k].gd.label = &lab[k];
2012 	    gcd[k].gd.flags = gg_visible|gg_enabled;
2013 	    gcd[k].gd.cid = tofree[i].fontcid = ++cid;
2014 	    gcd[k].gd.handle_controlevent = GRE_FontChanged;
2015 	    gcd[k].data = res->font;
2016 	    gcd[k++].creator = GTextFieldCreate;
2017 	    tofree[i].fontarray[2] = &gcd[k-1];
2018 	    if ( res->inherits_from==NULL )
2019 		gcd[k-3].gd.flags &= ~gg_enabled;
2020 	    else if ( *res->inherits_from->font == *res->font ) {
2021 		gcd[k-3].gd.flags |= gg_cb_on;
2022 		gcd[k-2].gd.flags &= ~gg_enabled;
2023 		gcd[k-1].gd.flags &= ~gg_enabled;
2024 	    }
2025 	    tofree[i].fontarray[3] = GCD_Glue;
2026 	    tofree[i].fontarray[4] = NULL;
2027 
2028 	    tofree[i].fontbox.gd.flags = gg_enabled | gg_visible;
2029 	    tofree[i].fontbox.gd.u.boxelements = tofree[i].fontarray;
2030 	    tofree[i].fontbox.creator = GHBoxCreate;
2031 	    tofree[i].marray[j++] = &tofree[i].fontbox;
2032 	}
2033 	if ( res->seealso1 != NULL ) {
2034 	    lab[k].text = (unichar_t *) _("See also:");
2035 	    lab[k].text_is_1byte = true;
2036 	    gcd[k].gd.label = &lab[k];
2037 	    gcd[k].gd.flags = gg_visible|gg_enabled;
2038 	    gcd[k++].creator = GLabelCreate;
2039 	    tofree[i].saarray[0] = &gcd[k-1];
2040 
2041 	    lab[k].text = (unichar_t *) S_(res->seealso1->name);
2042 	    lab[k].text_is_1byte = true;
2043 	    gcd[k].gd.label = &lab[k];
2044 	    gcd[k].gd.flags = gg_visible|gg_enabled|gg_dontcopybox;
2045 	    gcd[k].gd.box = &small_blue_box;
2046 	    gcd[k].data = res->seealso1;
2047 	    gcd[k].gd.handle_controlevent = GRE_ChangePane;
2048 	    gcd[k++].creator = GButtonCreate;
2049 	    tofree[i].saarray[1] = &gcd[k-1];
2050 
2051 	    if ( res->seealso2!=NULL ) {
2052 		lab[k].text = (unichar_t *) S_(res->seealso2->name);
2053 		lab[k].text_is_1byte = true;
2054 		gcd[k].gd.label = &lab[k];
2055 		gcd[k].gd.flags = gg_visible|gg_enabled|gg_dontcopybox;
2056 		gcd[k].gd.box = &small_blue_box;
2057 		gcd[k].data = res->seealso2;
2058 		gcd[k].gd.handle_controlevent = GRE_ChangePane;
2059 		gcd[k++].creator = GButtonCreate;
2060 		tofree[i].saarray[2] = &gcd[k-1];
2061 	    } else
2062 		tofree[i].saarray[2] = GCD_Glue;
2063 
2064 	    tofree[i].saarray[3] = GCD_Glue; tofree[i].saarray[4] = NULL;
2065 	    tofree[i].sabox.gd.flags = gg_visible|gg_enabled;
2066 	    tofree[i].sabox.gd.u.boxelements = tofree[i].saarray;
2067 	    tofree[i].sabox.creator = GHBoxCreate;
2068 	    tofree[i].marray[j++] = &tofree[i].sabox;
2069 	}
2070 
2071 	if ( res->extras!=NULL ) {
2072 	    int hl=-1, base=3;
2073 	    for ( l=0, extras = res->extras ; extras->name!=NULL; ++extras, ++l ) {
2074 		if ( base==3 ) {
2075 		    base=0;
2076 		    ++hl;
2077 		} else
2078 		    base=3;
2079 		if ( base==3 ) {
2080 		    tofree[i].earray[hl][6] = GCD_Glue;
2081 		    tofree[i].earray[hl][7] = NULL;
2082 		}
2083 		switch ( extras->type ) {
2084 		  case rt_bool:
2085 		    extras->orig.ival = *(int *) (extras->val);
2086 		    lab[k].text = (unichar_t *) S_(extras->name);
2087 		    lab[k].text_is_1byte = true;
2088 		    gcd[k].gd.label = &lab[k];
2089 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2090 		    if ( extras->orig.ival )
2091 			gcd[k].gd.flags |= gg_cb_on;
2092 		    if ( extras->popup!=NULL )
2093 			gcd[k].gd.popup_msg = _(extras->popup);
2094 		    gcd[k].gd.cid = extras->cid = ++cid;
2095 		    gcd[k].data = extras->val;
2096 		    gcd[k].gd.handle_controlevent = GRE_BoolChanged;
2097 		    gcd[k++].creator = GCheckBoxCreate;
2098 		    tofree[i].earray[hl][base] = &gcd[k-1];
2099 		    tofree[i].earray[hl][base+1] = GCD_ColSpan;
2100 		    tofree[i].earray[hl][base+2] = GCD_ColSpan;
2101 		  break;
2102 		  case rt_int:
2103 		    extras->orig.ival = *(int *) (extras->val);
2104 		    lab[k].text = (unichar_t *) S_(extras->name);
2105 		    lab[k].text_is_1byte = true;
2106 		    gcd[k].gd.label = &lab[k];
2107 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2108 		    if ( extras->popup!=NULL )
2109 			gcd[k].gd.popup_msg = _(extras->popup);
2110 		    gcd[k++].creator = GLabelCreate;
2111 		    tofree[i].earray[hl][base] = &gcd[k-1];
2112 
2113 		    tofree[i].extradefs[l] = malloc(20);
2114 		    sprintf( tofree[i].extradefs[l], "%d", extras->orig.ival );
2115 		    lab[k].text = (unichar_t *) tofree[i].extradefs[l];
2116 		    lab[k].text_is_1byte = true;
2117 		    gcd[k].gd.pos.width = 60;
2118 		    gcd[k].gd.label = &lab[k];
2119 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2120 		    if ( extras->popup!=NULL )
2121 			gcd[k].gd.popup_msg = S_(extras->popup);
2122 		    gcd[k].gd.cid = extras->cid = ++cid;
2123 		    gcd[k].data = extras->val;
2124 		    gcd[k].gd.handle_controlevent = GRE_IntChanged;
2125 		    gcd[k++].creator = GNumericFieldCreate;
2126 		    tofree[i].earray[hl][base+1] = &gcd[k-1];
2127 		    tofree[i].earray[hl][base+2] = GCD_ColSpan;
2128 		  break;
2129 		  case rt_double:
2130 		    extras->orig.dval = *(double *) (extras->val);
2131 		    lab[k].text = (unichar_t *) S_(extras->name);
2132 		    lab[k].text_is_1byte = true;
2133 		    gcd[k].gd.label = &lab[k];
2134 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2135 		    if ( extras->popup!=NULL )
2136 			gcd[k].gd.popup_msg = _(extras->popup);
2137 		    gcd[k++].creator = GLabelCreate;
2138 		    tofree[i].earray[hl][base] = &gcd[k-1];
2139 
2140 		    tofree[i].extradefs[l] = malloc(40);
2141 		    sprintf( tofree[i].extradefs[l], "%g", extras->orig.dval );
2142 		    lab[k].text = (unichar_t *) tofree[i].extradefs[l];
2143 		    lab[k].text_is_1byte = true;
2144 		    gcd[k].gd.label = &lab[k];
2145 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2146 		    if ( extras->popup!=NULL )
2147 			gcd[k].gd.popup_msg = _(extras->popup);
2148 		    gcd[k].data = extras->val;
2149 		    gcd[k].gd.cid = extras->cid = ++cid;
2150 		    gcd[k].gd.handle_controlevent = GRE_DoubleChanged;
2151 		    gcd[k++].creator = GTextFieldCreate;
2152 		    tofree[i].earray[hl][base+1] = &gcd[k-1];
2153 		    tofree[i].earray[hl][base+2] = GCD_ColSpan;
2154 		  break;
2155 		  case rt_coloralpha:
2156 		  case rt_color:
2157 		    extras->orig.ival = *(int *) (extras->val);
2158 		    lab[k].text = (unichar_t *) S_(extras->name);
2159 		    lab[k].text_is_1byte = true;
2160 		    gcd[k].gd.label = &lab[k];
2161 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2162 		    if ( extras->popup!=NULL )
2163 			gcd[k].gd.popup_msg = _(extras->popup);
2164 		    gcd[k++].creator = GLabelCreate;
2165 		    tofree[i].earray[hl][base] = &gcd[k-1];
2166 
2167 		    gcd[k].gd.u.col = extras->orig.ival;
2168 		    if ( (extras->orig.ival&0xff000000)==0 && extras->type==rt_coloralpha )
2169 			gcd[k].gd.u.col |= 0xfe000000;
2170 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2171 		    if ( extras->popup!=NULL )
2172 			gcd[k].gd.popup_msg = _(extras->popup);
2173 		    gcd[k].gd.cid = extras->cid = ++cid;
2174 		    gcd[k].data = extras->val;
2175 		    gcd[k].gd.handle_controlevent = GRE_ExtraColorChanged;
2176 		    gcd[k++].creator = GColorButtonCreate;
2177 		    tofree[i].earray[hl][base+1] = &gcd[k-1];
2178 		    tofree[i].earray[hl][base+2] = GCD_ColSpan;
2179 		  break;
2180 		  case rt_stringlong:
2181 		    if ( base==3 ) {
2182 			tofree[i].earray[hl][3] = GCD_Glue;
2183 			tofree[i].earray[hl][4] = GCD_Glue;
2184 			tofree[i].earray[hl][5] = GCD_Glue;
2185 			tofree[i].earray[hl][6] = GCD_Glue;
2186 			tofree[i].earray[hl][7] = NULL;
2187 			base=0; ++hl;
2188 		    }
2189 		  /* Fall through */
2190 		  case rt_string:
2191 		    extras->orig.sval = *(char **) (extras->val);
2192 		    lab[k].text = (unichar_t *) S_(extras->name);
2193 		    lab[k].text_is_1byte = true;
2194 		    gcd[k].gd.label = &lab[k];
2195 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2196 		    if ( extras->popup!=NULL )
2197 			gcd[k].gd.popup_msg = _(extras->popup);
2198 		    gcd[k++].creator = GLabelCreate;
2199 		    tofree[i].earray[hl][base] = &gcd[k-1];
2200 
2201 		    if ( extras->orig.sval != NULL ) {
2202 			lab[k].text = (unichar_t *) extras->orig.sval;
2203 			lab[k].text_is_1byte = true;
2204 			gcd[k].gd.label = &lab[k];
2205 		    }
2206 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2207 		    if ( extras->popup!=NULL )
2208 			gcd[k].gd.popup_msg = _(extras->popup);
2209 		    gcd[k].data = extras->val;
2210 		    gcd[k].gd.cid = extras->cid = ++cid;
2211 		    gcd[k].gd.handle_controlevent = GRE_StringChanged;
2212 		    gcd[k++].creator = GTextFieldCreate;
2213 		    tofree[i].earray[hl][base+1] = &gcd[k-1];
2214 		    tofree[i].earray[hl][base+2] = GCD_ColSpan;
2215 		    if ( extras->type==rt_stringlong ) {
2216 			tofree[i].earray[hl][3] = GCD_ColSpan;
2217 			tofree[i].earray[hl][4] = GCD_ColSpan;
2218 			tofree[i].earray[hl][5] = GCD_ColSpan;
2219 			tofree[i].earray[hl][6] = GCD_ColSpan;
2220 			base=3;
2221 		    }
2222 		  break;
2223 		  case rt_font:
2224 		    if ( base==3 ) {
2225 			tofree[i].earray[hl][3] = GCD_Glue;
2226 			tofree[i].earray[hl][4] = GCD_Glue;
2227 			tofree[i].earray[hl][5] = GCD_Glue;
2228 			tofree[i].earray[hl][6] = GCD_Glue;
2229 			tofree[i].earray[hl][7] = NULL;
2230 			base=0; ++hl;
2231 		    }
2232 		    extras->orig.fontval = *(GFont **) (extras->val);
2233 		    lab[k].text = (unichar_t *) S_(extras->name);
2234 		    lab[k].text_is_1byte = true;
2235 		    gcd[k].gd.label = &lab[k];
2236 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2237 		    if ( extras->popup!=NULL )
2238 			gcd[k].gd.popup_msg = _(extras->popup);
2239 		    gcd[k++].creator = GLabelCreate;
2240 		    tofree[i].earray[hl][base] = &gcd[k-1];
2241 
2242 		    if ( extras->orig.fontval != NULL ) {
2243 			tofree[i].extradefs[l] = GFontSpec2String( extras->orig.fontval );
2244 			lab[k].text = (unichar_t *) tofree[i].extradefs[l];
2245 			lab[k].text_is_1byte = true;
2246 			gcd[k].gd.label = &lab[k];
2247 		    }
2248 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2249 		    if ( extras->popup!=NULL )
2250 			gcd[k].gd.popup_msg = _(extras->popup);
2251 		    gcd[k].data = extras->val;
2252 		    gcd[k].gd.cid = extras->cid = ++cid;
2253 		    gcd[k].gd.handle_controlevent = GRE_ExtraFontChanged;
2254 		    gcd[k++].creator = GTextFieldCreate;
2255 		    tofree[i].earray[hl][base+1] = &gcd[k-1];
2256 		    tofree[i].earray[hl][base+2] = GCD_ColSpan;
2257 
2258 		    /* Font names (with potentially many families) tend to be long */
2259 		    tofree[i].earray[hl][3] = GCD_ColSpan;
2260 		    tofree[i].earray[hl][4] = GCD_ColSpan;
2261 		    tofree[i].earray[hl][5] = GCD_ColSpan;
2262 		    tofree[i].earray[hl][6] = GCD_ColSpan;
2263 		    base=3;
2264 		  break;
2265 		  case rt_image: {
2266 		    GResImage *ri = *(GResImage **) (extras->val);
2267 		    extras->orig.sval = copy( ri==NULL ? NULL : ri->filename );
2268 		    lab[k].text = (unichar_t *) S_(extras->name);
2269 		    lab[k].text_is_1byte = true;
2270 		    gcd[k].gd.label = &lab[k];
2271 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2272 		    if ( extras->popup!=NULL )
2273 			gcd[k].gd.popup_msg = _(extras->popup);
2274 		    gcd[k++].creator = GLabelCreate;
2275 		    tofree[i].earray[hl][base] = &gcd[k-1];
2276 
2277 		    if ( ri != NULL && ri->image!=NULL ) {
2278 			lab[k].text = (unichar_t *) "...";
2279 			lab[k].image = ri->image;
2280 		    } else
2281 			lab[k].text = (unichar_t *) "? ...";
2282 		    lab[k].text_is_1byte = true;
2283 		    gcd[k].gd.label = &lab[k];
2284 		    gcd[k].gd.flags = gg_visible|gg_enabled;
2285 		    if ( extras->popup!=NULL )
2286 			gcd[k].gd.popup_msg = _(extras->popup);
2287 		    gcd[k].data = extras->val;
2288 		    gcd[k].gd.cid = extras->cid = ++cid;
2289 		    gcd[k].gd.handle_controlevent = GRE_ImageChanged;
2290 		    gcd[k++].creator = GButtonCreate;
2291 		    tofree[i].earray[hl][base+1] = &gcd[k-1];
2292 		    tofree[i].earray[hl][base+2] = GCD_ColSpan;
2293 		  } break;
2294 		}
2295 	    }
2296 	    if ( base==0 ) {
2297 		tofree[i].earray[hl][3] = GCD_Glue;
2298 		tofree[i].earray[hl][4] = GCD_Glue;
2299 		tofree[i].earray[hl][5] = GCD_Glue;
2300 		tofree[i].earray[hl][6] = GCD_Glue;
2301 		tofree[i].earray[hl][7] = NULL;
2302 	    }
2303 	    tofree[i].earray[hl+1][0] = NULL;
2304 	    tofree[i].extrabox.gd.flags = gg_visible|gg_enabled;
2305 	    tofree[i].extrabox.gd.u.boxelements = tofree[i].earray[0];
2306 	    tofree[i].extrabox.creator = GHVBoxCreate;
2307 	    tofree[i].marray[j++] = &tofree[i].extrabox;
2308 	}
2309 	tofree[i].marray[j++] = GCD_Glue;
2310 	tofree[i].marray[j++] = NULL;
2311 	tofree[i].mainbox[0].gd.flags = gg_visible|gg_enabled;
2312 	tofree[i].mainbox[0].gd.u.boxelements = tofree[i].marray;
2313 	tofree[i].mainbox[0].creator = GVBoxCreate;
2314 	panes[i].text = (unichar_t *) S_(res->name);
2315 	panes[i].text_is_1byte = true;
2316 	panes[i].gcd = &tofree[i].mainbox[0];
2317 	for ( parent=res; parent!=NULL; parent=parent->inherits_from, ++panes[i].nesting );
2318 	if ( k>cnt )
2319 	    GDrawIError( "ResEdit Miscounted, expect a crash" );
2320     }
2321 
2322     memset(topgcd,0,sizeof(topgcd));
2323     memset(topbox,0,sizeof(topbox));
2324     memset(toplab,0,sizeof(toplab));
2325 
2326     topgcd[0].gd.flags = gg_visible|gg_enabled|gg_tabset_vert|gg_tabset_scroll;
2327     topgcd[0].gd.u.tabs = panes;
2328     topgcd[0].creator = GTabSetCreate;
2329 
2330     toplab[1].text = (unichar_t *) _("_OK");
2331     toplab[1].text_is_1byte = true;
2332     toplab[1].text_in_resource = true;
2333     topgcd[1].gd.label = &toplab[1];
2334     topgcd[1].gd.flags = gg_visible|gg_enabled | gg_but_default;
2335     topgcd[1].gd.handle_controlevent = GRE_OK;
2336     topgcd[1].creator = GButtonCreate;
2337 
2338     toplab[2].text = (unichar_t *) _("_Save As...");
2339     toplab[2].text_is_1byte = true;
2340     toplab[2].text_in_resource = true;
2341     topgcd[2].gd.label = &toplab[2];
2342     topgcd[2].gd.flags = gg_visible|gg_enabled;
2343     topgcd[2].gd.handle_controlevent = GRE_Save;
2344     topgcd[2].creator = GButtonCreate;
2345 
2346     toplab[3].text = (unichar_t *) _("_Cancel");
2347     toplab[3].text_is_1byte = true;
2348     toplab[3].text_in_resource = true;
2349     topgcd[3].gd.label = &toplab[3];
2350     topgcd[3].gd.flags = gg_visible|gg_enabled | gg_but_cancel;
2351     topgcd[3].gd.handle_controlevent = GRE_Cancel;
2352     topgcd[3].creator = GButtonCreate;
2353 
2354     barray[0] = GCD_Glue; barray[1] = &topgcd[1]; barray[2] = GCD_Glue;
2355     barray[3] = GCD_Glue; barray[4] = &topgcd[2]; barray[5] = GCD_Glue;
2356     barray[6] = GCD_Glue; barray[7] = &topgcd[3]; barray[8] = GCD_Glue;
2357     barray[9] = NULL;
2358 
2359     topbox[2].gd.flags = gg_visible | gg_enabled;
2360     topbox[2].gd.u.boxelements = barray;
2361     topbox[2].creator = GHBoxCreate;
2362 
2363     tarray[0][0] = &topgcd[0]; tarray[0][1] = NULL;
2364     tarray[1][0] = &topbox[2]; tarray[1][1] = NULL;
2365     tarray[2][0] = NULL;
2366 
2367     topbox[0].gd.pos.x = topbox[0].gd.pos.y = 2;
2368     topbox[0].gd.flags = gg_visible | gg_enabled;
2369     topbox[0].gd.u.boxelements = tarray[0];
2370     topbox[0].creator = GHVGroupCreate;
2371 
2372     GGadgetsCreate(gw,topbox);
2373     gre.tabset = topgcd[0].ret;
2374 
2375     GHVBoxSetExpandableRow(topbox[0].ret,0);
2376     GHVBoxSetExpandableCol(topbox[2].ret,gb_expandgluesame);
2377 
2378     for ( res=all, i=0; res!=NULL; res=res->next, ++i ) {
2379 	GHVBoxSetExpandableRow(tofree[i].mainbox[0].ret,gb_expandglue);
2380 	if ( res->examples!=NULL &&
2381 		( res->examples->creator==GHBoxCreate ||
2382 		  res->examples->creator==GVBoxCreate ||
2383 		  res->examples->creator==GHVBoxCreate )) {
2384 	    GHVBoxSetExpandableCol(res->examples->ret,gb_expandglue);
2385 	    GHVBoxSetExpandableRow(res->examples->ret,gb_expandglue);
2386 	}
2387 	if ( tofree[i].ibox.ret!=NULL )
2388 	    GHVBoxSetExpandableCol(tofree[i].ibox.ret,gb_expandglue);
2389 	if ( tofree[i].flagsbox.ret!=NULL )
2390 	    GHVBoxSetExpandableCol(tofree[i].flagsbox.ret,gb_expandglue);
2391 	if ( tofree[i].colbox.ret!=NULL )
2392 	    GHVBoxSetExpandableCol(tofree[i].colbox.ret,gb_expandglue);
2393 	if ( tofree[i].extrabox.ret!=NULL )
2394 	    GHVBoxSetExpandableCol(tofree[i].extrabox.ret,gb_expandglue);
2395 	if ( tofree[i].sabox.ret!=NULL )
2396 	    GHVBoxSetExpandableCol(tofree[i].sabox.ret,gb_expandglue);
2397 	if ( tofree[i].fontbox.ret!=NULL )
2398 	    GHVBoxSetExpandableCol(tofree[i].fontbox.ret,2);
2399 	if ( res->boxdata!=NULL ) {
2400 	    GGadgetSelectOneListItem(GWidgetGetControl(gw,tofree[i].btcid),res->boxdata->border_type);
2401 	    GGadgetSelectOneListItem(GWidgetGetControl(gw,tofree[i].btcid+3),res->boxdata->border_shape);
2402 	}
2403     }
2404 
2405     GHVBoxFitWindowCentered(topbox[0].ret);
2406     GDrawSetVisible(gw,true);
2407 
2408     while ( !gre.done )
2409 	GDrawProcessOneEvent(NULL);
2410     GDrawDestroyWindow(gw);
2411 
2412     for ( res=all, i=0; res!=NULL; res=res->next, ++i ) {
2413 	free(tofree[i].gcd);
2414 	free(tofree[i].lab);
2415 	free(tofree[i].earray);
2416 	free(tofree[i].fontname);
2417 	if ( res->extras!=NULL ) {
2418 	    for ( l=0, extras = res->extras ; extras->name!=NULL; ++extras, ++l ) {
2419 		free( tofree[i].extradefs[l]);
2420 	    }
2421 	}
2422 	free(tofree[i].extradefs);
2423     }
2424     free( tofree );
2425     free( panes );
2426 }
2427 
2428 static double _GDraw_Width_cm, _GDraw_Width_Inches;
2429 static Color _GDraw_fg, _GDraw_bg;
2430 static struct resed gdrawcm_re[] = {
2431     {N_("Default Background"), "Background", rt_color, &_GDraw_bg, N_("Default background color for windows"), NULL, { 0 }, 0, 0 },
2432     {N_("Default Foreground"), "Foreground", rt_color, &_GDraw_fg, N_("Default foreground color for windows"), NULL, { 0 }, 0, 0 },
2433     {N_("Screen Width in Centimeters"), "ScreenWidthCentimeters", rt_double, &_GDraw_Width_cm, N_("Physical screen width, measured in centimeters\nFor this to take effect you must save the resource data (press the [Save] button)\nand restart fontforge"), NULL, { 0 }, 0, 0 },
2434     RESED_EMPTY
2435 };
2436 static struct resed gdrawin_re[] = {
2437     {N_("Default Background"), "Background", rt_color, &_GDraw_bg, N_("Default background color for windows"), NULL, { 0 }, 0, 0 },
2438     {N_("Default Foreground"), "Foreground", rt_color, &_GDraw_fg, N_("Default foreground color for windows"), NULL, { 0 }, 0, 0 },
2439     {N_("Screen Width in Inches"), "ScreenWidthInches", rt_double, &_GDraw_Width_Inches, N_("Physical screen width, measured in inches\nFor this to take effect you must save the resource data (press the [Save] button)\nand restart fontforge"), NULL, { 0 }, 0, 0 },
2440     RESED_EMPTY
2441 };
2442 static GResInfo gdraw_ri = {
2443     NULL, NULL,NULL, NULL,
2444     NULL,
2445     NULL,
2446     NULL,
2447     gdrawcm_re,
2448     N_("GDraw"),
2449     N_("General facts about the windowing system"),
2450     "",
2451     "Gdraw",
2452     false,
2453     0,
2454     NULL,
2455     GBOX_EMPTY,
2456     NULL,
2457     NULL,
2458     NULL
2459 };
2460 
refresh_eh(GWindow cover,GEvent * event)2461 static int refresh_eh(GWindow cover,GEvent *event) {
2462     if ( event->type==et_expose )
2463 	GDrawDestroyWindow(cover);
2464 return( true );
2465 }
2466 
GResEdit(GResInfo * additional,const char * def_res_file,void (* change_res_filename)(const char *))2467 void GResEdit(GResInfo *additional,const char *def_res_file,void (*change_res_filename)(const char *)) {
2468     GResInfo *re_end, *re;
2469     static int initted = false;
2470     char *oldimagepath;
2471     extern char *_GGadget_ImagePath;
2472 
2473     if ( !initted ) {
2474 	initted = true;
2475 	_GDraw_Width_Inches = screen_display->groot->pos.width / (double) screen_display->res;
2476 	_GDraw_Width_cm = _GDraw_Width_Inches * 2.54;
2477 	_GDraw_bg = GDrawGetDefaultBackground(NULL);
2478 	_GDraw_fg = GDrawGetDefaultForeground(NULL);
2479 	if ( getenv("LC_MESSAGES")!=NULL ) {
2480 	    if ( strstr(getenv("LC_MESSAGES"),"_US")!=NULL )
2481 		gdraw_ri.extras = gdrawin_re;
2482 	} else if ( getenv("LANG")!=NULL ) {
2483 	    if ( strstr(getenv("LANG"),"_US")!=NULL )
2484 		gdraw_ri.extras = gdrawin_re;
2485 	}
2486 	gdraw_ri.next = _GProgressRIHead();
2487 	for ( re_end = _GProgressRIHead(); re_end->next!=NULL; re_end = re_end->next );
2488 	re_end->next = _GGadgetRIHead();
2489 	for ( re_end = _GGadgetRIHead(); re_end->next!=NULL; re_end = re_end->next );
2490 	re_end->next = _GButtonRIHead();
2491 	for ( re_end = _GButtonRIHead(); re_end->next!=NULL; re_end = re_end->next );
2492 	re_end->next = _GRadioRIHead();
2493 	for ( re_end = _GRadioRIHead(); re_end->next!=NULL; re_end = re_end->next );
2494 	re_end->next = _GTextFieldRIHead();
2495 	for ( re_end = _GTextFieldRIHead(); re_end->next!=NULL; re_end = re_end->next );
2496 	re_end->next = _GListRIHead();
2497 	for ( re_end = _GListRIHead(); re_end->next!=NULL; re_end = re_end->next );
2498 	re_end->next = _GScrollBarRIHead();
2499 	for ( re_end = _GScrollBarRIHead(); re_end->next!=NULL; re_end = re_end->next );
2500 	re_end->next = _GLineRIHead();
2501 	for ( re_end = _GLineRIHead(); re_end->next!=NULL; re_end = re_end->next );
2502 	re_end->next = _GHVBoxRIHead();
2503 	for ( re_end = _GHVBoxRIHead(); re_end->next!=NULL; re_end = re_end->next );
2504 	re_end->next = _GMenuRIHead();
2505 	for ( re_end = _GMenuRIHead(); re_end->next!=NULL; re_end = re_end->next );
2506 	re_end->next = _GMatrixEditRIHead();
2507 	for ( re_end = _GMatrixEditRIHead(); re_end->next!=NULL; re_end = re_end->next );
2508 	re_end->next = _GDrawableRIHead();
2509 	for ( re_end = _GDrawableRIHead(); re_end->next!=NULL; re_end = re_end->next );
2510 	re_end->next = _GTabSetRIHead();
2511 	for ( re_end = _GTabSetRIHead(); re_end->next!=NULL; re_end = re_end->next );
2512     }
2513     if ( additional!=NULL ) {
2514 	for ( re_end=additional; re_end->next!=NULL; re_end = re_end->next );
2515 	re_end->next = &gdraw_ri;
2516     } else {
2517 	additional = &gdraw_ri;
2518 	re_end = NULL;
2519     }
2520     oldimagepath = copy( _GGadget_ImagePath );
2521     GResEditDlg(additional,def_res_file,change_res_filename);
2522     if (( oldimagepath!=NULL && _GGadget_ImagePath==NULL ) ||
2523 	    ( oldimagepath==NULL && _GGadget_ImagePath!=NULL ) ||
2524 	    ( oldimagepath!=NULL && _GGadget_ImagePath!=NULL &&
2525 		    strcmp(oldimagepath,_GGadget_ImagePath)!=0 )) {
2526 	char *new = _GGadget_ImagePath;
2527 	_GGadget_ImagePath = oldimagepath;
2528 	GGadgetSetImagePath(new);
2529     } else
2530 	free( oldimagepath );
2531     for ( re=additional; re!=NULL; re=re->next ) {
2532 	if ( (re->override_mask&omf_refresh) && re->refresh!=NULL )
2533 	    (re->refresh)();
2534     }
2535     if ( re_end!=NULL )
2536 	re_end->next = NULL;
2537 
2538     /* Now create a window which covers the entire screen, and then destroy it*/
2539     /*  point is to force a refresh on all our windows (it'll refresh everyone's*/
2540     /*  else windows too, but oh well */
2541     {
2542 	GWindowAttrs wattrs;
2543 	GWindow root = GDrawGetRoot(screen_display);
2544 	GRect screen;
2545 	static GWindow gw;
2546 
2547 	GDrawGetSize(root,&screen);
2548 	wattrs.mask = wam_events|wam_nodecor|wam_positioned|wam_bordwidth|wam_backcol;
2549 	wattrs.event_masks = -1;
2550 	wattrs.nodecoration = true;
2551 	wattrs.positioned = true;
2552 	wattrs.border_width = 0;
2553 	wattrs.background_color = COLOR_UNKNOWN;
2554 	gw = GDrawCreateTopWindow(screen_display,&screen,refresh_eh,&gw,&wattrs);
2555 	GDrawSetVisible(gw,true);
2556     }
2557 }
2558 
GResEditFind(struct resed * resed,char * prefix)2559 void GResEditFind( struct resed *resed, char *prefix) {
2560     int i;
2561     GResStruct *info;
2562 
2563     for ( i=0; resed[i].name!=NULL; ++i );
2564 
2565     info = calloc(i+1,sizeof(GResStruct));
2566     for ( i=0; resed[i].name!=NULL; ++i ) {
2567 	info[i].resname = resed[i].resname;
2568 	info[i].type = resed[i].type;
2569 	if ( info[i].type==rt_stringlong )
2570 	    info[i].type = rt_string;
2571 	else if ( info[i].type==rt_coloralpha )
2572 	    info[i].type = rt_color;
2573 	info[i].val = resed[i].val;
2574 	info[i].cvt = resed[i].cvt;
2575 	if ( info[i].type==rt_font ) {
2576 	    info[i].type = rt_string;
2577 	    info[i].cvt = GResource_font_cvt;
2578 	}
2579     }
2580     GResourceFind(info,prefix);
2581     for ( i=0; resed[i].name!=NULL; ++i )
2582 	resed[i].found = info[i].found;
2583     free(info);
2584 }
2585