82b76239aa
2003-09-01 Glynn Foster <glynn.foster@sun.com> * src/gdialog.in: Add patch from Buchan Miln to fix the gdialog wrapper.
334 lines
8.5 KiB
Plaintext
Executable File
334 lines
8.5 KiB
Plaintext
Executable File
#!@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.
|
|
|
|
$command .= '"'.join('" "',@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;
|
|
$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;
|
|
$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;
|
|
$command .= "--question --text=\"$element\" ";
|
|
last ARG;
|
|
}
|
|
|
|
if ($element eq "--inputbox") {
|
|
$argn++;
|
|
get_arg;
|
|
$command .= "--entry --text=\"$element\" ";
|
|
|
|
# ignore size elements and maybe there is some
|
|
# default text to initialize the entry with?
|
|
|
|
$argn+=3;
|
|
get_arg;
|
|
$command .= "--entry-text=\"$element\" ";
|
|
last ARG;
|
|
}
|
|
|
|
if ($element eq "--textbox") {
|
|
$command .= "--text-info ";
|
|
|
|
# the arg immediately following the dialog type in
|
|
# gdialog is the filename, so pass this to zenity
|
|
|
|
$argn++;
|
|
get_arg;
|
|
$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;
|
|
$command .= "--height=\"$element\" ";
|
|
$argn++;
|
|
get_arg;
|
|
$element = $element * 8;
|
|
$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
|
|
|
|
$command .= "--list $list --column='' --column $element ";
|
|
|
|
# should output be line by line?
|
|
if ($separator) {
|
|
$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 += 5;
|
|
|
|
# Loop over the remainder of the commandline
|
|
# discarding the 'status' and 'tag' 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;
|
|
$command .= "NULL $element ";
|
|
$argn += 3;
|
|
}
|
|
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?
|
|
|
|
$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;
|
|
$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;
|
|
$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;
|
|
$command .= "$element ";
|
|
$argn += 1;
|
|
}
|
|
last ARG;
|
|
}
|
|
|
|
if ($element eq "--gauge") {
|
|
$argn++;
|
|
get_arg;
|
|
$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) {
|
|
$command .= "--percentage=$element ";
|
|
}
|
|
last ARG;
|
|
}
|
|
|
|
$argn++;
|
|
}
|
|
|
|
# execute the constructed zenity command line
|
|
$command .= " 2>&1";
|
|
|
|
# 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.
|
|
|
|
exit(system($command)/256);
|
|
|