LCOV - code coverage report
Current view: top level - gdraw - gresedit.c (source / functions) Hit Total Coverage
Test: FontForge coverage report 2017-08-04 01:21:11+02:00 (commit d35f7e4107a9e1db65cce47c468fcc914cecb8fd) Lines: 0 1896 0.0 %
Date: 2017-08-04 Functions: 0 38 0.0 %

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

Generated by: LCOV version 1.10