287 lines
9.7 KiB
Plaintext
287 lines
9.7 KiB
Plaintext
|
# 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:
|