You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
5.0 KiB
149 lines
5.0 KiB
From 38c6848b30cb1908171f2b4628e345fbf6727b39 Mon Sep 17 00:00:00 2001 |
|
From: Pierre Ossman <ossman@cendio.se> |
|
Date: Fri, 18 Sep 2020 10:44:32 +0200 |
|
Subject: [PATCH] Tolerate specifying -BoolParam 0 and similar |
|
|
|
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 | 8 ++++---- |
|
unix/xserver/hw/vnc/RFBGlue.cc | 16 ++++++++++++++++ |
|
unix/xserver/hw/vnc/RFBGlue.h | 1 + |
|
unix/xserver/hw/vnc/xvnc.c | 14 ++++++++++++++ |
|
vncviewer/vncviewer.cxx | 20 ++++++++++++++++++++ |
|
5 files changed, 55 insertions(+), 4 deletions(-) |
|
|
|
diff --git a/unix/vncserver/vncserver.in b/unix/vncserver/vncserver.in |
|
index 25fbbd315..261b258f1 100755 |
|
--- a/unix/vncserver/vncserver.in |
|
+++ b/unix/vncserver/vncserver.in |
|
@@ -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); |
|
diff --git a/unix/xserver/hw/vnc/RFBGlue.cc b/unix/xserver/hw/vnc/RFBGlue.cc |
|
index f108fae43..7c32bea8f 100644 |
|
--- a/unix/xserver/hw/vnc/RFBGlue.cc |
|
+++ b/unix/xserver/hw/vnc/RFBGlue.cc |
|
@@ -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; |
|
diff --git a/unix/xserver/hw/vnc/RFBGlue.h b/unix/xserver/hw/vnc/RFBGlue.h |
|
index 112405b84..695cea105 100644 |
|
--- a/unix/xserver/hw/vnc/RFBGlue.h |
|
+++ b/unix/xserver/hw/vnc/RFBGlue.h |
|
@@ -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); |
|
diff --git a/unix/xserver/hw/vnc/xvnc.c b/unix/xserver/hw/vnc/xvnc.c |
|
index 4eb0b0b13..5744acac8 100644 |
|
--- a/unix/xserver/hw/vnc/xvnc.c |
|
+++ b/unix/xserver/hw/vnc/xvnc.c |
|
@@ -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; |
|
|
|
diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx |
|
index d4dd3063c..77ba3d3f4 100644 |
|
--- a/vncviewer/vncviewer.cxx |
|
+++ b/vncviewer/vncviewer.cxx |
|
@@ -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;
|
|
|