File fvwm-menu-desktop-config.fpl of Package fvwm2

# Uage: Module FvwmPerl -l fvwm-menu-desktop-config.fpl

# This script generates an FvwmForm similar to the FvwmForm-Desktop by
# Dan Espen but inserts the found xdg menus dynamically into the Form
# before processed.
# Author: Thomas Funk <t.funk@web.de>
# Version: 1.3

package MenuConfig;
use File::Basename;
use strict;
use warnings;

#open(MSG ,">>/tmp/log.txt") || die "Error $!";

my $modname = 'FvwmForm-Desktop-Config';
my $all = `fvwm-menu-desktop --get-menus all`;
my $selected = `fvwm-menu-desktop --get-menus desktop`;

my @all_filelist = split(/ /,$all);
my @selected_filelist = split(/ /,$selected);

my %all_menus = ();
my %selected__menus = ();
my $max_length = 0;
foreach my $path (@selected_filelist) {
    my ($filename, $directories, $suffix) = fileparse($path, qr/\.[^.]*/);
    push (@{$selected__menus{$directories}}, $filename);
}

my $i = 1;
foreach my $path (@all_filelist) {
    my $name = "MEN" . $i;
    # qr matched against the end of the $filename. 
    # The matching portion is removed and becomes the $suffix.
    my ($filename, $directories, $suffix) = fileparse($path, qr/\.[^.]*/);
    push (@{$all_menus{$directories}{$i}}, ($filename, $name, "off"));
    next if !defined $selected__menus{$directories};
    foreach my $hit (@{$selected__menus{$directories}}) {
	 if ($filename eq $hit) {
	     pop (@{$all_menus{$directories}{$i}});
	     push (@{$all_menus{$directories}{$i}}, "on");
	 }
    }
    $max_length = length($filename) if ($max_length < length($filename));
    $i++;
}

my $fvwmform_commands = "
DestroyModuleConfig  ${modname}: *
*${modname}: Title	\"\$[gt.Fvwm Menu Desktop Config]\"
*${modname}: WarpPointer
*${modname}: Line		center
*${modname}: Text	\"\$[gt.Fvwm Menu Desktop Config]\"
*${modname}: Line
*${modname}: Separator
*${modname}: Line		center
*${modname}: Text		\"\$[gt.Multiple Menu]\"
*${modname}: Line 		
";

if (scalar keys %all_menus != 0) {
	foreach my $key (sort( keys %all_menus)) {
		$fvwmform_commands .= "
			*${modname}: Line	left
			*${modname}: Text    	\"\$[gt.Menus in]\"
			*${modname}: Text    	\" $key\"
			*${modname}: Line    	left
			*${modname}: Selection meth multiple
		";
		my $m_count = 0;
		foreach my $count (sort(keys %{$all_menus{$key}})) {
			my @menu = @{$all_menus{$key}{$count}};
			my $newstring = $menu[0] . ' ' x eval($max_length-length($menu[0]));
			$fvwmform_commands .= "*${modname}: Choice  $menu[1] $menu[1] $menu[2] \"$newstring\"
			";
			$m_count++;
			if ($m_count == 3) {
				$fvwmform_commands .= "
					*${modname}: Line    	left
					*${modname}: Selection meth multiple
				";
				$m_count = 0;
			}
		}
		$fvwmform_commands .= "
			*${modname}: Line 	left
			*${modname}: Text 	\" \"
		";
	}
}
else {
	$fvwmform_commands .= "
		*${modname}: Line	center
		*${modname}: Text    \"\$[gt.No menus found! Check why from within a terminal with]\"
		*${modname}: Line	center
		*${modname}: Text    \"'fvwm-menu-desktop -v'\"
		*${modname}: Line 	left
		*${modname}: Text 	\" \"
	";
}

$fvwmform_commands .= "
*${modname}: Line
*${modname}: Separator
*${modname}: Line		center
*${modname}: Text         \"\$[gt.General Options]\"
*${modname}: Line
*${modname}: Line		Left
*${modname}: Text         \"\$[gt.Use Icons in Menus?       ]\"
*${modname}: Selection    SelItype single
*${modname}: Choice       IconsOn  IconsOn    on  \"\$[gt.Yes]\"
*${modname}: Choice       IconsOff IconsOff   off \"\$[gt.No]\"

