diff --git a/plugins/applicationsmenu/applicationsmenu.c b/plugins/applicationsmenu/applicationsmenu.c index 0e1123c..6de0bfd 100644 --- a/plugins/applicationsmenu/applicationsmenu.c +++ b/plugins/applicationsmenu/applicationsmenu.c @@ -53,6 +53,7 @@ struct _ApplicationsMenuPlugin GtkWidget *box; GtkWidget *icon; GtkWidget *label; + GtkWidget *menu; guint show_generic_names : 1; guint show_menu_icons : 1; @@ -81,6 +82,10 @@ enum PROP_CUSTOM_MENU_FILE }; +static const GtkTargetEntry dnd_target_list[] = { + { "text/uri-list", 0, 0 } +}; + static void applications_menu_plugin_get_property (GObject *object, @@ -703,6 +708,46 @@ applications_menu_plugin_menu_item_activate (GtkWidget *mi, +static void +applications_menu_plugin_menu_item_drag_data_get (GtkWidget *widget, + GdkDragContext *drag_context, + GtkSelectionData *data, + guint info, + guint event_time, + GarconMenuItem *item) +{ + gchar *uri; + + panel_return_if_fail (GARCON_IS_MENU_ITEM (item)); + + if (G_UNLIKELY (item == NULL)) + return; + + uri = garcon_menu_item_get_uri (item); + if (G_LIKELY (uri != NULL)) + { + gtk_selection_data_set (data, data->target, 8, (guchar *) uri, strlen (uri)); + g_free (uri); + } +} + + + +static void +applications_menu_plugin_menu_item_drag_end (GtkWidget *widget, + GdkDragContext *drag_context, + ApplicationsMenuPlugin *plugin) +{ + panel_return_if_fail (XFCE_IS_APPLICATIONS_MENU_PLUGIN (plugin)); + + if (plugin->button != NULL) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plugin->button), FALSE); + + exo_gtk_object_destroy_later (GTK_OBJECT (plugin->menu)); +} + + + static gboolean applications_menu_plugin_menu_add (GtkWidget *gtk_menu, GarconMenu *menu, @@ -744,6 +789,7 @@ applications_menu_plugin_menu_add (GtkWidget *gtk_menu, mi = gtk_image_menu_item_new_with_label (name); gtk_menu_shell_append (GTK_MENU_SHELL (gtk_menu), mi); + gtk_drag_source_set (mi, GDK_BUTTON1_MASK, dnd_target_list, G_N_ELEMENTS (dnd_target_list), GDK_ACTION_COPY); if (plugin->show_tooltips) { @@ -755,6 +801,10 @@ applications_menu_plugin_menu_add (GtkWidget *gtk_menu, g_signal_connect_data (G_OBJECT (mi), "activate", G_CALLBACK (applications_menu_plugin_menu_item_activate), g_object_ref (li->data), (GClosureNotify) g_object_unref, 0); + g_signal_connect (G_OBJECT (mi), "drag-data-get", + G_CALLBACK (applications_menu_plugin_menu_item_drag_data_get), li->data); + g_signal_connect (G_OBJECT (mi), "drag-end", + G_CALLBACK (applications_menu_plugin_menu_item_drag_end), plugin); gtk_widget_show (mi); command = garcon_menu_item_get_command (li->data); @@ -852,9 +902,11 @@ applications_menu_plugin_menu (GtkWidget *button, if (garcon_menu_load (menu, NULL, &error)) { gtk_menu = gtk_menu_new (); - g_signal_connect (G_OBJECT (gtk_menu), "deactivate", + g_signal_connect (G_OBJECT (gtk_menu), "selection-done", G_CALLBACK (applications_menu_plugin_menu_deactivate), button); + plugin->menu = menu; + if (!applications_menu_plugin_menu_add (gtk_menu, menu, plugin)) { mi = gtk_menu_item_new_with_label (_("No applications found"));