tags 497779 + patch
kthxbye

I've attached a patch that makes mime-support read .desktop files from
/usr/share/applications.  I've tested it and I am able to use evince
(*ahem*) to view PDFs from mutt.  I would also like to point out, for
the benefit of the submitter, that the entire implementation and testing
process took less than an hour.

If the same program has a file in both /usr/lib/mime/packages and
/usr/share/applications, the latter is ignored because presumably the
maintainer wanted to use the former since they provided it.

-- 
brian m. carlson / brian with sandals: Houston, Texas, US
+1 832 623 2791 | http://www.crustytoothpaste.net/~bmc | My opinion only
OpenPGP: RSA v4 4096b: 88AC E9B2 9196 305B A994 7552 F1BA 225C 0223 B187
diff -u mime-support.old/update-mime mime-support-3.52/update-mime
--- mime-support.old/update-mime	2012-03-01 00:49:14.802827192 +0000
+++ mime-support-3.52/update-mime	2012-03-02 00:14:45.470429722 +0000
@@ -24,6 +24,7 @@
 $mailcap	= "/etc/mailcap";
 $mailcapdef	= "/usr/lib/mime/mailcap";
 $mimedir	= "/usr/lib/mime/packages";
+$appsdir	= "/usr/share/applications";
 $orderfile	= "/etc/mailcap.order";
 $defpriority    = 5;
 $localgen	= 0;
@@ -63,14 +64,12 @@
 %packages;
 %priorities;
 @order;
-
+$counter=1;
 
 
 sub ReadEntries
 {
-	my($pkg,$priority,$counter);
-
-	$counter=1;
+	my($pkg,$priority);
 
 #	foreach $file (glob "$mimedir/*") {
 	foreach $file (map { glob $_.'/*' } split ':',$mimedir) {
@@ -111,6 +110,56 @@
 }
 
 
+sub ReadDesktopEntries
+{
+	my($pkg,$priority);
+
+	foreach $file (map { glob $_.'/*' } split ':',$appsdir) {
+		next if ($file =~ m!(^|/)(\.|\#)|(\~)$!);
+		next unless ($file =~ m/\.desktop$/);
+		($pkg) = ($file =~ m|/([^/]*)\.desktop$|);
+		print STDERR "$pkg:\n" if $debug;
+
+		next if (defined $packages{$pkg});
+		$packages{$pkg} = [];
+
+		if (open(FILE,"<$file")) {
+			my($terminal, $exec, @types) = ("test=test -n \"\$DISPLAY\"");
+			while (<FILE>) {
+				chomp;
+				next if (m/^\s*$|^\s*\#/);
+				if (m/^Terminal=(\w+)/i) {
+					$terminal = "needsterminal" if ($1 eq "true");
+				}
+				elsif (m/Exec=(.*)$/i) {
+					$exec = $1;
+					$exec =~ s/%[fFuU]/%s/g;
+					$exec .= " %s" if ($exec !~ m/%s/);
+				}
+				elsif (m/MimeType=(.*)/i) {
+					push @types, split(/;/, $1);
+				}
+			}
+			if (!defined($exec) || !scalar(@types)) {
+				close(FILE);
+				next;
+			}
+			foreach $type (@types) {
+				my $entry = "$type; $exec; $terminal";
+				$priority=$defpriority;
+				$entries{$counter} = $entry;
+				push @{$packages{$pkg}},$counter;
+				push @{$priorities{$priority}},$counter;
+				print STDERR "$counter: $entry\n" if $debug;
+				$counter++;
+			}
+			close(FILE);
+		} else {
+			print STDERR "Warning: could not open file '$file' -- $!\n";
+		}
+	}
+}
+
 
 sub ReadOrder
 {
@@ -270,6 +319,7 @@
 
 
 ReadEntries();
+ReadDesktopEntries();
 ReadOrder();
 @list = OrderEntries();
 UpdateMailcap(@list);

Attachment: signature.asc
Description: Digital signature

Reply via email to