[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