File gnome-panel-recently-used-apps.patch of Package gnome-panel
Index: gnome-panel-2.18.0/gnome-panel/panel-run-dialog.c
===================================================================
--- gnome-panel-2.18.0.orig/gnome-panel/panel-run-dialog.c
+++ gnome-panel-2.18.0/gnome-panel/panel-run-dialog.c
@@ -60,6 +60,14 @@
#include "panel-lockdown.h"
#include "panel-xutils.h"
+#include <gtk/gtkversion.h>
+#if GTK_CHECK_VERSION (2,10,0)
+# define USE_GTK_RECENT_MANAGER
+# include <gtk/gtkrecentmanager.h>
+#else
+# include "egg-recent-model.h"
+#endif
+
typedef struct {
GtkWidget *run_dialog;
@@ -111,6 +119,8 @@ enum {
static PanelRunDialog *static_dialog = NULL;
+static void panel_run_dialog_update_recent_apps (PanelRunDialog *dialog, const gchar *cmd);
+
static void
panel_run_dialog_destroy (PanelRunDialog *dialog)
{
@@ -525,6 +535,8 @@ panel_run_dialog_execute (PanelRunDialog
gnome_entry_append_history (GNOME_ENTRY (dialog->gnome_entry),
TRUE, /* save item in history */
command);
+
+ panel_run_dialog_update_recent_apps (dialog, command);
/* only close the dialog if we successfully showed or launched something */
gtk_widget_destroy (dialog->run_dialog);
@@ -784,6 +796,160 @@ panel_run_dialog_find_command_idle (Pane
return FALSE;
}
+static void
+panel_run_dialog_update_recent_apps (PanelRunDialog *dialog, const gchar *cmd)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model = NULL;
+ GtkTreePath *path = NULL;
+
+ gchar *found_ditem_path = NULL;
+ gchar *found_ditem_uri = NULL;
+ gchar *found_cmd = NULL;
+
+ gchar *cmd_i;
+ gchar *ditem_path_i;
+
+ gboolean fuzzy;
+
+#ifdef USE_GTK_RECENT_MANAGER
+ GtkRecentManager *recent_manager;
+ GtkRecentData recent_data;
+#else
+ EggRecentModel *recent_model;
+ EggRecentItem *recent_item;
+#endif
+
+ GError *error = NULL;
+
+
+ if (! cmd)
+ return;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->program_list));
+ path = gtk_tree_path_new_first ();
+
+ if (! path || ! gtk_tree_model_get_iter (model, & iter, path)) {
+ if (path)
+ gtk_tree_path_free (path);
+
+ return;
+ }
+
+ do {
+ cmd_i = NULL;
+ ditem_path_i = NULL;
+
+ gtk_tree_model_get (
+ model, & iter,
+ COLUMN_EXEC, & cmd_i,
+ COLUMN_PATH, & ditem_path_i,
+ -1
+ );
+
+ if (cmd_i && ditem_path_i) {
+ fuzzy = FALSE;
+
+ if (fuzzy_command_match (sure_string (cmd), cmd_i, & fuzzy)) {
+ g_free (found_ditem_path);
+
+ found_ditem_path = g_strdup (ditem_path_i);
+ found_cmd = g_strdup (cmd_i);
+
+ if (! fuzzy) {
+ /*
+ * if not fuzzy then we have a precise
+ * match and we can quit, else keep
+ * searching for a better match
+ */
+ g_free (cmd_i);
+ g_free (ditem_path_i);
+
+ break;
+ }
+ }
+ }
+
+ g_free (cmd_i);
+ g_free (ditem_path_i);
+
+ } while (gtk_tree_model_iter_next (model, & iter));
+
+ gtk_tree_path_free (path);
+
+#ifdef USE_GTK_RECENT_MANAGER
+ recent_manager = gtk_recent_manager_get_default ();
+
+ if (! recent_manager)
+ goto exit;
+#else
+ recent_model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_NONE);
+
+ if (! recent_model)
+ goto exit;
+#endif
+
+ if (found_ditem_path) {
+ found_ditem_uri = g_filename_to_uri (found_ditem_path, NULL, & error);
+
+ if (! error) {
+#ifdef USE_GTK_RECENT_MANAGER
+ recent_data.display_name = NULL;
+ recent_data.description = NULL;
+ recent_data.mime_type = g_strdup ("application/x-desktop");
+ recent_data.is_private = TRUE;
+
+ recent_data.app_name = g_strdup (g_get_application_name ());
+ if (! recent_data.app_name)
+ recent_data.app_name = g_strdup ("gnome-panel run dialog");
+
+ recent_data.app_exec = g_strdup (g_strdup (found_cmd));
+ if (! recent_data.app_exec)
+ recent_data.app_exec = g_strdup ("gnome-open %u");
+
+ recent_data.groups = g_new0 (gchar *, 2);
+ recent_data.groups [0] = g_strdup ("recently-used-apps");
+ recent_data.groups [1] = NULL;
+
+ gtk_recent_manager_add_full (recent_manager, found_ditem_uri, & recent_data);
+
+ g_free (recent_data.mime_type);
+ g_free (recent_data.app_name);
+ g_free (recent_data.app_exec);
+ g_free (recent_data.groups [0]);
+ g_free (recent_data.groups);
+
+#else
+
+ recent_item = egg_recent_item_new_from_uri (found_ditem_uri);
+ egg_recent_item_add_group (recent_item, "recently-used-apps");
+ egg_recent_item_set_private (recent_item, TRUE);
+
+ egg_recent_model_add_full (recent_model, recent_item);
+
+ if (recent_item)
+ egg_recent_item_unref (recent_item);
+#endif
+ }
+ else {
+ g_warning ("unable to create uri from [%s] to insert into recent file list.\n",
+ found_ditem_path);
+
+ g_error_free (error);
+ }
+ }
+
+#ifndef USE_GTK_RECENT_MANAGER
+ g_object_unref (recent_model);
+#endif
+
+exit:
+
+ g_free (found_ditem_path);
+ g_free (found_ditem_uri);
+ g_free (found_cmd);
+}
+
static gboolean
panel_run_dialog_add_icon_idle (PanelRunDialog *dialog)
{