From bcd5398edfab32f2b06141afb7bc56a9a97a1d77 Mon Sep 17 00:00:00 2001 From: Matias De lellis Date: Wed, 3 Jul 2019 20:47:03 -0300 Subject: [PATCH] Toggle the show desktop button when drag a file over there --- plugins/showdesktop/showdesktop.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/plugins/showdesktop/showdesktop.c b/plugins/showdesktop/showdesktop.c index 9f3b3de..3bcb3b5 100644 --- a/plugins/showdesktop/showdesktop.c +++ b/plugins/showdesktop/showdesktop.c @@ -29,6 +29,10 @@ +#define DRAG_ACTIVATE_TIMEOUT (500) + + + static void show_desktop_plugin_screen_changed (GtkWidget *widget, GdkScreen *previous_screen); static void show_desktop_plugin_construct (XfcePanelPlugin *panel_plugin); @@ -42,6 +46,16 @@ static gboolean show_desktop_plugin_button_release_event (GtkToggleButton ShowDesktopPlugin *plugin); static void show_desktop_plugin_showing_desktop_changed (WnckScreen *wnck_screen, ShowDesktopPlugin *plugin); +static void show_desktop_plugin_drag_leave (GtkWidget *widget, + GdkDragContext *context, + guint time, + ShowDesktopPlugin *plugin); +static gboolean show_desktop_plugin_drag_motion (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + ShowDesktopPlugin *plugin); @@ -58,6 +72,9 @@ struct _ShowDesktopPlugin GtkWidget *button; GtkWidget *icon; + /* Dnd timeout */ + guint drag_timeout; + /* the wnck screen */ WnckScreen *wnck_screen; }; @@ -105,6 +122,13 @@ show_desktop_plugin_init (ShowDesktopPlugin *plugin) xfce_panel_plugin_add_action_widget (XFCE_PANEL_PLUGIN (plugin), button); gtk_widget_show (button); + /* allow toggle the button when drag something.*/ + gtk_drag_dest_set (GTK_WIDGET(plugin->button), 0, NULL, 0, 0); + g_signal_connect (G_OBJECT(plugin->button), "drag_motion", + G_CALLBACK (show_desktop_plugin_drag_motion), plugin); + g_signal_connect (G_OBJECT(plugin->button), "drag_leave", + G_CALLBACK (show_desktop_plugin_drag_leave), plugin); + plugin->icon = gtk_image_new_from_icon_name ("user-desktop", GTK_ICON_SIZE_MENU); gtk_container_add (GTK_CONTAINER (button), plugin->icon); gtk_widget_show (plugin->icon); @@ -274,3 +298,56 @@ show_desktop_plugin_showing_desktop_changed (WnckScreen *wnck_screen, gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plugin->button), wnck_screen_get_showing_desktop (wnck_screen)); } + + + +static gboolean +show_desktop_plugin_drag_timeout (gpointer data) +{ + ShowDesktopPlugin *plugin = (ShowDesktopPlugin *) data; + + plugin->drag_timeout = 0; + + /* activate button to toggle show desktop */ + g_signal_emit_by_name (G_OBJECT (plugin->button), "clicked", plugin); + + return FALSE; +} + + + +static void +show_desktop_plugin_drag_leave (GtkWidget *widget, + GdkDragContext *context, + guint time, + ShowDesktopPlugin *plugin) +{ + if (plugin->drag_timeout != 0) { + g_source_remove (plugin->drag_timeout); + plugin->drag_timeout = 0; + } + + gtk_drag_unhighlight (GTK_WIDGET(widget)); +} + + + +static gboolean +show_desktop_plugin_drag_motion (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + ShowDesktopPlugin *plugin) +{ + if (plugin->drag_timeout == 0) + plugin->drag_timeout = g_timeout_add (DRAG_ACTIVATE_TIMEOUT, + show_desktop_plugin_drag_timeout, + plugin); + + gtk_drag_highlight (GTK_WIDGET(widget)); + + gdk_drag_status (context, 0, time); + + return TRUE; +} -- libgit2 0.27.8