If the command-line lockdown key is set, don't display applications in the
[beagle.git] / search / Tiles / Application.cs
blob4ffacca712520ae5270ff33ac7161c00eaf7512c
1 using System;
2 using System.Diagnostics;
3 using System.Runtime.InteropServices;
4 using Mono.Unix;
6 using GConf;
8 namespace Search.Tiles {
10 public class ApplicationActivator : TileActivator {
12 static bool checked_gconf = false;
13 static bool disable_command_line = false;
15 public ApplicationActivator () : base ()
17 AddSupportedFlavor (new HitFlavor (null, null, "application/x-desktop"));
20 [DllImport ("libgnome-desktop-2.so.2")]
21 static extern IntPtr gnome_desktop_item_new_from_uri (string uri, int flags, IntPtr error);
23 [DllImport ("libgnome-desktop-2.so.2")]
24 static extern string gnome_desktop_item_get_string (IntPtr ditem, string attr);
26 [DllImport ("libgnome-desktop-2.so.2")]
27 static extern void gnome_desktop_item_unref (IntPtr ditem);
29 IntPtr ditem;
31 ~ApplicationActivator ()
33 if (ditem != IntPtr.Zero)
34 gnome_desktop_item_unref (ditem);
37 static void CheckLockdown ()
39 GConf.Client client = new GConf.Client ();
41 try {
42 disable_command_line = (bool) client.Get ("/desktop/gnome/lockdown/disable_command_line");
43 } catch {
44 // The key isn't set for some reason
45 disable_command_line = false;
48 checked_gconf = true;
51 // invalid .desktop files get filtered out by Validate(), so they won't
52 // show up as Application tiles, but will show up as File tiles. But
53 // valid .desktop files marked to not show up in GNOME get eaten by
54 // BuildTile instead, so that they won't get picked up by the File tile.
56 // FIXME: we shouldn't be hardcoding GNOME in BuildTile, it should depend
57 // on what the running desktop is.
59 public override bool Validate (Beagle.Hit hit)
61 if (!base.Validate (hit))
62 return false;
64 ditem = gnome_desktop_item_new_from_uri (hit.EscapedUri, 0, IntPtr.Zero);
65 if (ditem == IntPtr.Zero)
66 return false;
68 // Make sure this is a real desktop file, not a .desktop.in
69 string _name = gnome_desktop_item_get_string (ditem, "_Name");
70 if (_name != null)
71 return false;
73 return true;
76 public override Tile BuildTile (Beagle.Hit hit, Beagle.Query query)
78 if (ditem == IntPtr.Zero)
79 return null;
81 string notshow = gnome_desktop_item_get_string (ditem, "NotShowIn");
82 if (notshow != null && notshow.IndexOf ("GNOME") != -1)
83 return null;
85 string onlyshow = gnome_desktop_item_get_string (ditem, "OnlyShowIn");
86 if (onlyshow != null && onlyshow.IndexOf ("GNOME") == -1)
87 return null;
90 if (!checked_gconf)
91 CheckLockdown();
93 if (disable_command_line) {
94 string[] categories = hit.GetProperties ("fixme:Categories");
96 if (categories != null && Array.IndexOf (categories, "TerminalEmulator") != -1)
97 return null;
100 return new Application (hit, query, ditem);
104 public class Application : TileTemplate {
106 IntPtr ditem;
108 public Application (Beagle.Hit hit, Beagle.Query query, IntPtr ditem) : this (hit, query)
110 this.ditem = ditem;
111 // AddAction (new TileAction (Catalog.GetString ("Move to trash"), Gtk.Stock.Delete, MoveToTrash));
114 protected Application (Beagle.Hit hit, Beagle.Query query) : base (hit, query)
116 Group = TileGroup.Application;
117 Title = Hit.GetFirstProperty ("fixme:Name");
118 Description = Hit ["fixme:Comment"];
121 protected override void LoadIcon (Gtk.Image image, int size)
123 Gdk.Pixbuf icon = null;
124 string path = Hit ["fixme:Icon"];
126 if (path != null && path != "") {
127 try {
128 if (path.StartsWith ("/")) {
129 icon = new Gdk.Pixbuf (path);
130 } else {
131 if (path.EndsWith (".png"))
132 icon = WidgetFu.LoadThemeIcon (path.Substring (0, path.Length-4), size);
133 else
134 icon = WidgetFu.LoadThemeIcon (path, size);
136 if (icon == null) {
137 string kde_path = Beagle.Util.KdeUtils.LookupIcon (path);
139 if (System.IO.File.Exists (kde_path))
140 icon = new Gdk.Pixbuf (kde_path);
143 } catch (Exception e) {
144 Console.WriteLine ("Unable to load icon '{0}': {1}", path, e.Message);
148 if (icon != null) {
149 if (icon.Height > size) {
150 int scaled_width = (int) ((double) size / (double) icon.Height * icon.Width);
152 icon = icon.ScaleSimple (scaled_width, size, Gdk.InterpType.Bilinear);
155 image.Pixbuf = icon;
156 } else
157 base.LoadIcon (image, size);
160 [DllImport ("libgnome-desktop-2.so.2")]
161 static extern int gnome_desktop_item_launch (IntPtr ditem, IntPtr file_list, int flags, IntPtr error);
163 public override void Open ()
165 if (gnome_desktop_item_launch (ditem, IntPtr.Zero, 0, IntPtr.Zero) == -1)
166 Console.WriteLine ("Unable to launch application");
169 #if NOPE
170 public void MoveToTrash ()
172 // FIXME: What is the default way to uninstall an application
173 // in a distro-independent way?
175 // FIXME: The chance that the code below works is 1:100 :-)
176 ProcessStartInfo pi = new ProcessStartInfo ("rpm");
177 pi.Arguments = String.Format ("-e {0}", Hit ["fixme:Exec"]);
178 //Process.Start (pi); // FIXME: Safe sex
180 Console.WriteLine ("Would run 'rpm {0}'", pi.Arguments);
182 #endif