diff options
Diffstat (limited to 'src/gdialog')
-rw-r--r-- | src/gdialog | 353 |
1 files changed, 353 insertions, 0 deletions
diff --git a/src/gdialog b/src/gdialog new file mode 100644 index 00000000..4e2da777 --- /dev/null +++ b/src/gdialog @@ -0,0 +1,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; |