*${modname}: Line 	left
*${modname}: Text 	\"\$[gt.Icon size:                ]\"
*${modname}: Input 	Size 2 \"\"
*${modname}: Text 	\"\$[gt. (in pixels. Default is 24)]\"

*${modname}: Line 	left
*${modname}: Text 	\"\$[gt.Converted Icon directory:      ]\"
*${modname}: Input 	IconDir 25 \"~/.fvwm/icons\"
*${modname}: Text 	\"\$[gt. (Directory for converted icons)]\"

*${modname}: Line		Left
*${modname}: Text         \"\$[gt.Use Titles in Menus?      ]\"
*${modname}: Selection    SelItype single
*${modname}: Choice       TitlesOn  TitlesOn    on  \"\$[gt.Yes]\"
*${modname}: Choice       TitlesOff TitlesOff   off \"\$[gt.No]\"

*${modname}: Line		Left
*${modname}: Text         \"\$[gt.Insert Menu(s) in a Menu? ]\"
*${modname}: Selection    SelItype single
*${modname}: Choice       InsertOn  InsertOn    off \"\$[gt.Yes]\"
*${modname}: Choice       InsertOff InsertOff   on  \"\$[gt.No]\"
*${modname}: Text 	\"\$[gt.Top title name: ]\"
*${modname}: Input 	InMenu 20 \"\"

*${modname}: Line 	left
*${modname}: Text 	\"\$[gt.Used Icon theme:          ]\"
*${modname}: Input 	Theme 20 \"\"
*${modname}: Text 	\"\$[gt. (Theme name for icon selection)]\"

*${modname}: Line 	left
*${modname}: Line
*${modname}: Line
*${modname}: Separator
*${modname}: Line 	center
*${modname}: Text   \"\$[gt.Single Menu]\"
*${modname}: Line		
*${modname}: Line	Left
*${modname}: Text   \"\$[gt.If you want a single menu only deselect all menus above and fill out]\"
*${modname}: Line	Left
*${modname}: Text   \"\$[gt.the fields below. But remember, if the menu doesn't exist, nothing happens.]\"

*${modname}: Line
*${modname}: Line 	left
*${modname}: Text 	\"\$[gt.Menu Top Title:]\"
*${modname}: Input 	Title 20 \"\"
*${modname}: Text 	\"\$[gt. (Eg. FvwmTestMenu)]\"

*${modname}: Line 	left
*${modname}: Text 	\"\$[gt.Install-Prefix:]\"
*${modname}: Input 	Installprefix 20 \"\"
*${modname}: Text 	\"\$[gt. (Eg. /etc/xdg/menus/)]\"

*${modname}: Line 	left
*${modname}: Text 	\"\$[gt.Desktop:       ]\"
*${modname}: Input 	Desktop 20 \"\"
*${modname}: Text 	\"\$[gt. (Eg. gnome, kde, xfce, lxde)]\"

*${modname}: Line 	left
*${modname}: Text 	\"\$[gt.Menutype:      ]\"
*${modname}: Input 	Menutype 20 \"\"
*${modname}: Text 	\"\$[gt. (Eg. applications, settings)]\"

*${modname}: Line 	left
*${modname}: Text 	\"\$[gt.Output path:   ]\"
*${modname}: Input 	Path 25 \"\$FVWM_USERDIR/.menu\"
*${modname}: Text 	\"\$[gt. (Full path to store output)]\"

