[Xfce4-commits] <xfce4-appfinder:master> Clear command history menu item.

Nick Schermer noreply at xfce.org
Sat Jul 9 16:18:23 CEST 2011


Updating branch refs/heads/master
         to 3125a8da5e59615a6aae220bfbfcf4df8c460fcc (commit)
       from b6f1f951eb0cd98f3bc02fa32ba71ea0d3f173d3 (commit)

commit 3125a8da5e59615a6aae220bfbfcf4df8c460fcc
Author: Nick Schermer <nick at xfce.org>
Date:   Sun Jul 3 23:32:24 2011 +0200

    Clear command history menu item.

 src/appfinder-model.c  |   37 +++++++++++
 src/appfinder-model.h  |    2 +
 src/appfinder-window.c |  162 +++++++++++++++++++++++++++++++++++++-----------
 3 files changed, 165 insertions(+), 36 deletions(-)

diff --git a/src/appfinder-model.c b/src/appfinder-model.c
index efaad74..1edc597 100644
--- a/src/appfinder-model.c
+++ b/src/appfinder-model.c
@@ -24,6 +24,7 @@
 #include <string.h>
 #endif
 
+#include <glib/gstdio.h>
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
 
@@ -1582,6 +1583,42 @@ xfce_appfinder_model_icon_theme_changed (XfceAppfinderModel *model)
 
 
 
