Blame SOURCES/tigervnc-tolerate-specifying-boolparam.patch

4fc45e
From 38c6848b30cb1908171f2b4628e345fbf6727b39 Mon Sep 17 00:00:00 2001
4fc45e
From: Pierre Ossman <ossman@cendio.se>
4fc45e
Date: Fri, 18 Sep 2020 10:44:32 +0200
4fc45e
Subject: [PATCH] Tolerate specifying -BoolParam 0 and similar
4fc45e
4fc45e
This is needed by vncserver which doesn't know which parameters are
4fc45e
boolean, and it cannot use the -Param=Value form as that isn't tolerated
4fc45e
by the Xorg code.
4fc45e
---
4fc45e
 unix/vncserver/vncserver.in    |  8 ++++----
4fc45e
 unix/xserver/hw/vnc/RFBGlue.cc | 16 ++++++++++++++++
4fc45e
 unix/xserver/hw/vnc/RFBGlue.h  |  1 +
4fc45e
 unix/xserver/hw/vnc/xvnc.c     | 14 ++++++++++++++
4fc45e
 vncviewer/vncviewer.cxx        | 20 ++++++++++++++++++++
4fc45e
 5 files changed, 55 insertions(+), 4 deletions(-)
4fc45e
4fc45e
diff --git a/unix/vncserver/vncserver.in b/unix/vncserver/vncserver.in
4fc45e
index 25fbbd315..261b258f1 100755
4fc45e
--- a/unix/vncserver/vncserver.in
4fc45e
+++ b/unix/vncserver/vncserver.in
4fc45e
@@ -107,7 +107,7 @@ $default_opts{rfbwait} = 30000;
4fc45e
 $default_opts{rfbauth} = "$vncUserDir/passwd";
4fc45e
 $default_opts{rfbport} = $vncPort;
4fc45e
 $default_opts{fp} = $fontPath if ($fontPath);
4fc45e
-$default_opts{pn} = "";
4fc45e
+$default_opts{pn} = undef;
4fc45e
 
4fc45e
 # Load user-overrideable system defaults
4fc45e
 LoadConfig($vncSystemConfigDefaultsFile);
4fc45e
@@ -242,13 +242,13 @@ push(@cmd, "@CMAKE_INSTALL_FULL_BINDIR@/Xvnc", ":$displayNumber");
4fc45e
 
4fc45e
 foreach my $k (sort keys %config) {
4fc45e
   push(@cmd, "-$k");
4fc45e
-  push(@cmd, $config{$k}) if $config{$k};
4fc45e
+  push(@cmd, $config{$k}) if defined($config{$k});
4fc45e
   delete $default_opts{$k}; # file options take precedence
4fc45e
 }
4fc45e
 
4fc45e
 foreach my $k (sort keys %default_opts) {
4fc45e
   push(@cmd, "-$k");
4fc45e
-  push(@cmd, $default_opts{$k}) if $default_opts{$k};
4fc45e
+  push(@cmd, $default_opts{$k}) if defined($default_opts{$k});
4fc45e
 }
4fc45e
 
4fc45e
 warn "\nNew '$desktopName' desktop is $host:$displayNumber\n\n";
4fc45e
@@ -291,7 +291,7 @@ sub LoadConfig {
4fc45e
           # current config file being loaded defined the logical opposite setting
4fc45e
           # (NeverShared vs. AlwaysShared, etc etc).
4fc45e
           $toggle = lc($1); # must normalize key case
4fc45e
-          $config{$toggle} = $k;
4fc45e
+          $config{$toggle} = undef;
4fc45e
         }
4fc45e
       }
4fc45e
       close(IN);
4fc45e
diff --git a/unix/xserver/hw/vnc/RFBGlue.cc b/unix/xserver/hw/vnc/RFBGlue.cc
4fc45e
index f108fae43..7c32bea8f 100644
4fc45e
--- a/unix/xserver/hw/vnc/RFBGlue.cc
4fc45e
+++ b/unix/xserver/hw/vnc/RFBGlue.cc
4fc45e
@@ -143,6 +143,22 @@ const char* vncGetParamDesc(const char *name)
4fc45e
   return param->getDescription();
4fc45e
 }
4fc45e
 