*${modname}: Line 	left
*${modname}: Line
*${modname}: Line
*${modname}: Separator
*${modname}: Line 	center
*${modname}: Text         \"\$[gt.Actions]\"
*${modname}: Line 	left
*${modname}: Line
*${modname}: Line         center
*${modname}: Selection    SelItype single
*${modname}: Choice       MultiOn  MultiOn    on  \"\$[gt.Multiple]\"
*${modname}: Choice       MultiOff MultiOff   off \"\$[gt.Single]\"
*${modname}: Line
*${modname}: Separator
*${modname}: Line         expand
*${modname}: Button       continue \"\$[gt.Generate Menu(s)]\" 
*${modname}: Command      PipeRead 'fvwm-menu-desktop \\
\$(IconsOn\?--enable-mini-icons )\\
\$(Size\?-s \$(Size) )\\
\$(TitlesOn\?--with-titles )\\
\$(InsertOn\?--insert-in-menu \$(InMenu) )\\
\$(IconDir\?--mini-icon-dir \$(IconDir) )\\
\$(Title\?--title \$(Title) )\\
\$(Installprefix\?--install-prefix \$(Installprefix) )\\
\$(Desktop\?--desktop \$(Desktop) )\\
\$(Menutype\?--menutype \$(Menutype) )\\
\$(Theme\?--theme \$(Theme) )\\
\$(MultiOn\?--set-menus \"\\
";

foreach my $key (keys %all_menus) {
    foreach my $file (keys %{$all_menus{$key}}) {
	my @menu = @{$all_menus{$key}{$file}};
	$fvwmform_commands .= "\$($menu[1]\?$key$menu[0].menu )\\\n";
    }
}

$fvwmform_commands .= "\") \$(Path\? > \$(Path)) 2> ~/.xsession-errors &&  echo \"Read \$(Path\? \$(Path))\"'

*${modname}: Button       continue \"\$[gt.Save Settings]\"

# Before saving the data, remove any previously saved data:
*${modname}: Command DestroyModuleConfig ${modname}Default: *
*${modname}: Command !(                                      /bin/echo \\
  \"# This file last created by ${modname} on: `/bin/date`.\"; /bin/echo \\
";

foreach my $key (keys %all_menus) {
    foreach my $count (keys %{$all_menus{$key}}) {
        my @menu = @{$all_menus{$key}{$count}};
        $fvwmform_commands .= "  '*${modname}Default: $menu[1] 	\$($menu[1]\?on) '		; /bin/echo \\
	";
    }
}

$fvwmform_commands .= ") > \$FVWM_USERDIR/.${modname}

*${modname}: Command !(                                      /bin/echo \\
  '*${modname}Default: IconsOn 	\$(IconsOn\?on) '	; /bin/echo \\
  '*${modname}Default: IconsOff	\$(IconsOff\?on) '	; /bin/echo \\
  '*${modname}Default: Size       \$(Size) '		; /bin/echo \\
  '*${modname}Default: TitlesOn 	\$(TitlesOn\?on) '	; /bin/echo \\
  '*${modname}Default: TitlesOff 	\$(TitlesOff\?on) '	; /bin/echo \\
  '*${modname}Default: InsertOn 	\$(InsertOn\?on) '	; /bin/echo \\
  '*${modname}Default: InsertOff	\$(InsertOff\?on) '	; /bin/echo \\
  '*${modname}Default: InMenu   	\$(InMenu) '		; /bin/echo \\
  '*${modname}Default: Theme      \$(Theme) '		\\
) >> \$FVWM_USERDIR/.${modname}

*${modname}: Command !(                                      /bin/echo \\
  '*${modname}Default: Title   	\$(Title) '		; /bin/echo \\
  '*${modname}Default: Installprefix \$(Installprefix) '	; /bin/echo \\
  '*${modname}Default: Desktop	\$(Desktop) '		; /bin/echo \\
  '*${modname}Default: Menutype	\$(Menutype) '		; /bin/echo \\
  '*${modname}Default: Path      	\$(Path) '		; /bin/echo \\
  '*${modname}Default: IconDir      	\$(IconDir) '		; /bin/echo \\
  '*${modname}Default: MultiOn 	\$(MultiOn\?on) '	; /bin/echo \\
  '*${modname}Default: MultiOff	\$(MultiOff\?on) '	\\
) >> \$FVWM_USERDIR/.${modname}

*${modname}: Button       restart	\"\$[gt.Reset]\"
*${modname}: Command      Nop
*${modname}: Button       continue \"\$[gt.Help]\"        
*${modname}: Command      Exec exec xterm -g 100x50 -n \"Help fvwm-menu-desktop\" -T \"Help fvwm-menu-desktop\" -e \"man fvwm-menu-desktop\" &
*${modname}: Button       quit   	\"\$[gt.Quit]\"        
*${modname}: Command      Nop

# Tell ${modname} to read vars from .${modname}Default file:
*${modname}: UseData .${modname} *${modname}Default
";

# We are just asked to open a window, give fvwm a chance to do it
::unlock();

$fvwmform_commands =~ s/^\s+//;	# trim leading whitespace

::command(qq[
	$fvwmform_commands
	FvwmForm ${modname}
]);
#print MSG "$fvwmform_commands\n\n";
#close(MSG);
# Local Variables:
# mode: perl
# End: