tUse priority values instead of “forced” parameters - 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 a8bf2068276e27dcbd2919cb72d926b9f4f3882e
 (DIR) parent a0ef4ba41d3e43618607f9cf1d14e83ee475f624
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Sun, 21 May 2017 13:41:56 +0200
       
       Use priority values instead of “forced” parameters
       
       This makes parameter handling a bit easier and lets the user override
       parameters as he sees fit.
       
       Diffstat:
         M config.def.h                        |       7 ++++++-
         M surf.c                              |      88 +++++++++++++++----------------
       
       2 files changed, 49 insertions(+), 46 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -8,8 +8,13 @@ static char *cachedir       = "~/.surf/cache/";
        static char *cookiefile     = "~/.surf/cookies.txt";
        
        /* Webkit default features */
       +/* Highest priority value will be used.
       + * Default parameters are priority 0
       + * Per-uri parameters are priority 1
       + * Command parameters are priority 2
       + */
        static Parameter defconfig[ParameterLast] = {
       -        /*   parameter                  Arg value       force? */
       +        /* parameter                    Arg value       priority */
                [AcceleratedCanvas]   =       { { .i = 1 },     },
                [AccessMicrophone]    =       { { .i = 0 },     },
                [AccessWebcam]        =       { { .i = 0 },     },
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -91,7 +91,7 @@ typedef union {
        
        typedef struct {
                Arg val;
       -        int force;
       +        int prio;
        } Parameter;
        
        typedef struct Client {
       t@@ -372,19 +372,18 @@ setup(void)
                }
        
                for (i = 0; i < LENGTH(uriparams); ++i) {
       -                if (!regcomp(&(uriparams[i].re), uriparams[i].uri,
       +                if (regcomp(&(uriparams[i].re), uriparams[i].uri,
                            REG_EXTENDED)) {
       -                        /* copy default parameters if they are not already set
       -                         * or if they are forced */
       -                        for (j = 0; j < ParameterLast; ++j) {
       -                                if (!uriparams[i].config[j].force ||
       -                                    defconfig[j].force)
       -                                        uriparams[i].config[j] = defconfig[j];
       -                        }
       -                } else {
                                fprintf(stderr, "Could not compile regex: %s\n",
                                        uriparams[i].uri);
                                uriparams[i].uri = NULL;
       +                        continue;
       +                }
       +
       +                /* copy default parameters with higher priority */
       +                for (j = 0; j < ParameterLast; ++j) {
       +                        if (defconfig[j].prio >= uriparams[i].config[j].prio)
       +                                uriparams[i].config[j] = defconfig[j];
                        }
                }
        }
       t@@ -693,20 +692,19 @@ seturiparameters(Client *c, const char *uri, ParamName *params)
                        case Certificate:
                        case CookiePolicies:
                        case Style:
       -                        config = defconfig[p].force ? defconfig :
       -                                 newconfig[p].force ? newconfig :
       -                                 defconfig;
       +                        config = (newconfig[p].prio > defconfig[p].prio) ?
       +                                 newconfig : defconfig;
                                break;
                        default:
       -                        if (defconfig[p].force)
       +                        if (newconfig[p].prio > defconfig[p].prio)
       +                                config = newconfig;
       +                        else if (curconfig[p].prio > defconfig[p].prio)
       +                                config = defconfig;
       +                        else
                                        continue;
       -                        config = newconfig[p].force ? newconfig :
       -                                 curconfig[p].force ? defconfig :
       -                                 NULL;
                        }
        
       -                if (config)
       -                        setparameter(c, 0, p, &config[p].val);
       +                setparameter(c, 0, p, &config[p].val);
                }
        
                curconfig = newconfig;
       t@@ -1914,15 +1912,15 @@ main(int argc, char *argv[])
                ARGBEGIN {
                case 'a':
                        defconfig[CookiePolicies].val.v = EARGF(usage());
       -                defconfig[CookiePolicies].force = 1;
       +                defconfig[CookiePolicies].prio = 2;
                        break;
                case 'b':
                        defconfig[ScrollBars].val.i = 0;
       -                defconfig[ScrollBars].force = 1;
       +                defconfig[ScrollBars].prio = 2;
                        break;
                case 'B':
                        defconfig[ScrollBars].val.i = 1;
       -                defconfig[ScrollBars].force = 1;
       +                defconfig[ScrollBars].prio = 2;
                        break;
                case 'c':
                        cookiefile = EARGF(usage());
       t@@ -1932,89 +1930,89 @@ main(int argc, char *argv[])
                        break;
                case 'd':
                        defconfig[DiskCache].val.i = 0;
       -                defconfig[DiskCache].force = 1;
       +                defconfig[DiskCache].prio = 2;
                        break;
                case 'D':
                        defconfig[DiskCache].val.i = 1;
       -                defconfig[DiskCache].force = 1;
       +                defconfig[DiskCache].prio = 2;
                        break;
                case 'e':
                        embed = strtol(EARGF(usage()), NULL, 0);
                        break;
                case 'f':
                        defconfig[RunInFullscreen].val.i = 0;
       -                defconfig[RunInFullscreen].force = 1;
       +                defconfig[RunInFullscreen].prio = 2;
                        break;
                case 'F':
                        defconfig[RunInFullscreen].val.i = 1;
       -                defconfig[RunInFullscreen].force = 1;
       +                defconfig[RunInFullscreen].prio = 2;
                        break;
                case 'g':
                        defconfig[Geolocation].val.i = 0;
       -                defconfig[Geolocation].force = 1;
       +                defconfig[Geolocation].prio = 2;
                        break;
                case 'G':
                        defconfig[Geolocation].val.i = 1;
       -                defconfig[Geolocation].force = 1;
       +                defconfig[Geolocation].prio = 2;
                        break;
                case 'i':
                        defconfig[LoadImages].val.i = 0;
       -                defconfig[LoadImages].force = 1;
       +                defconfig[LoadImages].prio = 2;
                        break;
                case 'I':
                        defconfig[LoadImages].val.i = 1;
       -                defconfig[LoadImages].force = 1;
       +                defconfig[LoadImages].prio = 2;
                        break;
                case 'k':
                        defconfig[KioskMode].val.i = 0;
       -                defconfig[KioskMode].force = 1;
       +                defconfig[KioskMode].prio = 2;
                        break;
                case 'K':
                        defconfig[KioskMode].val.i = 1;
       -                defconfig[KioskMode].force = 1;
       +                defconfig[KioskMode].prio = 2;
                        break;
                case 'm':
                        defconfig[Style].val.i = 0;
       -                defconfig[Style].force = 1;
       +                defconfig[Style].prio = 2;
                        break;
                case 'M':
                        defconfig[Style].val.i = 1;
       -                defconfig[Style].force = 1;
       +                defconfig[Style].prio = 2;
                        break;
                case 'n':
                        defconfig[Inspector].val.i = 0;
       -                defconfig[Inspector].force = 1;
       +                defconfig[Inspector].prio = 2;
                        break;
                case 'N':
                        defconfig[Inspector].val.i = 1;
       -                defconfig[Inspector].force = 1;
       +                defconfig[Inspector].prio = 2;
                        break;
                case 'p':
                        defconfig[Plugins].val.i = 0;
       -                defconfig[Plugins].force = 1;
       +                defconfig[Plugins].prio = 2;
                        break;
                case 'P':
                        defconfig[Plugins].val.i = 1;
       -                defconfig[Plugins].force = 1;
       +                defconfig[Plugins].prio = 2;
                        break;
                case 'r':
                        scriptfile = EARGF(usage());
                        break;
                case 's':
                        defconfig[JavaScript].val.i = 0;
       -                defconfig[JavaScript].force = 1;
       +                defconfig[JavaScript].prio = 2;
                        break;
                case 'S':
                        defconfig[JavaScript].val.i = 1;
       -                defconfig[JavaScript].force = 1;
       +                defconfig[JavaScript].prio = 2;
                        break;
                case 't':
                        defconfig[StrictTLS].val.i = 0;
       -                defconfig[StrictTLS].force = 1;
       +                defconfig[StrictTLS].prio = 2;
                        break;
                case 'T':
                        defconfig[StrictTLS].val.i = 1;
       -                defconfig[StrictTLS].force = 1;
       +                defconfig[StrictTLS].prio = 2;
                        break;
                case 'u':
                        fulluseragent = EARGF(usage());
       t@@ -2026,15 +2024,15 @@ main(int argc, char *argv[])
                        break;
                case 'x':
                        defconfig[Certificate].val.i = 0;
       -                defconfig[Certificate].force = 1;
       +                defconfig[Certificate].prio = 2;
                        break;
                case 'X':
                        defconfig[Certificate].val.i = 1;
       -                defconfig[Certificate].force = 1;
       +                defconfig[Certificate].prio = 2;
                        break;
                case 'z':
                        defconfig[ZoomLevel].val.f = strtof(EARGF(usage()), NULL);
       -                defconfig[ZoomLevel].force = 1;
       +                defconfig[ZoomLevel].prio = 2;
                        break;
                default:
                        usage();