4fc45e
+int vncIsParamBool(const char *name)
4fc45e
+{
4fc45e
+  VoidParameter *param;
4fc45e
+  BoolParameter *bparam;
4fc45e
+
4fc45e
+  param = rfb::Configuration::getParam(name);
4fc45e
+  if (param == NULL)
4fc45e
+    return false;
4fc45e
+
4fc45e
+  bparam = dynamic_cast<BoolParameter*>(param);
4fc45e
+  if (bparam == NULL)
4fc45e
+    return false;
4fc45e
+
4fc45e
+  return true;
4fc45e
+}
4fc45e
+
4fc45e
 int vncGetParamCount(void)
4fc45e
 {
4fc45e
   int count;
4fc45e
diff --git a/unix/xserver/hw/vnc/RFBGlue.h b/unix/xserver/hw/vnc/RFBGlue.h
4fc45e
index 112405b84..695cea105 100644
4fc45e
--- a/unix/xserver/hw/vnc/RFBGlue.h
4fc45e
+++ b/unix/xserver/hw/vnc/RFBGlue.h
4fc45e
@@ -41,6 +41,7 @@ int vncSetParam(const char *name, const char *value);
4fc45e
 int vncSetParamSimple(const char *nameAndValue);
4fc45e
 char* vncGetParam(const char *name);
4fc45e
 const char* vncGetParamDesc(const char *name);
4fc45e
+int vncIsParamBool(const char *name);
4fc45e
 
4fc45e
 int vncGetParamCount(void);
4fc45e
 char *vncGetParamList(void);
4fc45e
diff --git a/unix/xserver/hw/vnc/xvnc.c b/unix/xserver/hw/vnc/xvnc.c
4fc45e
index 4eb0b0b13..5744acac8 100644
4fc45e
--- a/unix/xserver/hw/vnc/xvnc.c
4fc45e
+++ b/unix/xserver/hw/vnc/xvnc.c
4fc45e
@@ -618,6 +618,20 @@ ddxProcessArgument(int argc, char *argv[], int i)
4fc45e
         exit(0);
4fc45e
     }
4fc45e
 
4fc45e
+    /* We need to resolve an ambiguity for booleans */
4fc45e
+    if (argv[i][0] == '-' && i+1 < argc &&
4fc45e
+        vncIsParamBool(&argv[i][1])) {
4fc45e
+        if ((strcasecmp(argv[i+1], "0") == 0) ||
4fc45e
+            (strcasecmp(argv[i+1], "1") == 0) ||
4fc45e
+            (strcasecmp(argv[i+1], "true") == 0) ||
4fc45e
+            (strcasecmp(argv[i+1], "false") == 0) ||
4fc45e
+            (strcasecmp(argv[i+1], "yes") == 0) ||
4fc45e
+            (strcasecmp(argv[i+1], "no") == 0)) {
4fc45e
+            vncSetParam(&argv[i][1], argv[i+1]);
4fc45e
+            return 2;
4fc45e
+        }
4fc45e
+    }
4fc45e
+
4fc45e
     if (vncSetParamSimple(argv[i]))
4fc45e
 	return 1;
4fc45e
     
4fc45e
diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx
4fc45e
index d4dd3063c..77ba3d3f4 100644
4fc45e
--- a/vncviewer/vncviewer.cxx
4fc45e
+++ b/vncviewer/vncviewer.cxx
4fc45e
@@ -556,6 +556,26 @@ int main(int argc, char** argv)
4fc45e
   }
4fc45e
 
4fc45e
   for (int i = 1; i < argc;) {
4fc45e
+    /* We need to resolve an ambiguity for booleans */
4fc45e
+    if (argv[i][0] == '-' && i+1 < argc) {
4fc45e
+        VoidParameter *param;
4fc45e
+
4fc45e
+        param = Configuration::getParam(&argv[i][1]);
4fc45e
+        if ((param != NULL) &&
4fc45e
+            (dynamic_cast<BoolParameter*>(param) != NULL)) {
4fc45e
+          if ((strcasecmp(argv[i+1], "0") == 0) ||
4fc45e
+              (strcasecmp(argv[i+1], "1") == 0) ||
4fc45e
+              (strcasecmp(argv[i+1], "true") == 0) ||
4fc45e
+              (strcasecmp(argv[i+1], "false") == 0) ||
4fc45e
+              (strcasecmp(argv[i+1], "yes") == 0) ||
4fc45e
+              (strcasecmp(argv[i+1], "no") == 0)) {
4fc45e
+              param->setParam(argv[i+1]);
4fc45e
+              i += 2;
4fc45e
+              continue;
4fc45e
+          }
4fc45e
+      }
4fc45e
+    }
4fc45e
+
4fc45e
     if (Configuration::setParam(argv[i])) {
4fc45e
       i++;
4fc45e
       continue;