[Xfce4-commits] <xfce4-appfinder:master> Add popup menu to edit and revert desktop files.
Nick Schermer
noreply at xfce.org
Tue Dec 27 22:34:01 CET 2011
Updating branch refs/heads/master
to 9a521345c28876e62feb5fcd6da89ef72699a805 (commit)
from 80158f7d30693d2196b5ea312a4c2b7478e6fcaf (commit)
commit 9a521345c28876e62feb5fcd6da89ef72699a805
Author: Nick Schermer <nick at xfce.org>
Date: Tue Dec 27 22:30:28 2011 +0100
Add popup menu to edit and revert desktop files.
src/appfinder-window.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 178 insertions(+), 0 deletions(-)
diff --git a/src/appfinder-window.c b/src/appfinder-window.c
index 9c5fa92..034dd06 100644
--- a/src/appfinder-window.c
+++ b/src/appfinder-window.c
@@ -23,11 +23,15 @@
#ifdef HAVE_STRING_H
#include <string.h>
#endif
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
#include <libxfce4util/libxfce4util.h>
#include <libxfce4ui/libxfce4ui.h>
#include <gdk/gdkkeysyms.h>
#include <xfconf/xfconf.h>
+#include <glib/gstdio.h>
#include <src/appfinder-window.h>
#include <src/appfinder-model.h>
@@ -49,6 +53,8 @@ static void xfce_appfinder_window_unmap (GtkWidget
static gboolean xfce_appfinder_window_key_press_event (GtkWidget *widget,
GdkEventKey *event);
static void xfce_appfinder_window_view (XfceAppfinderWindow *window);
+static gboolean xfce_appfinder_window_popup_menu (GtkWidget *view,
+ XfceAppfinderWindow *window);
static void xfce_appfinder_window_set_padding (GtkWidget *entry,
GtkWidget *align);
static gboolean xfce_appfinder_window_completion_match_func (GtkEntryCompletion *completion,
@@ -546,6 +552,51 @@ xfce_appfinder_window_set_item_width (XfceAppfinderWindow *window)
+static gboolean
+xfce_appfinder_window_view_button_press_event (GtkWidget *widget,
+ GdkEventButton *event,
+ XfceAppfinderWindow *window)
+{
+ gint x, y;
+ GtkTreePath *path;
+ gboolean have_selection = FALSE;
+
+ if (event->button == 3
+ && event->type == GDK_BUTTON_PRESS)
+ {
+ if (GTK_IS_TREE_VIEW (widget))
+ {
+ gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW (widget),
+ event->x, event->y, &x, &y);
+
+ if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), x, y, &path, NULL, NULL, NULL))
+ {
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (widget), path, NULL, FALSE);
+ gtk_tree_path_free (path);
+ have_selection = TRUE;
+ }
+ }
+ else
+ {
+ path = gtk_icon_view_get_path_at_pos (GTK_ICON_VIEW (widget), event->x, event->y);
+ if (path != NULL)
+ {
+ gtk_icon_view_select_path (GTK_ICON_VIEW (widget), path);
+ gtk_icon_view_set_cursor (GTK_ICON_VIEW (widget), path, NULL, FALSE);
+ gtk_tree_path_free (path);
+ have_selection = TRUE;
+ }
+ }
+
+ if (have_selection)
+ return xfce_appfinder_window_popup_menu (widget, window);
+ }
+
+ return FALSE;
+}
+
+
+
static void
xfce_appfinder_window_view (XfceAppfinderWindow *window)
{
@@ -622,6 +673,10 @@ xfce_appfinder_window_view (XfceAppfinderWindow *window)
G_CALLBACK (xfce_appfinder_window_drag_begin), window);
g_signal_connect (G_OBJECT (view), "drag-data-get",
G_CALLBACK (xfce_appfinder_window_drag_data_get), window);
+ g_signal_connect (G_OBJECT (view), "popup-menu",
+ G_CALLBACK (xfce_appfinder_window_popup_menu), window);
+ g_signal_connect (G_OBJECT (view), "button-press-event",
+ G_CALLBACK (xfce_appfinder_window_view_button_press_event), window);
gtk_container_add (GTK_CONTAINER (window->viewscroll), view);
gtk_widget_show (view);
@@ -672,6 +727,129 @@ xfce_appfinder_window_view_get_selected (XfceAppfinderWindow *window,
static void
+xfce_appfinder_window_popup_menu_edit (GtkWidget *mi,
+ XfceAppfinderWindow *window)
+{
+ GError *error = NULL;
+ gchar *cmd;
+ const gchar *uri;
+
+ uri = g_object_get_data (G_OBJECT (mi), "uri");
+ if (uri == NULL)
+ return;
+
+ cmd = g_strdup_printf ("exo-desktop-item-edit '%s'", uri);
+ if (!g_spawn_command_line_async (cmd, &error))
+ {
+ xfce_dialog_show_error (GTK_WINDOW (window), error, _("Failed to launch desktop item editor"));
+ g_error_free (error);
+ }
+ g_free (cmd);
+}
+
+
+
+static void
+xfce_appfinder_window_popup_menu_revert (GtkWidget *mi,
+ XfceAppfinderWindow *window)
+{
+ const gchar *uri;
+ const gchar *name;
+ GError *error;
+
+ name = g_object_get_data (G_OBJECT (mi), "name");
+ if (name == NULL)
+ return;
+
+ if (xfce_dialog_confirm (GTK_WINDOW (window), GTK_STOCK_REVERT_TO_SAVED, NULL,
+ _("This will permanently remove the custom desktop file from your home directory."),
+ _("Are you sure you want to revert \"%s\"?"), name))
+ {
+ uri = g_object_get_data (G_OBJECT (mi), "uri");
+ if (uri != NULL)
+ {
+ if (g_unlink (uri + 7) == -1)
+ {
+ error = g_error_new (G_FILE_ERROR, g_file_error_from_errno (errno),
+ "%s: %s", uri + 7, g_strerror (errno));
+ xfce_dialog_show_error (GTK_WINDOW (window), error,
+ _("Failed to remove desktop file"));
+ g_error_free (error);
+ }
+ }
+ }
+}
+
+
+
+static gboolean
+xfce_appfinder_window_popup_menu (GtkWidget *view,
+ XfceAppfinderWindow *window)
+{
+ GtkWidget *menu;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gchar *title;
+ gchar *uri;
+ GtkWidget *mi;
+ gchar *path;
+
+ if (xfce_appfinder_window_view_get_selected (window, &model, &iter))
+ {
+ gtk_tree_model_get (model, &iter,
+ XFCE_APPFINDER_MODEL_COLUMN_TITLE, &title,
+ XFCE_APPFINDER_MODEL_COLUMN_URI, &uri, -1);
+
+ menu = gtk_menu_new ();
+ g_signal_connect (G_OBJECT (menu), "selection-done",
+ G_CALLBACK (gtk_widget_destroy), NULL);
+
+ mi = gtk_menu_item_new_with_label (title);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+ gtk_widget_set_sensitive (mi, FALSE);
+ gtk_widget_show (mi);
+
+ mi = gtk_separator_menu_item_new ();
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+ gtk_widget_show (mi);
+
+ mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_EDIT, NULL);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+ g_object_set_data_full (G_OBJECT (mi), "uri", g_strdup (uri), g_free);
+ g_signal_connect (G_OBJECT (mi), "activate",
+ G_CALLBACK (xfce_appfinder_window_popup_menu_edit), window);
+ gtk_widget_show (mi);
+
+ mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_REVERT_TO_SAVED, NULL);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+ g_object_set_data_full (G_OBJECT (mi), "uri", g_strdup (uri), g_free);
+ g_object_set_data_full (G_OBJECT (mi), "name", g_strdup (title), g_free);
+ g_signal_connect (G_OBJECT (mi), "activate",
+ G_CALLBACK (xfce_appfinder_window_popup_menu_revert), window);
+ path = xfce_resource_save_location (XFCE_RESOURCE_DATA, "applications/", FALSE);
+ gtk_widget_set_sensitive (mi, g_str_has_prefix (uri, "file://")
+ && g_str_has_prefix (uri + 7, path));
+ gtk_widget_show (mi);
+ g_free (path);
+
+ g_free (title);
+ g_free (uri);
+
+ gtk_menu_popup (GTK_MENU (menu),
+ NULL, NULL,
+ NULL, NULL,
+ 3,
+ gtk_get_current_event_time ());
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+
+static void
xfce_appfinder_window_update_image (XfceAppfinderWindow *window,
GdkPixbuf *pixbuf)
{
More information about the Xfce4-commits
mailing list