File gnome-panel-run-fixes.patch of Package gnome-panel

Index: gnome-panel/panel-run-dialog.c
===================================================================
--- gnome-panel/panel-run-dialog.c.orig
+++ gnome-panel/panel-run-dialog.c
@@ -241,6 +241,105 @@ panel_run_dialog_set_icon (PanelRunDialo
 	}
 }
 
+static char *
+fuzzy_command_merge (const char *ditem_cmd,
+		     const char *user_cmd)
+{
+	char **tokens;
+	char  *path, *basename, *new_cmd;
+
+	if (!strcmp (ditem_cmd, user_cmd) ||
+	    !g_path_is_absolute (ditem_cmd) ||
+	    g_path_is_absolute (user_cmd))
+		return g_strdup (user_cmd);
+
+	/* find path from desktop item */
+	tokens = g_strsplit (ditem_cmd, " ", -1);
+	if (!tokens || !tokens [0]) {
+		g_strfreev (tokens);
+		return g_strdup (user_cmd);
+	}
+
+	path = g_path_get_dirname (tokens [0]);
+	g_strfreev (tokens);
+
+	/* merge it with basename from user_cmd */
+	tokens = g_strsplit (user_cmd, " ", -1);
+	if (!tokens || !tokens [0]) {
+		g_free (path);
+		g_strfreev (tokens);
+		return g_strdup (user_cmd);
+	}
+	basename = g_path_get_basename (tokens [0]);
+	g_free (tokens [0]);
+	tokens [0] = g_build_filename (path, basename, NULL);
+
+	new_cmd = g_strjoinv (" ", tokens);
+
+	g_free (path);
+	g_free (basename);
+	g_strfreev (tokens);
+
+	return new_cmd;
+}
+
+static gboolean
+panel_run_dialog_launch_ditem (PanelRunDialog *dialog,
+			       const char     *desktop_path,
+			       const char     *command,
+			       const char     *escaped)
+{
+	GnomeDesktopItem *ditem;
+	int result;
+	char *merged_command;
+	GError *error = NULL;
+	
+	ditem = gnome_desktop_item_new_from_file (desktop_path,
+						  GNOME_DESKTOP_ITEM_LOAD_ONLY_IF_EXISTS,
+						  &error);
+	if (!ditem) {
+		char *primary;
+
+		primary = g_strdup_printf (_("Cannot open desktop item '%s'"),
+					   desktop_path);
+		panel_error_dialog (GTK_WINDOW (dialog->run_dialog), NULL,
+				    "cannot_open_desktop_item", TRUE,
+				    primary,
+				    error ? error->message : g_strerror (ENOENT));
+		g_free (primary);
+		g_error_free (error);
+		return FALSE;
+	}
+
+	merged_command = fuzzy_command_merge (
+		gnome_desktop_item_get_string (ditem, GNOME_DESKTOP_ITEM_EXEC),
+		command);
+	gnome_desktop_item_set_string (ditem, GNOME_DESKTOP_ITEM_EXEC, merged_command);
+	g_free (merged_command);
+
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->terminal_checkbox))) {
+		gnome_desktop_item_set_string (ditem, GNOME_DESKTOP_ITEM_TERMINAL,
+					       "true");
+	}
+		   
+	result = panel_ditem_launch (ditem, NULL,
+				     gtk_window_get_screen (GTK_WINDOW (dialog->run_dialog)),
+				     &error);
+	if (result == -1) {
+		char *primary;
+
+		primary = g_strdup_printf (_("Cannot launch command '%s'"),
+					   escaped);
+		panel_error_dialog (GTK_WINDOW (dialog->run_dialog), NULL,
+				    "cannot_spawn_command", TRUE,
+				    primary, error->message);
+		g_free (primary);
+		g_error_free (error);
+	}
+	
+	return result != -1;
+}
+
 static gboolean
 command_is_executable (const char *command)
 {
@@ -292,9 +391,6 @@ panel_run_dialog_launch_command (PanelRu
 	char      **argv;
 	int         argc;
 	
-	if (!command_is_executable (command))
-		return FALSE;
-
 	argc = 3;
 	argv = g_new0 (char *, 4);
 	argv [0] = gnome_util_user_shell ();
@@ -423,18 +519,20 @@ panel_run_dialog_execute (PanelRunDialog
 	escaped = g_markup_escape_text (url, -1);
 	result = FALSE;
 	
-	if (!g_ascii_strcasecmp (scheme, "http") ||
-	    !g_ascii_strcasecmp (scheme, "file"))
-		/* If this returns an http or file url, the url might refer to
-		 * a command that is somewhere in the path or an executable
-		 * file. So try executing it before displaying it. We execute
-		 * the command in the user's shell so that it can do all the
-		 * parameter expansion and other magic for us. */
+
+
+    if (dialog->desktop_path) {
+        result = panel_run_dialog_launch_ditem (dialog, dialog->desktop_path, disk,
+                                                escaped); 
+    } else if ((!g_ascii_strcasecmp (scheme, "http") || 
+              !g_ascii_strcasecmp (scheme, "file")) &&
+               command_is_executable (disk)) {
 		result = panel_run_dialog_launch_command (dialog, disk, escaped);
 	
-	if (!result)
+    } else {
 		result = panel_run_dialog_show_url (dialog, url, escaped);
-		
+    }    
+    
 	if (result) {
 		/* only save working commands in history */
 		gnome_entry_append_history (GNOME_ENTRY (dialog->gnome_entry),
@@ -609,6 +707,7 @@ panel_run_dialog_find_command_idle (Pane
 	const char   *text;
 	char         *found_icon;
 	char         *found_name;
+	char         *found_path;
 	gboolean      fuzzy;
 	
 	model = GTK_TREE_MODEL (dialog->program_list_store);
@@ -616,6 +715,7 @@ panel_run_dialog_find_command_idle (Pane
 	text = sure_string (gtk_entry_get_text (GTK_ENTRY (dialog->gtk_entry)));
 	found_icon = NULL;
 	found_name = NULL;
+	found_path = NULL;
 	fuzzy = FALSE;
 	
 	if (!path || !gtk_tree_model_get_iter (model, &iter, path)) {
@@ -633,12 +733,14 @@ panel_run_dialog_find_command_idle (Pane
 		char *icon = NULL;
 		char *name = NULL;
 		char *comment = NULL;
+		char *desktop_path = NULL;
 
 		gtk_tree_model_get (model, &iter,
 				    COLUMN_EXEC,      &exec,
 				    COLUMN_ICON_FILE, &icon,
 				    COLUMN_NAME,      &name,
 				    COLUMN_COMMENT,   &comment,
+				    COLUMN_PATH,      &desktop_path,
 				    -1);
 
 		if (!fuzzy && exec && icon &&
@@ -648,6 +750,7 @@ panel_run_dialog_find_command_idle (Pane
 			
 			found_icon = g_strdup (icon);
 			found_name = g_strdup (name);
+			found_path = g_strdup (desktop_path);
 			
 			gtk_list_store_set (dialog->program_list_store,
 					    &iter,
@@ -688,6 +791,8 @@ panel_run_dialog_find_command_idle (Pane
 	
 	g_free (dialog->item_name);
 	dialog->item_name = found_name;
+	g_free (dialog->desktop_path);
+	dialog->desktop_path = found_path;
 	
 	dialog->find_command_idle_id = 0;
 	return FALSE;
Index: gnome-panel/panel-util.c
===================================================================
--- gnome-panel/panel-util.c.orig
+++ gnome-panel/panel-util.c
@@ -37,7 +37,7 @@
 #include "launcher.h"
 #include "panel-icon-names.h"
 
-static int
+int
 panel_ditem_launch (GnomeDesktopItem  *item,
 		    GList             *file_list,
 		    GdkScreen         *screen,
Index: gnome-panel/panel-util.h
===================================================================
--- gnome-panel/panel-util.h.orig
+++ gnome-panel/panel-util.h
@@ -3,6 +3,7 @@
 
 #include <gio/gio.h>
 #include <gtk/gtk.h>
+#include <libgnome/gnome-desktop-item.h>
 
 G_BEGIN_DECLS
 
@@ -21,6 +22,10 @@ void            panel_launch_desktop_fil
 					    const char                   *fallback_exec,
 					    GdkScreen                    *screen,
 					    GError                      **error);
+int             panel_ditem_launch         (GnomeDesktopItem             *item,
+					    GList                        *file_list,
+					    GdkScreen                    *screen,
+					    GError                      **error);
 
 char *          panel_util_make_exec_uri_for_desktop (const char *exec);