Browse Source

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.
tags/v1.11.90
Pierre Ossman 3 years ago
parent
commit
38c6848b30

+ 4
- 4
unix/vncserver/vncserver.in View File

@@ -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);

+ 16
- 0
unix/xserver/hw/vnc/RFBGlue.cc View 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;

+ 1
- 0
unix/xserver/hw/vnc/RFBGlue.h View 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);

+ 14
- 0
unix/xserver/hw/vnc/xvnc.c View 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;

+ 20
- 0
vncviewer/vncviewer.cxx View 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;

Loading…
Cancel
Save