[Xfce4-commits] <design:master> Icon uri dnd and other stuff.

Nick Schermer noreply at xfce.org
Thu Jun 2 21:04:01 CEST 2011


Updating branch refs/heads/master
         to a549829178bc323c0ec1032eb203442e47a5d5ea (commit)
       from ffe975f45f55522520bf6050180025e81fe93449 (commit)

commit a549829178bc323c0ec1032eb203442e47a5d5ea
Author: Nick Schermer <nick at xfce.org>
Date:   Thu Jun 2 20:19:01 2011 +0200

    Icon uri dnd and other stuff.

 .../merge-with-xfrun/demo-code/c/appfinder-model.c |   13 ++-
 .../merge-with-xfrun/demo-code/c/appfinder-model.h |    3 +-
 .../demo-code/c/appfinder-window.c                 |   97 ++++++++++++++++++--
 .../merge-with-xfrun/demo-code/c/main.c            |   14 ++-
 4 files changed, 109 insertions(+), 18 deletions(-)

diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c
index 9e6f104..d5ad094 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c
@@ -207,10 +207,11 @@ xfce_appfinder_model_get_column_type (GtkTreeModel *tree_model,
   switch (column)
     {
     case XFCE_APPFINDER_MODEL_COLUMN_ABSTRACT:
-    case XFCE_APPFINDER_MODEL_COLUMN_ICON_NAME:
+    case XFCE_APPFINDER_MODEL_COLUMN_URI:
       return G_TYPE_STRING;
 
     case XFCE_APPFINDER_MODEL_COLUMN_ICON:
+    case XFCE_APPFINDER_MODEL_COLUMN_ICON_LARGE:
       return GDK_TYPE_PIXBUF;
 
     case XFCE_APPFINDER_MODEL_COLUMN_VISIBLE:
@@ -311,11 +312,15 @@ xfce_appfinder_model_get_value (GtkTreeModel *tree_model,
       g_value_set_object (value, item->pixbuf);
       break;
 
-    case XFCE_APPFINDER_MODEL_COLUMN_ICON_NAME:
-      g_value_init (value, G_TYPE_STRING);
-      g_value_set_static_string (value, garcon_menu_item_get_icon_name (item->item));
+    case XFCE_APPFINDER_MODEL_COLUMN_ICON_LARGE:
+      g_value_init (value, GDK_TYPE_PIXBUF);
+      g_value_take_object (value, xfce_appfinder_model_load_pixbuf (garcon_menu_item_get_icon_name (item->item), 48));
       break;
 
+    case XFCE_APPFINDER_MODEL_COLUMN_URI:
+      g_value_init (value, G_TYPE_STRING);
+      g_value_take_string (value, garcon_menu_item_get_uri (item->item));
+      break;
 
     default:
       g_assert_not_reached ();
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h
index b54ca13..6ee91d6 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h
@@ -26,8 +26,9 @@ enum
 {
   XFCE_APPFINDER_MODEL_COLUMN_ABSTRACT,
   XFCE_APPFINDER_MODEL_COLUMN_ICON,
-  XFCE_APPFINDER_MODEL_COLUMN_ICON_NAME,
+  XFCE_APPFINDER_MODEL_COLUMN_ICON_LARGE,
   XFCE_APPFINDER_MODEL_COLUMN_VISIBLE,
+  XFCE_APPFINDER_MODEL_COLUMN_URI,
   XFCE_APPFINDER_MODEL_N_COLUMNS,
 };
 
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-window.c b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-window.c
index f203667..a35f105 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-window.c
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-window.c
@@ -30,6 +30,15 @@ static void       xfce_appfinder_window_entry_icon_released      (GtkEntry
                                                                   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_item_changed             (XfceAppfinderWindow         *window);
@@ -62,6 +71,11 @@ struct _XfceAppfinderWindow
   GtkWidget *bin_expanded;
 };
 
+static const GtkTargetEntry target_list[] =
+{
+  { "text/uri-list", 0, 0 }
+};
+
 
 
 G_DEFINE_TYPE (XfceAppfinderWindow, xfce_appfinder_window, GTK_TYPE_WINDOW)
@@ -209,12 +223,15 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
   gtk_tree_view_set_enable_search (GTK_TREE_VIEW (treeview), FALSE);
   g_signal_connect_swapped (GTK_TREE_VIEW (treeview), "row-activated", G_CALLBACK (xfce_appfinder_window_row_activated), window);
   g_signal_connect_swapped (GTK_TREE_VIEW (treeview), "start-interactive-search", G_CALLBACK (gtk_widget_grab_focus), entry);
-  /* gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), XFCE_RUN_MODEL_COLUMN_TOOLTIP); */
+  gtk_drag_source_set (treeview, GDK_BUTTON1_MASK, target_list, G_N_ELEMENTS (target_list), GDK_ACTION_COPY);
+  g_signal_connect (G_OBJECT (treeview), "drag-begin", G_CALLBACK (xfce_appfinder_window_drag_begin), window);
+  g_signal_connect (G_OBJECT (treeview), "drag-data-get", G_CALLBACK (xfce_appfinder_window_drag_data_get), window);
   gtk_container_add (GTK_CONTAINER (scroll), treeview);
   gtk_widget_show (treeview);
   g_object_unref (G_OBJECT (filter_model));
 
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+  gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
   g_signal_connect_swapped (G_OBJECT (selection), "changed",
       G_CALLBACK (xfce_appfinder_window_item_changed), window);
 
@@ -369,6 +386,59 @@ xfce_appfinder_window_entry_key_press_event (GtkWidget           *entry,
 
 
 static void
+xfce_appfinder_window_drag_begin (GtkWidget           *widget,
+                                  GdkDragContext      *drag_context,
+                                  XfceAppfinderWindow *window)
+{
+  GtkTreeSelection *selection;
+  GtkTreeModel     *model;
+  GtkTreeIter       iter;
+  GdkPixbuf        *pixbuf;
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (window->treeview));
+  if (gtk_tree_selection_get_selected (selection, &model, &iter))
+    {
+      gtk_tree_model_get (model, &iter, XFCE_APPFINDER_MODEL_COLUMN_ICON, &pixbuf, -1);
+      if (G_LIKELY (pixbuf != NULL))
+        {
+          gtk_drag_set_icon_pixbuf (drag_context, pixbuf, 0, 0);
+          g_object_unref (G_OBJECT (pixbuf));
+        }
+    }
+  else
+    {
+      gtk_drag_set_icon_stock (drag_context, GTK_STOCK_DIALOG_ERROR, 0, 0);
+    }
+}
+
+
+
+static void
+xfce_appfinder_window_drag_data_get (GtkWidget           *widget,
+                                     GdkDragContext      *drag_context,
+                                     GtkSelectionData    *data,
+                                     guint                info,
+                                     guint                drag_time,
+                                     XfceAppfinderWindow *window)
+{
+  GtkTreeSelection *selection;
+  GtkTreeModel     *model;
+  GtkTreeIter       iter;
+  gchar            *uris[2];
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (window->treeview));
+  if (gtk_tree_selection_get_selected (selection, &model, &iter))
+    {
+      uris[1] = NULL;
+      gtk_tree_model_get (model, &iter, XFCE_APPFINDER_MODEL_COLUMN_URI, &uris[0], -1);
+      gtk_selection_data_set_uris (data, uris);
+      g_free (uris[0]);
+    }
+}
+
+
+
+static void
 xfce_appfinder_window_entry_icon_released (GtkEntry             *entry,
                                            GtkEntryIconPosition  icon_pos,
                                            GdkEvent             *event,
@@ -410,22 +480,28 @@ xfce_appfinder_window_item_changed (XfceAppfinderWindow *window)
   GtkTreeModel     *model;
   gboolean          can_launch;
   GtkTreeSelection *selection;
+  GdkPixbuf        *pixbuf;
 
-  if (!gtk_widget_get_visible (window->paned))
-    return;
-
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (window->treeview));
-  can_launch = gtk_tree_selection_get_selected (selection, &model, &iter);
-  gtk_widget_set_sensitive (window->button_launch, can_launch);
-  if (can_launch)
+  if (gtk_widget_get_visible (window->paned))
     {
-      /* TODO? */
+      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (window->treeview));
+      can_launch = gtk_tree_selection_get_selected (selection, &model, &iter);
+      gtk_widget_set_sensitive (window->button_launch, can_launch);
+
+      if (can_launch)
+        {
+          gtk_tree_model_get (model, &iter, XFCE_APPFINDER_MODEL_COLUMN_ICON_LARGE, &pixbuf, -1);
+          if (G_LIKELY (pixbuf != NULL))
+            {
+              gtk_image_set_from_pixbuf (GTK_IMAGE (window->image), pixbuf);
+              g_object_unref (G_OBJECT (pixbuf));
+            }
+        }
     }
 }
 
 
 
