#!@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 one column zenity --list
		# Use the 'text' arg as a second column header
		# FIXME: or should it be the dialog text, or both?
		
		$command .= "--list --column $element ";
			
		# Skip to the first 'item' arg of the list content
		# bypassing height, width and list-height
		# from here args run [tag] [item] ...

		$argn += 5; 
		
		# Loop over the remainder of the commandline
		# discarding the 'tag' args of each item 
		# and using the 'item' for display in our second column
		
		while ($argn < $args) {
			get_arg;
			$command .= "$element ";
			$argn += 2;
		}
		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);