tGet rid of config parameter MACROs - surf - customized build of surf, the suckless webkit browser
 (HTM) git clone git://src.adamsgaard.dk/surf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a0ef4ba41d3e43618607f9cf1d14e83ee475f624
 (DIR) parent d3e974f4eafe459990ff9b140d96a6fe568ee6dc
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Sat, 20 May 2017 19:21:41 +0200
       
       Get rid of config parameter MACROs
       
       There's no need to obfuscate so much what is done, the user can deal
       with a few extra knobs to set instead.
       
       Diffstat:
         M config.def.h                        |      69 ++++++++++++++++---------------
         M surf.c                              |      90 ++++++++++++++++++-------------
       
       2 files changed, 87 insertions(+), 72 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -9,44 +9,45 @@ static char *cookiefile     = "~/.surf/cookies.txt";
        
        /* Webkit default features */
        static Parameter defconfig[ParameterLast] = {
       -        SETB(AcceleratedCanvas,  1),
       -        SETB(AccessMicrophone,   0),
       -        SETB(AccessWebcam,       0),
       -        SETB(Certificate,        0),
       -        SETB(CaretBrowsing,      0),
       -        SETV(CookiePolicies,     "@Aa"),
       -        SETV(DefaultCharset,     "UTF-8"),
       -        SETB(DiskCache,          1),
       -        SETB(DNSPrefetch,        0),
       -        SETB(FileURLsCrossAccess,0),
       -        SETI(FontSize,           12),
       -        SETB(FrameFlattening,    0),
       -        SETB(Geolocation,        0),
       -        SETB(HideBackground,     0),
       -        SETB(Inspector,          0),
       -        SETB(Java,               1),
       -        SETB(JavaScript,         1),
       -        SETB(KioskMode,          0),
       -        SETB(LoadImages,         1),
       -        SETB(MediaManualPlay,    0),
       -        SETB(Plugins,            1),
       -        SETV(PreferredLanguages, ((char *[]){ NULL })),
       -        SETB(RunInFullscreen,    0),
       -        SETB(ScrollBars,         1),
       -        SETB(ShowIndicators,     1),
       -        SETB(SiteQuirks,         1),
       -        SETB(SmoothScrolling,    0),
       -        SETB(SpellChecking,      0),
       -        SETV(SpellLanguages,     ((char *[]){ "en_US", NULL })),
       -        SETB(StrictTLS,          1),
       -        SETB(Style,              1),
       -        SETF(ZoomLevel,          1.0),
       +        /*   parameter                  Arg value       force? */
       +        [AcceleratedCanvas]   =       { { .i = 1 },     },
       +        [AccessMicrophone]    =       { { .i = 0 },     },
       +        [AccessWebcam]        =       { { .i = 0 },     },
       +        [Certificate]         =       { { .i = 0 },     },
       +        [CaretBrowsing]       =       { { .i = 0 },     },
       +        [CookiePolicies]      =       { { .v = "@Aa" }, },
       +        [DefaultCharset]      =       { { .v = "UTF-8" }, },
       +        [DiskCache]           =       { { .i = 1 },     },
       +        [DNSPrefetch]         =       { { .i = 0 },     },
       +        [FileURLsCrossAccess] =       { { .i = 0 },     },
       +        [FontSize]            =       { { .i = 12 },    },
       +        [FrameFlattening]     =       { { .i = 0 },     },
       +        [Geolocation]         =       { { .i = 0 },     },
       +        [HideBackground]      =       { { .i = 0 },     },
       +        [Inspector]           =       { { .i = 0 },     },
       +        [Java]                =       { { .i = 1 },     },
       +        [JavaScript]          =       { { .i = 1 },     },
       +        [KioskMode]           =       { { .i = 0 },     },
       +        [LoadImages]          =       { { .i = 1 },     },
       +        [MediaManualPlay]     =       { { .i = 0 },     },
       +        [Plugins]             =       { { .i = 1 },     },
       +        [PreferredLanguages]  =       { { .v = (char *[]){ NULL } }, },
       +        [RunInFullscreen]     =       { { .i = 0 },     },
       +        [ScrollBars]          =       { { .i = 1 },     },
       +        [ShowIndicators]      =       { { .i = 1 },     },
       +        [SiteQuirks]          =       { { .i = 1 },     },
       +        [SmoothScrolling]     =       { { .i = 0 },     },
       +        [SpellChecking]       =       { { .i = 0 },     },
       +        [SpellLanguages]      =       { { .v = ((char *[]){ "en_US", NULL }) }, },
       +        [StrictTLS]           =       { { .i = 1 },     },
       +        [Style]               =       { { .i = 1 },     },
       +        [ZoomLevel]           =       { { .f = 1.0 },   },
        };
        
        static UriParameters uriparams[] = {
                { "(://|\\.)suckless\\.org(/|$)", {
       -          FSETB(JavaScript, 0),
       -          FSETB(Plugins,    0),
       +          [JavaScript] = { { .i = 0 }, 1 },
       +          [Plugins]    = { { .i = 0 }, 1 },
                }, },
        };
        
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -33,18 +33,6 @@
        
        #define LENGTH(x)               (sizeof(x) / sizeof(x[0]))
        #define CLEANMASK(mask)         (mask & (MODKEY|GDK_SHIFT_MASK))
       -#define SETB(p, s)              [p] = { { .b = s }, }
       -#define SETI(p, s)              [p] = { { .i = s }, }
       -#define SETV(p, s)              [p] = { { .v = s }, }
       -#define SETF(p, s)              [p] = { { .f = s }, }
       -#define FSETB(p, s)             [p] = { { .b = s }, 1 }
       -#define FSETI(p, s)             [p] = { { .i = s }, 1 }
       -#define FSETV(p, s)             [p] = { { .v = s }, 1 }
       -#define FSETF(p, s)             [p] = { { .f = s }, 1 }
       -#define CSETB(p, s)             [p] = (Parameter){ { .b = s }, 1 }
       -#define CSETI(p, s)             [p] = (Parameter){ { .i = s }, 1 }
       -#define CSETV(p, s)             [p] = (Parameter){ { .v = s }, 1 }
       -#define CSETF(p, s)             [p] = (Parameter){ { .f = s }, 1 }
        
        enum { AtomFind, AtomGo, AtomUri, AtomLast };
        
       t@@ -1925,13 +1913,16 @@ main(int argc, char *argv[])
                /* command line args */
                ARGBEGIN {
                case 'a':
       -                defconfig CSETV(CookiePolicies, EARGF(usage()));
       +                defconfig[CookiePolicies].val.v = EARGF(usage());
       +                defconfig[CookiePolicies].force = 1;
                        break;
                case 'b':
       -                defconfig CSETB(ScrollBars, 0);
       +                defconfig[ScrollBars].val.i = 0;
       +                defconfig[ScrollBars].force = 1;
                        break;
                case 'B':
       -                defconfig CSETB(ScrollBars, 1);
       +                defconfig[ScrollBars].val.i = 1;
       +                defconfig[ScrollBars].force = 1;
                        break;
                case 'c':
                        cookiefile = EARGF(usage());
       t@@ -1940,70 +1931,90 @@ main(int argc, char *argv[])
                        stylefile = EARGF(usage());
                        break;
                case 'd':
       -                defconfig CSETB(DiskCache, 0);
       +                defconfig[DiskCache].val.i = 0;
       +                defconfig[DiskCache].force = 1;
                        break;
                case 'D':
       -                defconfig CSETB(DiskCache, 1);
       +                defconfig[DiskCache].val.i = 1;
       +                defconfig[DiskCache].force = 1;
                        break;
                case 'e':
                        embed = strtol(EARGF(usage()), NULL, 0);
                        break;
                case 'f':
       -                defconfig CSETB(RunInFullscreen, 0);
       +                defconfig[RunInFullscreen].val.i = 0;
       +                defconfig[RunInFullscreen].force = 1;
                        break;
                case 'F':
       -                defconfig CSETB(RunInFullscreen, 1);
       +                defconfig[RunInFullscreen].val.i = 1;
       +                defconfig[RunInFullscreen].force = 1;
                        break;
                case 'g':
       -                defconfig CSETB(Geolocation, 0);
       +                defconfig[Geolocation].val.i = 0;
       +                defconfig[Geolocation].force = 1;
                        break;
                case 'G':
       -                defconfig CSETB(Geolocation, 1);
       +                defconfig[Geolocation].val.i = 1;
       +                defconfig[Geolocation].force = 1;
                        break;
                case 'i':
       -                defconfig CSETB(LoadImages, 0);
       +                defconfig[LoadImages].val.i = 0;
       +                defconfig[LoadImages].force = 1;
                        break;
                case 'I':
       -                defconfig CSETB(LoadImages, 1);
       +                defconfig[LoadImages].val.i = 1;
       +                defconfig[LoadImages].force = 1;
                        break;
                case 'k':
       -                defconfig CSETB(KioskMode, 0);
       +                defconfig[KioskMode].val.i = 0;
       +                defconfig[KioskMode].force = 1;
                        break;
                case 'K':
       -                defconfig CSETB(KioskMode, 1);
       +                defconfig[KioskMode].val.i = 1;
       +                defconfig[KioskMode].force = 1;
                        break;
                case 'm':
       -                defconfig CSETB(Style, 0);
       +                defconfig[Style].val.i = 0;
       +                defconfig[Style].force = 1;
                        break;
                case 'M':
       -                defconfig CSETB(Style, 1);
       +                defconfig[Style].val.i = 1;
       +                defconfig[Style].force = 1;
                        break;
                case 'n':
       -                defconfig CSETB(Inspector, 0);
       +                defconfig[Inspector].val.i = 0;
       +                defconfig[Inspector].force = 1;
                        break;
                case 'N':
       -                defconfig CSETB(Inspector, 1);
       +                defconfig[Inspector].val.i = 1;
       +                defconfig[Inspector].force = 1;
                        break;
                case 'p':
       -                defconfig CSETB(Plugins, 0);
       +                defconfig[Plugins].val.i = 0;
       +                defconfig[Plugins].force = 1;
                        break;
                case 'P':
       -                defconfig CSETB(Plugins, 1);
       +                defconfig[Plugins].val.i = 1;
       +                defconfig[Plugins].force = 1;
                        break;
                case 'r':
                        scriptfile = EARGF(usage());
                        break;
                case 's':
       -                defconfig CSETB(JavaScript, 0);
       +                defconfig[JavaScript].val.i = 0;
       +                defconfig[JavaScript].force = 1;
                        break;
                case 'S':
       -                defconfig CSETB(JavaScript, 1);
       +                defconfig[JavaScript].val.i = 1;
       +                defconfig[JavaScript].force = 1;
                        break;
                case 't':
       -                defconfig CSETB(StrictTLS, 0);
       +                defconfig[StrictTLS].val.i = 0;
       +                defconfig[StrictTLS].force = 1;
                        break;
                case 'T':
       -                defconfig CSETB(StrictTLS, 1);
       +                defconfig[StrictTLS].val.i = 1;
       +                defconfig[StrictTLS].force = 1;
                        break;
                case 'u':
                        fulluseragent = EARGF(usage());
       t@@ -2014,13 +2025,16 @@ main(int argc, char *argv[])
                        showxid = 1;
                        break;
                case 'x':
       -                defconfig CSETB(Certificate, 0);
       +                defconfig[Certificate].val.i = 0;
       +                defconfig[Certificate].force = 1;
                        break;
                case 'X':
       -                defconfig CSETB(Certificate, 1);
       +                defconfig[Certificate].val.i = 1;
       +                defconfig[Certificate].force = 1;
                        break;
                case 'z':
       -                defconfig CSETF(ZoomLevel, strtof(EARGF(usage()), NULL));
       +                defconfig[ZoomLevel].val.f = strtof(EARGF(usage()), NULL);
       +                defconfig[ZoomLevel].force = 1;
                        break;
                default:
                        usage();