-
 static void
 xfce_appfinder_window_row_activated (XfceAppfinderWindow *window)
 {
@@ -568,6 +644,7 @@ xfce_appfinder_window_set_expanded (XfceAppfinderWindow *window,
   /* toggle icon */
   gtk_entry_set_icon_from_icon_name (GTK_ENTRY (window->entry), GTK_ENTRY_ICON_SECONDARY,
                                      expanded ? GTK_STOCK_GO_UP : GTK_STOCK_GO_DOWN);
+  gtk_entry_set_icon_from_icon_name (GTK_ENTRY (window->entry), GTK_ENTRY_ICON_PRIMARY, NULL);
 
   /* update state */
   xfce_appfinder_window_entry_changed (window);
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/main.c b/xfce4-appfinder/merge-with-xfrun/demo-code/c/main.c
index d7a8fa1..3a7f006 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/main.c
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/main.c
@@ -32,8 +32,9 @@ static GOptionEntry option_entries[] =
 gint
 main (gint argc, gchar **argv)
 {
-  GError    *error = NULL;
-  GtkWidget *window;
+  GError      *error = NULL;
+  GtkWidget   *window;
+  const gchar *desktop;
 
   /* set translation domain */
   xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
@@ -68,7 +69,14 @@ main (gint argc, gchar **argv)
       return EXIT_SUCCESS;
     }
 
-  garcon_set_environment ("XFCE");
+  /* if the value is unset, fallback to XFCE, if the
+   * value is empty, allow all applications in the menu */
+  desktop = g_getenv ("XDG_CURRENT_DESKTOP");
+  if (G_LIKELY (desktop == NULL))
+    desktop = "XFCE";
+  else if (*desktop == '\0')
+    desktop = NULL;
+  garcon_set_environment (desktop);
 
   window = xfce_appfinder_window_new ();
   xfce_appfinder_window_set_expanded (XFCE_APPFINDER_WINDOW (window), opt_finder);



More information about the Xfce4-commits mailing list