Use priority values instead of “forced” parameters
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index 06b7942..61448fb 100644 (file)
--- a/surf.c
+++ b/surf.c
 
 #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 };
 
@@ -103,7 +91,7 @@ typedef union {
 
 typedef struct {
        Arg val;
-       int force;
+       int prio;
 } Parameter;
 
 typedef struct Client {
@@ -384,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];
                }
        }
 }
@@ -705,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;
@@ -1925,13 +1911,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].prio = 2;
                break;
        case 'b':
-               defconfig CSETB(ScrollBars, 0);
+               defconfig[ScrollBars].val.i = 0;
+               defconfig[ScrollBars].prio = 2;
                break;
        case 'B':
-               defconfig CSETB(ScrollBars, 1);
+               defconfig[ScrollBars].val.i = 1;
+               defconfig[ScrollBars].prio = 2;
                break;
        case 'c':
                cookiefile = EARGF(usage());
@@ -1940,70 +1929,90 @@ main(int argc, char *argv[])
                stylefile = EARGF(usage());
                break;
        case 'd':
-               defconfig CSETB(DiskCache, 0);
+               defconfig[DiskCache].val.i = 0;
+               defconfig[DiskCache].prio = 2;
                break;
        case 'D':
-               defconfig CSETB(DiskCache, 1);
+               defconfig[DiskCache].val.i = 1;
+               defconfig[DiskCache].prio = 2;
                break;
        case 'e':
                embed = strtol(EARGF(usage()), NULL, 0);
                break;
        case 'f':
-               defconfig CSETB(RunInFullscreen, 0);
+               defconfig[RunInFullscreen].val.i = 0;
+               defconfig[RunInFullscreen].prio = 2;
                break;
        case 'F':
-               defconfig CSETB(RunInFullscreen, 1);
+               defconfig[RunInFullscreen].val.i = 1;
+               defconfig[RunInFullscreen].prio = 2;
                break;
        case 'g':
-               defconfig CSETB(Geolocation, 0);
+               defconfig[Geolocation].val.i = 0;
+               defconfig[Geolocation].prio = 2;
                break;
        case 'G':
-               defconfig CSETB(Geolocation, 1);
+               defconfig[Geolocation].val.i = 1;
+               defconfig[Geolocation].prio = 2;
                break;
        case 'i':
-               defconfig CSETB(LoadImages, 0);
+               defconfig[LoadImages].val.i = 0;
+               defconfig[LoadImages].prio = 2;
                break;
        case 'I':
-               defconfig CSETB(LoadImages, 1);
+               defconfig[LoadImages].val.i = 1;
+               defconfig[LoadImages].prio = 2;
                break;
        case 'k':
-               defconfig CSETB(KioskMode, 0);
+               defconfig[KioskMode].val.i = 0;
+               defconfig[KioskMode].prio = 2;
                break;
        case 'K':
-               defconfig CSETB(KioskMode, 1);
+               defconfig[KioskMode].val.i = 1;
+               defconfig[KioskMode].prio = 2;
                break;
        case 'm':
-               defconfig CSETB(Style, 0);
+               defconfig[Style].val.i = 0;
+               defconfig[Style].prio = 2;
                break;
        case 'M':
-               defconfig CSETB(Style, 1);
+               defconfig[Style].val.i = 1;
+               defconfig[Style].prio = 2;
                break;
        case 'n':
-               defconfig CSETB(Inspector, 0);
+               defconfig[Inspector].val.i = 0;
+               defconfig[Inspector].prio = 2;
                break;
        case 'N':
-               defconfig CSETB(Inspector, 1);
+               defconfig[Inspector].val.i = 1;
+               defconfig[Inspector].prio = 2;
                break;
        case 'p':
-               defconfig CSETB(Plugins, 0);
+               defconfig[Plugins].val.i = 0;
+               defconfig[Plugins].prio = 2;
                break;
        case 'P':
-               defconfig CSETB(Plugins, 1);
+               defconfig[Plugins].val.i = 1;
+               defconfig[Plugins].prio = 2;
                break;
        case 'r':
                scriptfile = EARGF(usage());
                break;
        case 's':
-               defconfig CSETB(JavaScript, 0);
+               defconfig[JavaScript].val.i = 0;
+               defconfig[JavaScript].prio = 2;
                break;
        case 'S':
-               defconfig CSETB(JavaScript, 1);
+               defconfig[JavaScript].val.i = 1;
+               defconfig[JavaScript].prio = 2;
                break;
        case 't':
-               defconfig CSETB(StrictTLS, 0);
+               defconfig[StrictTLS].val.i = 0;
+               defconfig[StrictTLS].prio = 2;
                break;
        case 'T':
-               defconfig CSETB(StrictTLS, 1);
+               defconfig[StrictTLS].val.i = 1;
+               defconfig[StrictTLS].prio = 2;
                break;
        case 'u':
                fulluseragent = EARGF(usage());
@@ -2014,13 +2023,16 @@ main(int argc, char *argv[])
                showxid = 1;
                break;
        case 'x':
-               defconfig CSETB(Certificate, 0);
+               defconfig[Certificate].val.i = 0;
+               defconfig[Certificate].prio = 2;
                break;
        case 'X':
-               defconfig CSETB(Certificate, 1);
+               defconfig[Certificate].val.i = 1;
+               defconfig[Certificate].prio = 2;
                break;
        case 'z':
-               defconfig CSETF(ZoomLevel, strtof(EARGF(usage()), NULL));
+               defconfig[ZoomLevel].val.f = strtof(EARGF(usage()), NULL);
+               defconfig[ZoomLevel].prio = 2;
                break;
        default:
                usage();