]> source.dussan.org Git - tigervnc.git/commitdiff
Tolerate specifying -BoolParam 0 and similar
authorPierre Ossman <ossman@cendio.se>
Fri, 18 Sep 2020 08:44:32 +0000 (10:44 +0200)
committerPierre Ossman <ossman@cendio.se>
Fri, 18 Sep 2020 08:44:32 +0000 (10:44 +0200)
This is needed by vncserver which doesn't know which parameters are
boolean, and it cannot use the -Param=Value form as that isn't tolerated
by the Xorg code.

unix/vncserver/vncserver.in
unix/xserver/hw/vnc/RFBGlue.cc
unix/xserver/hw/vnc/RFBGlue.h
unix/xserver/hw/vnc/xvnc.c
vncviewer/vncviewer.cxx

index 25fbbd315cdfe23da597ecf3d9b3e03a62e173e4..261b258f10069b3942fff63b705d1cb3685d2c84 100755 (executable)
@@ -107,7 +107,7 @@ $default_opts{rfbwait} = 30000;
 $default_opts{rfbauth} = "$vncUserDir/passwd";
 $default_opts{rfbport} = $vncPort;
 $default_opts{fp} = $fontPath if ($fontPath);
-$default_opts{pn} = "";
+$default_opts{pn} = undef;
 
 # Load user-overrideable system defaults
 LoadConfig($vncSystemConfigDefaultsFile);
@@ -242,13 +242,13 @@ push(@cmd, "@CMAKE_INSTALL_FULL_BINDIR@/Xvnc", ":$displayNumber");
 
 foreach my $k (sort keys %config) {
   push(@cmd, "-$k");
-  push(@cmd, $config{$k}) if $config{$k};
+  push(@cmd, $config{$k}) if defined($config{$k});
   delete $default_opts{$k}; # file options take precedence
 }
 
 foreach my $k (sort keys %default_opts) {
   push(@cmd, "-$k");
-  push(@cmd, $default_opts{$k}) if $default_opts{$k};
+  push(@cmd, $default_opts{$k}) if defined($default_opts{$k});
 }
 
 warn "\nNew '$desktopName' desktop is $host:$displayNumber\n\n";
@@ -291,7 +291,7 @@ sub LoadConfig {
           # current config file being loaded defined the logical opposite setting
           # (NeverShared vs. AlwaysShared, etc etc).
           $toggle = lc($1); # must normalize key case
-          $config{$toggle} = $k;
+          $config{$toggle} = undef;
         }
       }
       close(IN);
index f108fae4353a8576548163ca347c2a97138d4501..7c32bea8f20b5b2f2e1a1289a09e5c11c8b173a0 100644 (file)
@@ -143,6 +143,22 @@ const char* vncGetParamDesc(const char *name)
   return param->getDescription();
 }
 
+int vncIsParamBool(const char *name)
+{
+  VoidParameter *param;
+  BoolParameter *bparam;
+
+  param = rfb::Configuration::getParam(name);
+  if (param == NULL)
+    return false;
+
+  bparam = dynamic_cast<BoolParameter*>(param);
+  if (bparam == NULL)
+    return false;
+
+  return true;
+}
+
 int vncGetParamCount(void)
 {
   int count;
index 112405b8479352aaea2af13838e8580aea90c173..695cea10502034659f1320d303b84f5eadec1227 100644 (file)
@@ -41,6 +41,7 @@ int vncSetParam(const char *name, const char *value);
 int vncSetParamSimple(const char *nameAndValue);
 char* vncGetParam(const char *name);
 const char* vncGetParamDesc(const char *name);
+int vncIsParamBool(const char *name);
 
 int vncGetParamCount(void);
 char *vncGetParamList(void);
index 4eb0b0b131f2f320204bec3ba49c25e625782dba..5744acac8ba315e3cf52b18c36f5e809ce22b905 100644 (file)
@@ -618,6 +618,20 @@ ddxProcessArgument(int argc, char *argv[], int i)
         exit(0);
     }
 
+    /* We need to resolve an ambiguity for booleans */
+    if (argv[i][0] == '-' && i+1 < argc &&
+        vncIsParamBool(&argv[i][1])) {
+        if ((strcasecmp(argv[i+1], "0") == 0) ||
+            (strcasecmp(argv[i+1], "1") == 0) ||
+            (strcasecmp(argv[i+1], "true") == 0) ||
+            (strcasecmp(argv[i+1], "false") == 0) ||
+            (strcasecmp(argv[i+1], "yes") == 0) ||
+            (strcasecmp(argv[i+1], "no") == 0)) {
+            vncSetParam(&argv[i][1], argv[i+1]);
+            return 2;
+        }
+    }
+
     if (vncSetParamSimple(argv[i]))
        return 1;
     
index d4dd3063cb55861b59bd4be586437903986c1a59..77ba3d3f42cc1a870dfc8c043fc84a45e3b45ce7 100644 (file)
@@ -556,6 +556,26 @@ int main(int argc, char** argv)
   }
 
   for (int i = 1; i < argc;) {
+    /* We need to resolve an ambiguity for booleans */
+    if (argv[i][0] == '-' && i+1 < argc) {
+        VoidParameter *param;
+
+        param = Configuration::getParam(&argv[i][1]);
+        if ((param != NULL) &&
+            (dynamic_cast<BoolParameter*>(param) != NULL)) {
+          if ((strcasecmp(argv[i+1], "0") == 0) ||
+              (strcasecmp(argv[i+1], "1") == 0) ||
+              (strcasecmp(argv[i+1], "true") == 0) ||
+              (strcasecmp(argv[i+1], "false") == 0) ||
+              (strcasecmp(argv[i+1], "yes") == 0) ||
+              (strcasecmp(argv[i+1], "no") == 0)) {
+              param->setParam(argv[i+1]);
+              i += 2;
+              continue;
+          }
+      }
+    }
+
     if (Configuration::setParam(argv[i])) {
       i++;
       continue;