+void
+xfce_appfinder_model_commands_clear (XfceAppfinderModel *model)
+{
+  ModelItem   *item;
+  GSList      *li, *lnext;
+  gint         idx;
+  GtkTreePath *path;
+  gchar       *filename;
+
+  appfinder_return_if_fail (XFCE_IS_APPFINDER_MODEL (model));
+
+  for (li = model->items, idx = 0; li != NULL; li = lnext, idx++)
+    {
+      lnext = li->next;
+      item = li->data;
+      if (item->item != NULL)
+        continue;
+
+      model->items = g_slist_delete_link (model->items, li);
+
+      path = gtk_tree_path_new_from_indices (idx--, -1);
+      gtk_tree_model_row_deleted (GTK_TREE_MODEL (model), path);
+      gtk_tree_path_free (path);
+
+      xfce_appfinder_model_item_free (item, model);
+    }
+
+  /* remove the history file */
+  filename = xfce_resource_save_location (XFCE_RESOURCE_CACHE, HISTORY_PATH, FALSE);
+  if (filename != NULL)
+    g_unlink (filename);
+  g_free (filename);
+}
+
+
+
 GarconMenuDirectory *
 xfce_appfinder_model_get_command_category (void)
 {
diff --git a/src/appfinder-model.h b/src/appfinder-model.h
index c75be78..f5c86fd 100644
--- a/src/appfinder-model.h
+++ b/src/appfinder-model.h
@@ -85,6 +85,8 @@ void                 xfce_appfinder_model_icon_theme_changed   (XfceAppfinderMod
 
 GarconMenuDirectory *xfce_appfinder_model_get_command_category (void);
 
+void                 xfce_appfinder_model_commands_clear       (XfceAppfinderModel        *model);
+
 void                 xfce_appfinder_model_category_free        (CategoryItem              *category);
 
 G_END_DECLS
diff --git a/src/appfinder-window.c b/src/appfinder-window.c
index fbb9719..a548a38 100644
--- a/src/appfinder-window.c
+++ b/src/appfinder-window.c
@@ -42,41 +42,45 @@
 
 
 
-static void       xfce_appfinder_window_finalize                 (GObject                     *object);
-static void       xfce_appfinder_window_unmap                    (GtkWidget                   *widget);
-static gboolean   xfce_appfinder_window_key_press_event          (GtkWidget                   *widget,
-                                                                  GdkEventKey                 *event);
-static void       xfce_appfinder_window_set_padding              (GtkWidget                   *entry,
-                                                                  GtkWidget                   *align);
-static void       xfce_appfinder_window_entry_changed            (XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_entry_activate           (GtkEditable                 *entry,
-                                                                  XfceAppfinderWindow         *window);
-static gboolean   xfce_appfinder_window_entry_key_press_event    (GtkWidget                   *entry,
-                                                                  GdkEventKey                 *event,
-                                                                  XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_entry_icon_released      (GtkEntry                    *entry,
-                                                                  GtkEntryIconPosition         icon_pos,
-                                                                  GdkEvent                    *event,
-                                                                  XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_drag_begin               (GtkWidget                   *widget,
-                                                                  GdkDragContext              *drag_context,
-                                                                  XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_drag_data_get            (GtkWidget                   *widget,
-                                                                  GdkDragContext              *drag_context,
-                                                                  GtkSelectionData            *data,
-                                                                  guint                        info,
-                                                                  guint                        drag_time,
-                                                                  XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_category_changed         (GtkTreeSelection            *selection,
-                                                                  XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_category_set_categories  (XfceAppfinderWindow         *window);
-static gboolean   xfce_appfinder_window_item_visible             (GtkTreeModel                *model,
-                                                                  GtkTreeIter                 *iter,
-                                                                  gpointer                     data);
-static void       xfce_appfinder_window_item_changed             (XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_row_activated            (XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_icon_theme_changed       (XfceAppfinderWindow         *window);
-static void       xfce_appfinder_window_execute                  (XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_finalize                      (GObject                     *object);
+static void       xfce_appfinder_window_unmap                         (GtkWidget                   *widget);
+static gboolean   xfce_appfinder_window_key_press_event               (GtkWidget                   *widget,
+                                                                       GdkEventKey                 *event);
+static void       xfce_appfinder_window_set_padding                   (GtkWidget                   *entry,
+                                                                       GtkWidget                   *align);
+static void       xfce_appfinder_window_entry_changed                 (XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_entry_activate                (GtkEditable                 *entry,
+                                                                       XfceAppfinderWindow         *window);
+static gboolean   xfce_appfinder_window_entry_key_press_event         (GtkWidget                   *entry,
+                                                                       GdkEventKey                 *event,
+                                                                       XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_entry_icon_released           (GtkEntry                    *entry,
+                                                                       GtkEntryIconPosition         icon_pos,
+                                                                       GdkEvent                    *event,
+                                                                       XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_drag_begin                    (GtkWidget                   *widget,
+                                                                       GdkDragContext              *drag_context,
+                                                                       XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_drag_data_get                 (GtkWidget                   *widget,
+                                                                       GdkDragContext              *drag_context,
+                                                                       GtkSelectionData            *data,
+                                                                       guint                        info,
+                                                                       guint                        drag_time,
+                                                                       XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_category_changed              (GtkTreeSelection            *selection,
+                                                                       XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_category_set_categories       (XfceAppfinderWindow         *window);
+static gboolean   xfce_appfinder_window_item_visible                  (GtkTreeModel                *model,
+                                                                       GtkTreeIter                 *iter,
+                                                                       gpointer                     data);
+static void       xfce_appfinder_window_item_changed                  (XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_row_activated                 (XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_icon_theme_changed            (XfceAppfinderWindow         *window);
+static void       xfce_appfinder_window_execute                       (XfceAppfinderWindow         *window);
+static gboolean   xfce_appfinder_window_sidepane_popup_menu           (XfceAppfinderWindow         *window);
+static gboolean   xfce_appfinder_window_sidepane_button_release_event (GtkWidget                   *sidepane,
+                                                                       GdkEventButton              *event,
+                                                                       XfceAppfinderWindow         *window);
 
 
 
@@ -240,7 +244,9 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
   sidepane = window->sidepane = gtk_tree_view_new_with_model (GTK_TREE_MODEL (window->category_model));
   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (sidepane), FALSE);
   gtk_tree_view_set_enable_search (GTK_TREE_VIEW (sidepane), FALSE);
-  g_signal_connect_swapped (GTK_TREE_VIEW (sidepane), "start-interactive-search", G_CALLBACK (gtk_widget_grab_focus), entry);
+  g_signal_connect_swapped (G_OBJECT (sidepane), "start-interactive-search", G_CALLBACK (gtk_widget_grab_focus), entry);
+  g_signal_connect_swapped (G_OBJECT (sidepane), "popup-menu", G_CALLBACK (xfce_appfinder_window_sidepane_popup_menu), window);
+  g_signal_connect (G_OBJECT (sidepane), "button-release-event", G_CALLBACK (xfce_appfinder_window_sidepane_button_release_event), window);
   gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (sidepane),
       xfce_appfinder_category_model_row_separator_func, NULL, NULL);
   gtk_container_add (GTK_CONTAINER (scroll), sidepane);
@@ -868,6 +874,90 @@ xfce_appfinder_window_execute (XfceAppfinderWindow *window)
 
 
 
+static void
+xfce_appfinder_window_sidepane_clear (XfceAppfinderWindow *window)
+{
+  if (xfce_dialog_confirm (GTK_WINDOW (window), GTK_STOCK_CLEAR,
+                           _("Clear Command History"),
+                           _("This will permanently remove the custom command history."),
+                           _("Are you sure you want to clear the command history?")))
+    {
+      xfce_appfinder_model_commands_clear (window->model);
+    }
+}
+
+
+static gboolean
+xfce_appfinder_window_sidepane_menu (XfceAppfinderWindow *window,
+                                     guint32              timestamp)
+{
+  GarconMenuDirectory *category;
+  gboolean             result = FALSE;
+  GtkWidget           *menu;
+  GtkWidget           *mi;
+  GtkWidget           *image;
+
+  category = xfce_appfinder_model_get_command_category ();
+  if (window->filter_category == category)
+    {
+      menu = gtk_menu_new ();
+      g_signal_connect (menu, "selection-done", G_CALLBACK (gtk_widget_destroy), NULL);
+
+      mi = gtk_image_menu_item_new_with_label (_("Clear Command History"));
+      gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+      g_signal_connect_swapped (G_OBJECT (mi), "activate", G_CALLBACK (xfce_appfinder_window_sidepane_clear), window);
+      gtk_widget_show (mi);
+
+      image = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU);
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
+
+      gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
+                      3, timestamp);
+
+      result = TRUE;
+    }
+  g_object_unref (G_OBJECT (category));
+
+  return result;
+}
+
+
+
+static gboolean
+xfce_appfinder_window_sidepane_popup_menu (XfceAppfinderWindow *window)
+{
+  return xfce_appfinder_window_sidepane_menu (window, gtk_get_current_event_time ());
+}
+
+
+
+static gboolean
+xfce_appfinder_window_sidepane_button_release_event (GtkWidget           *sidepane,
+                                                     GdkEventButton      *event,
+                                                     XfceAppfinderWindow *window)
+{
+  GtkTreePath      *path;
+  gboolean          result = FALSE;
+  GtkTreeSelection *selection;
+
+  if (event->button == 3
+      && event->type == GDK_BUTTON_RELEASE
+      && gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (sidepane),
+                                        event->x, event->y, &path,
+                                        NULL, NULL, NULL))
+    {
+      /* only try to popup if the clicked item is already selected */
+      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidepane));
+      if (gtk_tree_selection_path_is_selected (selection, path))
+        result = xfce_appfinder_window_sidepane_menu (window, event->time);
+      gtk_tree_path_free (path);
+    }
+
+  return result;
+}
+
+
+
 void
 xfce_appfinder_window_set_expanded (XfceAppfinderWindow *window,
                                     gboolean             expanded)



More information about the Xfce4-commits mailing list