/usr/bin/gdialog is in zenity 3.22.0-1+b1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 | #!/usr/bin/perl
# gdialog -> zenity conversion wrapper
#
# by Mike Newman <mikegtn@gnome.org>
#
# This is all, of course, horrible - but it should translate
# most commond gdialog types to zenity equivalents. It will mostly drop
# the pointless and unused (even by gdialog!) size arguments
# but hopefully will translate all the others.
#
# For testing purposes, I've used a couple of the nautilus scripts
# available at http://g-scripts.sourceforge.net - what is sometimes
# unclear is what is a gdialog/zenity translation problem, and what is
# a problem with the original script
my @command = ("zenity"); # the command line we build up to execute
my $element = ""; # current bit of command line
my $argn = 0; # counter for walking args
my $args = $#ARGV + 1; # total number of command line arguments
my $separator = 0; # set if --separate-output is in use
# Additon by: Kevin C. Krinke (kck) <kckrinke@opendoorsoftware.com>
#
# gdialog itself supports both the X-Windows interface as well as a console
# interface. Here's a fix to use regular dialog when appropriate.
# This should probably be a more advanced test of some sort, but I don't know
# of any other easy way of detecting and X-Windows environment. If someone does
# know better, please let me know. So for now this works: "no DISPLAY; no X".
unless (defined $ENV{'DISPLAY'} && length($ENV{'DISPLAY'})) {
# reset the command string
@command = ();
# examine all the available/default paths
my $PATHS = ($ENV{'PATH'}||'/bin:/usr/bin:/usr/local/bin:/opt/bin');
BIN: foreach my $PATH (split(/\:/,$PATHS)) {
if (-x $PATH."/gdialog.real") {
# Some GNU/Linux distributions divert binaries when
# other packages are installed. If this exists, chances
# are it's the real gdialog and not the Zenity wrapper.
# gdialog has full support for the Console medium and
# as such is the preference over using the "regular"
# dialog interface.
@command = ($PATH."/gdialog.real");
last BIN;
} elsif (-x $PATH."/dialog") {
# change the command and skip ahead!
@command = ($PATH."/dialog");
last BIN;
}
}
unless (@command) {
# we didn't find the dialog binary, exit(254) with a message
# to STDERR.
print STDERR "missing DISPLAY and a console dialog could".
" not be found.\n";
# exit code 254 is used because 255, 1, 2, 3 are used by Zenity
# and cDialog. This error, is a very _bad_ error so it's semi-
# non-standard at 254.
exit(254);
}
# all is well if we've made it this far
# so join the arguments double-quoting things so that proper shell
# notation is saved.
push @command, @ARGV;
# and fork the process
exec(@command);
}
# Got DISPLAY, has X continue as normal...
# End Addtition by: KCK
# this just loads the current arg into $element
sub get_arg () {
$element = $ARGV[$argn];
}
# walk the command line
ARG: while ($argn < $args) {
get_arg;
# Informational stuff
if ($element eq "--help" || $element eq "--about") {
print ( "gdialog is a compatibility wrapper around zenity, " .
"provided to hopefully\nallow older scripts to run. " .
"If you are reading this message, you should\n" .
"probably be using zenity directly\n\n" .
"type: 'zenity --help' or 'man zenity' for more information\n");
exit (1);
}
# Section 1 : Args which gdialog expects BEFORE box options
# --clear, --backtitle have no obvious effect - ignored
if ($element eq "--title") {
# --title argument is almost analogous in gdialog and
# zenity - so pass it almost entirely as is
$argn++;
get_arg;
push @command, "--title=$element";
# keep processing args
$argn++;
next ARG;
}
if ($element eq "--separate-output") {
# set the flag to pring list output line by line
$separator = 1;
# keep processing args
$argn++;
next ARG;
}
# Section 2 : Box Options and subsequent args
if ($element eq "--msgbox" || $element eq "--infobox") {
# This bit is common to almost all of the dialogs
# the arg following the dialog type in gdialog is usually
# equivalent to zenity's --text arg.
$argn++;
get_arg;
push @command, "--info", "--text=$element";
# this also happens a lot - gdialog accepted size args
# for dialog compatability - which it pretty much ignored
# and we will do the same
$argn+=2;
last ARG;
}
if ($element eq "--yesno") {
# this will silently ignore the gdialog option to set
# the default button in question dialogs - which is
# highly hig-norant anyway!
$argn++;
get_arg;
push @command, "--question", "--text=$element";
last ARG;
}
if ($element eq "--inputbox") {
$argn++;
get_arg;
push @command, "--entry", "--text=$element";
# ignore size elements and maybe there is some
# default text to initialize the entry with?
$argn+=3;
get_arg;
push @command, "--entry-text=$element";
last ARG;
}
if ($element eq "--textbox") {
push @command, "--text-info";
# the arg immediately following the dialog type in
# gdialog is the filename, so pass this to zenity
$argn++;
get_arg;
push @command, "--filename=$element";
# width and height matter for this one, so get them
# and apply the same multipliers as used in gdialog
$argn++;
get_arg;
$element = $element * 7;
push @command, "--height=$element";
$argn++;
get_arg;
$element = $element * 8;
push @command, "--width=$element";
last ARG;
}
if ($element eq "--checklist" || $element eq "--radiolist") {
$list=$element;
$argn++;
get_arg;
# Conveniently, zenity and gdialog use the same names
# for list types, so pass this to zenity intact along with
# an untitled column for the check or radio buttons
# and the 'text' arg as a second column header
push @command, "--list", $list, "--column=''", "--column=''", "--column", $element;
# should output be line by line?
if ($separator) {
push @command, "--separator=\n";
}
# Skip to the first 'item' arg of the list content
# bypassing height, width and list-height
# from here args run [tag] [item] [status] ...
$argn += 4;
# Loop over the remainder of the commandline
# discarding the 'status' args of each item
# and using the 'item' for display in our second column
# also pass a fake NULL argument since zenity can't set
# the status of a row like gdialog can
while ($argn < $args) {
get_arg;
push @command, "NULL", $element;
$argn += 1;
get_arg;
push @command, $element;
$argn += 2;
}
last ARG;
}
if ($element eq "--menu") {
$list=$element;
$argn++;
get_arg;
# a gdialog --menu is just a two column zenity --list
# Leave the first column blank (not provided)
# Use the 'text' arg as a second column header
# FIXME: or should it be the dialog text, or both?
push @command, "--list", "--column", "", "--column", $element;
# Skip to the first 'item' arg of the list content
# after using height, width and bypassing list-height
# from here args run [tag] [item] ...
$argn += 1;
get_arg;
# Height and width in characters to be displayed, so adjust
# cdialog uses 6 height for non-list, zenity uses ~24 pixels
# per list entry (default font), and 103 pixels for non-list
# This appears to be almost exact
$element = $element*24 - 35;
push @command, "--height", $element;
$argn += 1;
get_arg;
# cdialog uses 6 width for non-list, zenity uses ~7 pixels
# per character (default font), and 22 pixels for non-list
# This is not exact, but close enough
$element = $element*7 - 20;
push @command, "--width", $element;
$argn += 2;
# Loop over the remainder of the commandline
# keeping 'tag' args of each item (required to return)
# and using the 'item' for display in our second column
while ($argn < $args) {
get_arg;
push @command, $element;
$argn += 1;
}
last ARG;
}
if ($element eq "--gauge") {
$argn++;
get_arg;
push @command, "--progress", "--text=$element";
# discard the size args as usually, and see if
# a percentage value was supplied to initialize the
# dialog
$argn += 3;
get_arg;
if ($element) {
push @command, "--percentage=$element";
}
last ARG;
}
$argn++;
}
# save STDOUT and STDERR
open(ORG_STDOUT, ">&STDOUT");
open(ORG_STDERR, ">&STDERR");
# redirect STDERR to /dev/null (GTK messages ie:
# (zenity:637): Gtk-WARNING **: Unable to locate theme engine in module_path: "mist",)
open(STDERR, ">/dev/null");
# redirect STDOUT to STDERR (gdialog direct output to STDERR by default)
open(STDOUT, ">&ORG_STDERR");
# execute the constructed zenity command line
# perl doc: The return value of system() is the exit status of the
#program as returned by the wait() call. To get the actual exit value
# divide by 256.
my $return = system(@command)/256;
# restore STDOUT and STDERR
open(STDOUT, ">&ORG_STDOUT");
open(STDERR, ">&ORG_STDERR");
close(ORG_STDOUT);
close(ORG_STDERR);
exit $return;
|