Author: sparky                       Date: Mon Oct 31 02:39:03 2005 GMT
Module: vfmg                          Tag: DEVEL
---- Log message:
- total breakage started (: what i've done is to put every information
  from desktop and directory files in %desktop hash list so everything
  can be computed using ASCII, and new items from desktop files can be
  added easyly
- probably a little slower, but still faster than HEAD version
- for now only enlightemnent, openbox, fbpanel done

---- Files affected:
vfmg:
   vfmg (1.73.2.8 -> 1.73.2.9) 

---- Diffs:

================================================================
Index: vfmg/vfmg
diff -u vfmg/vfmg:1.73.2.8 vfmg/vfmg:1.73.2.9
--- vfmg/vfmg:1.73.2.8  Sun Oct 30 21:25:05 2005
+++ vfmg/vfmg   Mon Oct 31 03:38:58 2005
@@ -135,6 +135,7 @@
 
 my @apps;      # $apps{name}{category}=[icon,exec]
 my @happs;
+my %desktop;
 find(\&wanted, grep -d, map {"$_/applications"} @xdg_data_dirs);
 
 sub wanted { # {{{
@@ -253,10 +254,13 @@
        warn "Unknown Exec parameter variable: $1 in $File::Find::name, 
removing\n"
          if ($tags{Exec} =~ s/(%[^%\s])//);
        $tags{Exec} =~ s/%%/%/g;
-       push @happs, [$utfname, $tags{Icon}, $tags{Exec}];
+       push @happs, $File::Find::name;
 
        $apps[$#happs]{$_} = 1    # two apps can have same names now:)
          foreach grep length, split /;+/, $tags{Categories};
+
+       $file =~ s/\.desktop$//;
+       $desktop{$File::Find::name} = [ $file, $utfname, $tags{Icon}, 
$tags{Exec} ];
 } # }}}
 
 # read XDG menu specification
@@ -291,9 +295,9 @@
 my $trigger=0;
 my $tag;
 my $name;
+my $dirfile;
 my $dir;
 my $icon_dir;
-my @directory; # $directory[level]=[name,icon]
 my $include;
 my $tmpapps;
 my @menustack;
@@ -421,7 +425,7 @@
        if(($tag eq 'category')&& $include) {
                $dir=getname();
                foreach my $name(0..$#happs) {
-                       
$menu[$mno]{$happs[$name][0]}=[-1,$happs[$name][1],$happs[$name][2]]
+                       $menu[$mno]{$happs[$name]}=-1
                                if exists $apps[$name]{$dir};
                }
                gettag();       # must be </category> else GIGO and we don't 
care
@@ -437,9 +441,9 @@
                }
                foreach my $name(0..$#$tmpapps) {
                        next unless defined $tmpapps->[$name];
-               foreach my $dir (keys %{$apps[$name]}) {
-                       
$menu[$mno]{$happs[$name][0]}=[-1,$happs[$name][1],$happs[$name][2]];
-               }
+                       foreach my $dir (keys %{$apps[$name]}) {
+                               $menu[$mno]{$happs[$name]}=-1;
+                       }
                }
                next;
        }
@@ -449,25 +453,13 @@
                $menustack[$#menustack+1]=$mno;
                $mno=$#menu;
                $name="";
+               $dirfile="";
                $include=0;
                $trigger=1;
                next;
        }
        if($tag eq '/menu') {
-               #for(my $i=0; $i<=$#menu; $i++) {
-               my $i=$menustack[$#menustack];
-               if(exists $directory[$level]) {
-                       foreach my $entry(keys %{$menu[$i]}) {
-                               if($menu[$i]{$entry}[0]==$mno) {
-                                       $directory[$level][0]=$entry unless 
$directory[$level][0];
-                                       delete($menu[$i]{$entry});
-                               }
-                       }
-                       
$menu[$i]{$directory[$level][0]}=[$mno,$directory[$level][1]];
-                       delete($directory[$level]);
-               }
-               #}
-               $mno=$i;
+               $mno=$menustack[$#menustack];
                $#menustack--;
                $level--;
                next;
@@ -482,43 +474,52 @@
        }
        if($tag eq 'name') {
                $name=getname();
-               $menu[$menustack[$#menustack]]{"+               
$menu[$menustack[$#menustack]]{$name}=$mno;
+               if (length $dirfile) {
+                       $desktop{$name}=$desktop{""};
+                       delete $desktop{""};
+               } else {
+                       $desktop{$name}=[$name,$name,""];
+               }
                gettag();       # must be </name> else GIGO and we don't care
                next;
        }
        if($tag eq 'directory') {
-               $dir=getname();
+               $dirfile=getname();
                my $lang=0;
-               my $name="";
+               my $dname="";
                my $icon="";
                my $enc="iso-8859-1";
                my $ok=0;
                foreach my $tmp (@tmp) {
-                       open F_IN, "$tmp$dir" or next;
+                       open F_IN, "$tmp$dirfile" or next;
                        while(<F_IN>) {
                                if (/^\s*Name\s*=\s*(.+?)\s*$/ && $lang<1) {
-                                       $name=$1;
+                                       $dname=$1;
                                }
                                if (/^\s*Name\[$lang1\]\s*=\s*(.+?)\s*$/ && 
$lang<2) {
-                                       $name=$1;
+                                       $dname=$1;
                                        $lang=1;
                                }
                                if (/^\s*Name\[$lang2\]\s*=\s*(.+?)\s*$/ && 
$lang<3) {
-                                       $name=$1;
+                                       $dname=$1;
                                        $lang=2;
                                }
                                if (/^\s*Name\[$lang3\]\s*=\s*(.+?)\s*$/ && 
$lang<4) {
-                                       $name=$1;
+                                       $dname=$1;
                                        $lang=3;
                                }
                                if (/^\s*Name\[$lang4\]\s*=\s*(.+?)\s*$/ && 
$lang<5) {
-                                       $name=$1;
+                                       $dname=$1;
                                        $lang=4;
                                }
                                $icon=$1 if /^\s*Icon\s*=\s*(.+?)\s*$/;
                                $enc=$1 if /^\s*Encoding\s*=\s*(.+?)\s*$/;
                        }
                        close F_IN;
+                       $ok=1; last;
+               }
+               if ($ok) {
                        if($o_icons) {
                                my $exists=0;
                                foreach my $dir(@icondirs) {
@@ -538,22 +539,22 @@
                                }
                                $icon="" unless $exists;
                        }
-                       if(length $name) {
-                               my $utfname=decode($enc,$name);
+                       my $utfname;
+                       if(length $dname) {
+                               $utfname=decode($enc,$dname);
                                unless($utfname) {
-                                       warn "$tmp$dir: wrong encoding!\n";
-                                       $utfname=$name;
+                                       warn "$dirfile: wrong encoding!\n";
+                                       $utfname=$dname;
                                }
-                               $directory[$level]=["\x{00}$utfname",$icon];
                        } else {
-                               warn "$tmp$dir: missing Name tag!\n";
-                               $directory[$level]=["",$icon];
+                               warn "$dirfile: missing Name tag!\n";
+                               $utfname=$name;
                        }
-                       $ok=1; last;
-               }
-               unless ($ok) {
+                       $dirfile =~ s/\..*?$//;
+                       $desktop{$name} = [$dirfile, $utfname, $icon];
+               } else {
                        local $" = "\n- ";
-                       warn "No readable $dir in:\n- @tmp\n";
+                       warn "No readable $dirfile in:\n- @tmp\n";
                        warn "Last error: $!\n";
                }
                gettag();       # must be </directory> else GIGO and we don't 
care
@@ -592,7 +593,7 @@
        for(my $i=$#menu; $i>=0; $i--) {
                $empty[$i]=1;
                foreach my $entry(keys %{$menu[$i]}) {
-                       $mno=$menu[$i]{$entry}[0];
+                       $mno=$menu[$i]{$entry};
                        if($mno<0) {
                                $empty[$i]=0;
                        } else {
@@ -611,23 +612,20 @@
        for(my $i=$#menu; $i>=0; $i--) {
                $count[$i]=0;
                foreach my $entry(keys %{$menu[$i]}) {
-                       $mno=$menu[$i]{$entry}[0];
+                       $mno=$menu[$i]{$entry};
                        if($mno<0) {
                                $count[$i]++;
-                       } else {
+                       } else { # submenu
                                if($count[$mno]==0) {
                                        delete($menu[$i]{$entry});
                                } else {
-                                       if($count[$mno]==1) {
+                                       if($count[$mno]==1) { #only one entry 
in submenu
                                                foreach my $name(keys 
%{$menu[$mno]}) {
-                                                       
if($menu[$mno]{$name}[0]==-1) {
-                                                               
$menu[$i]{$name}=[-1,"$menu[$mno]{$name}[1]","$menu[$mno]{$name}[2]"];
+                                                       
if($menu[$mno]{$name}==-1) { # it's aplication
+                                                               
$menu[$i]{$name}=-1;
                                                        } else {
-                                                               my 
$newname=$name;
-                                                               
$newname=substr($newname,1);
-                                                               
$newname="$entry:$newname";
-                                                               
$menu[$i]{$newname}=[$menu[$mno]{$name}[0],"$menu[$mno]{$name}[1]"];
-                                                               
delete($menu[$i]{$name});
+                                                               
$menu[$i]{$name}=$menu[$mno]{$name};
+                                                               
delete($menu[$mno]{$name});
                                                        }
                                                }
                                                delete($menu[$i]{$entry});
@@ -952,27 +950,26 @@
 } # }}}
 
 sub enlightenment { # {{{
-       my $no=$_[0];
+       my ($no, $mfile, $title)[EMAIL PROTECTED];
        my $F_OUT;
-       open $F_OUT, ">> $dir/$_[1].menu" or warn "$dir/$_[1].menu: $!\n";
-       print $F_OUT "\"$_[2]\"\n";
-       foreach my $entry(sort keys %{$menu[$no]}) {
-               $name=encode($o_enc,$entry);
+       open $F_OUT, ">> $dir/$mfile.menu" or warn "$dir/$mfile.menu: $!\n";
+       print $F_OUT "\"$title\"\n";
+       my $apps="";
+       foreach my $entry(sort {$desktop{$a}[1] cmp $desktop{$b}[1]} keys 
%{$menu[$no]}) {
+               my $d = $desktop{$entry};
+               $name=encode($o_enc,$$d[1]);
+               $name=~s/\"/\'/g;
                my $icon="";
-               $icon=$menu[$no]{$entry}[1] if $o_icons;
-               $icon=scale_icon($icon,"png","-geometry","18x18") if $icon;
-               if($menu[$no]{$entry}[0]<0) {
-                       $name=~s/\"/\'/g;
-                       print $F_OUT "\"$name\" \"$icon\" exec 
\"$menu[$no]{$entry}[2]\"\n";
+               $icon=$$d[2] if $o_icons;
+               $icon=scale_icon($icon,"png","-geometry","18x18") if length 
$icon;
+               if($menu[$no]{$entry}<0) {
+                       $apps.="\"$name\" \"$icon\" exec \"$$d[3]\"\n";
                } else {
-                       $name=substr($name,1);
-                       $name=~s|/||g;
-                       my $name2=$name;
-                       $name2=~s/\"/\'/g;
-                       print $F_OUT "\"$name2\" \"$icon\" menu 
\"$dir/$name2.menu\"\n";
-                       enlightenment($menu[$no]{$entry}[0],"$name","$name");
+                       print $F_OUT "\"$name\" \"$icon\" menu 
\"$dir/$$d[0].menu\"\n";
+                       enlightenment($menu[$no]{$entry},"$$d[0]","$name");
                }
        }
+       print $F_OUT $apps;
        close $F_OUT;
 } # }}}
 
@@ -1000,47 +997,50 @@
 
 sub fbpanel { # {{{
        my $no=$_[0];
-       foreach my $entry(sort keys %{$menu[$no]}) {
-               print "$level";
-               if($menu[$no]{$entry}[0]<0) {
-                       print "item {\n";
-                       print "${level} name = $entry\n";
-                       print "${level} action = $menu[$no]{$entry}[2]\n";
-                       print "${level} image = $menu[$no]{$entry}[1]\n";
-               } else {
-                       $name=$entry;
-                       $name=substr($name,1);
-                       print "menu {\n";
-                       print "${level} name = $name\n";
-                       print "${level} image = $menu[$no]{$entry}[1]\n";
+       my $apps="";
+       foreach my $entry(sort {$desktop{$a}[1] cmp $desktop{$b}[1]} keys 
%{$menu[$no]}) {
+               my $d = $desktop{$entry};
+               if($menu[$no]{$entry}<0) {
+                       $apps .=
+                               "${level}item {\n".
+                               "${level}       name = $$d[1]\n".
+                               "${level}       action = $$d[3]\n".
+                               "${level}       image = $$d[2]\n".
+                               "${level}}\n";
+               } else {
+                       print "${level}menu {\n";
+                       print "${level} name = $$d[1]\n";
+                       print "${level} image = $$d[2]\n";
                        $level.="       ";
-                       fbpanel($menu[$no]{$entry}[0]);
+                       fbpanel($menu[$no]{$entry});
                        $level=substr($level,1);
+                       print "${level}}\n";
                }
-               print "${level}}\n";
        }
+       print $apps;
 } # }}}
 
 sub openbox { # {{{
        my $no=$_[0];
-       foreach my $entry(sort keys %{$menu[$no]}) {
-               print "$level";
-               if($menu[$no]{$entry}[0]<0) {
-                       print "<item label=\"$entry\">\n";
-                       print "${level} <action name=\"Execute\">\n";
-                       print "${level}  
<execute>$menu[$no]{$entry}[2]</execute>\n";
-                       print "${level} </action>\n";
-                       print "${level}</item>\n";
+       my $apps="";
+       foreach my $entry(sort {$desktop{$a}[1] cmp $desktop{$b}[1]} keys 
%{$menu[$no]}) {
+               my $d = $desktop{$entry};
+               if($menu[$no]{$entry}<0) {
+                       $apps .=
+                               "${level}<item label=\"$$d[1]\">\n".
+                               "${level}       <action name=\"Execute\">\n".
+                               "${level}        <execute>$$d[3]</execute>\n".
+                               "${level}       </action>\n".
+                               "${level}</item>\n";
                } else {
-                       $name=$entry;
-                       $name=substr($name,1);
-                       print "<menu id=\"$name\" label=\"$name\">\n";
+                       print "${level}<menu id=\"$$d[1]\" label=\"$$d[1]\">\n";
                        $level.="       ";
-                       openbox($menu[$no]{$entry}[0]);
+                       openbox($menu[$no]{$entry});
                        $level=substr($level,1);
                        print "$level</menu>\n";
                }
        }
+       print $apps;
 } # }}}
 # WM functions }}}
 
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/vfmg/vfmg?r1=1.73.2.8&r2=1.73.2.9&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to