vfmg (DEVEL): vfmg - total breakage started (: what i've done is t...

sparky sparky at pld-linux.org
Mon Oct 31 03:39:03 CET 2005


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)=@_;
 	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




More information about the pld-cvs-commit mailing list