[Xfce4-commits] <xfce4-wmdock-plugin:0.6.x> Fixed a dnd bug in panel mode. Draw a minimal preview of dockapp if dockapp is dragged.

Andre Ellguth noreply at xfce.org
Tue Oct 15 22:40:01 CEST 2013


Updating branch refs/heads/0.6.x
         to 43d217bb9c6e6c9c19e6a2dfa285c524a4ed09a3 (commit)
       from c1a214c7e557370e87bb3164d43748155793d392 (commit)

commit 43d217bb9c6e6c9c19e6a2dfa285c524a4ed09a3
Author: Andre Ellguth <andre at ellguth.com>
Date:   Tue Oct 15 22:38:21 2013 +0200

    Fixed a dnd bug in panel mode. Draw a minimal preview of dockapp if dockapp is dragged.

 panel-plugin/dnd.c     |   17 +++++++++++------
 panel-plugin/dockapp.c |   22 ++++++++--------------
 panel-plugin/misc.c    |   44 +++++++++++++-------------------------------
 panel-plugin/misc.h    |    2 +-
 panel-plugin/props.c   |   22 ++++++++++++++++------
 panel-plugin/rcfile.c  |   10 +---------
 panel-plugin/wmdock.c  |    8 +-------
 7 files changed, 51 insertions(+), 74 deletions(-)

diff --git a/panel-plugin/dnd.c b/panel-plugin/dnd.c
index 9bb4393..79631af 100644
--- a/panel-plugin/dnd.c
+++ b/panel-plugin/dnd.c
@@ -47,20 +47,25 @@
 void drag_begin_handl (GtkWidget *widget, GdkDragContext *context,
 		gpointer dapp)
 {
-	gdkPbIcon = get_icon_from_xpm_scaled((const char **) xfce4_wmdock_plugin_xpm,
-			DEFAULT_DOCKAPP_WIDTH/2,
-			DEFAULT_DOCKAPP_HEIGHT/2);
+	GdkPixbuf *gdkPb = NULL, *gdkPbScaled = NULL;
+	gint width = 0, height = 0;
 
-	gtk_drag_set_icon_pixbuf (context, gdkPbIcon, 0, 0);
+	gtk_widget_get_size_request(GTK_WIDGET(DOCKAPP(dapp)->s), &width, &height);
+	if((gdkPb = gdk_pixbuf_get_from_drawable (NULL, GTK_WIDGET(DOCKAPP(dapp)->s)->window,
+			NULL, 0, 0, 0, 0, width, height))) {
+		gdkPbScaled = gdk_pixbuf_scale_simple(gdkPb, DEFAULT_DOCKAPP_WIDTH / 2, DEFAULT_DOCKAPP_HEIGHT / 2, GDK_INTERP_BILINEAR);
+		gtk_drag_set_icon_pixbuf (context, gdkPbScaled ? gdkPbScaled : gdkPb, 0, 0);
 
-	g_object_unref (G_OBJECT(gdkPbIcon));
+		g_object_unref (G_OBJECT(gdkPb));
+		g_object_unref (G_OBJECT(gdkPbScaled));
+	}
 }
 
 #if (GTK_MAJOR_VERSION >= 2 && GTK_MINOR_VERSION >= 12)
 gboolean drag_failed_handl(GtkWidget *widget, GdkDragContext *context,
 		GtkDragResult result, gpointer dapp)
 {
-	GtkWidget *gtkDlg;
+	GtkWidget *gtkDlg = NULL;
 
 	if(result == GTK_DRAG_RESULT_NO_TARGET && dapp) {
 		gtkDlg = gtk_message_dialog_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (wmdock->plugin))),
diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c
index f474957..4b40856 100644
--- a/panel-plugin/dockapp.c
+++ b/panel-plugin/dockapp.c
@@ -560,29 +560,23 @@ void wmdock_setupdnd_dockapp(DockappNode *dapp)
 {
 	if( ! IS_PANELOFF(wmdock) ) {
 		/* Make the "well label" a DnD destination. */
-		gtk_drag_dest_set (GTK_WIDGET(dapp->s), GTK_DEST_DEFAULT_MOTION, targetList,
+		gtk_drag_dest_set (GTK_WIDGET(dapp->tile), GTK_DEST_DEFAULT_MOTION, targetList,
 				nTargets, GDK_ACTION_MOVE);
 
-		gtk_drag_source_set (GTK_WIDGET(dapp->s), GDK_BUTTON1_MASK, targetList,
+		gtk_drag_source_set (GTK_WIDGET(dapp->tile), GDK_BUTTON1_MASK, targetList,
 				nTargets, GDK_ACTION_MOVE);
 
-		g_signal_connect (dapp->s, "drag-begin",
-				G_CALLBACK (drag_begin_handl), dapp);
-
-		g_signal_connect (dapp->s, "drag-data-get",
-				G_CALLBACK (drag_data_get_handl), dapp);
+		g_signal_connect (dapp->tile, "drag-begin", G_CALLBACK (drag_begin_handl), dapp);
+		g_signal_connect (dapp->tile, "drag-data-get", G_CALLBACK (drag_data_get_handl), dapp);
 
 #if (GTK_MAJOR_VERSION >= 2 && GTK_MINOR_VERSION >= 12)
-		g_signal_connect (dapp->s, "drag-failed",
-				G_CALLBACK (drag_failed_handl), dapp);
+		g_signal_connect (dapp->tile, "drag-failed", G_CALLBACK (drag_failed_handl), dapp);
 #endif
 
-		g_signal_connect (dapp->s, "drag-data-received",
-				G_CALLBACK(drag_data_received_handl), dapp);
-		g_signal_connect (dapp->s, "drag-drop",
-				G_CALLBACK (drag_drop_handl), dapp);
+		g_signal_connect (dapp->tile, "drag-data-received", G_CALLBACK(drag_data_received_handl), dapp);
+		g_signal_connect (dapp->tile, "drag-drop", G_CALLBACK (drag_drop_handl), dapp);
 
-		debug("dockapp.c: Setup DnD for dockapp %s", dapp->name);
+		debug("dockapp.c: Setup DnD for dockapp `%s'", dapp->name);
 	}
 }
 
diff --git a/panel-plugin/misc.c b/panel-plugin/misc.c
index 4b3d89a..7511b51 100644
--- a/panel-plugin/misc.c
+++ b/panel-plugin/misc.c
@@ -233,17 +233,6 @@ AnchorPostion get_default_anchor_postion()
 	return anchorPos;
 }
 
-/**
- * Function which interacts with the wmdock icon.
- *
- * @param icon The wmdock icon widget.
- */
-static void wmdock_icon_pressed(GtkWidget *icon)
-{
-	if( IS_PANELOFF(wmdock) )
-		g_list_foreach(wmdock->dapps, (GFunc) wmdock_dockapp_tofront, NULL);
-}
-
 
 /**
  * Function get the number of xfce4-wmdock-instances are running.
@@ -291,8 +280,6 @@ int wmdock_get_instance_count()
 
 void wmdock_panel_draw_wmdock_icon (gboolean redraw)
 {
-	static GtkWidget *eventBox = NULL;
-
 	gdkPbIcon = get_icon_from_xpm_scaled((const char **) xfce4_wmdock_plugin_xpm,
 			xfce_panel_plugin_get_size (wmdock->plugin) - 2,
 			xfce_panel_plugin_get_size (wmdock->plugin) - 2);
@@ -300,21 +287,13 @@ void wmdock_panel_draw_wmdock_icon (gboolean redraw)
 		gtk_image_set_from_pixbuf (GTK_IMAGE(wmdockIcon), gdkPbIcon);
 	} else {
 		if(wmdockIcon) gtk_widget_destroy(wmdockIcon);
-		if(eventBox) gtk_widget_destroy(eventBox);
-		eventBox = gtk_event_box_new();
 
 		wmdockIcon = gtk_image_new_from_pixbuf (gdkPbIcon);
-		gtk_container_add(GTK_CONTAINER(eventBox), wmdockIcon);
-
-		gtk_box_pack_start(GTK_BOX(wmdock->box), GTK_WIDGET(eventBox),
-				FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(wmdock->box), GTK_WIDGET(wmdockIcon), FALSE, FALSE, 0);
 	}
 	g_object_unref (G_OBJECT (gdkPbIcon));
 
-	if( IS_PANELOFF(wmdock) )
-		g_signal_connect (G_OBJECT(eventBox), "button_press_event", G_CALLBACK (wmdock_icon_pressed), NULL);
-
-	gtk_widget_show_all(GTK_WIDGET(eventBox));
+	gtk_widget_show_all(GTK_WIDGET(wmdockIcon));
 }
 
 
@@ -322,7 +301,7 @@ void wmdock_panel_draw_wmdock_icon (gboolean redraw)
  * Function destroys the info dialog.
  *
  */
-static void wmdock_info_dialog_response (GtkWidget  *gtkDlg, gint response)
+static void wmdock_msg_dialog_response (GtkWidget  *gtkDlg, gint response)
 {
 	gtk_widget_destroy (gtkDlg);
 }
@@ -333,15 +312,18 @@ static void wmdock_info_dialog_response (GtkWidget  *gtkDlg, gint response)
  *
  * @param msg The info message as null terminated string.
  */
-void wmdock_info_dialog(const gchar *msg)
+void wmdock_msg_dialog(GtkMessageType type, const gchar *fmt, ...)
 {
+	va_list args;
+	gchar msg[BUF_MAX];
 	GtkWidget *gtkDlg = NULL;
 
+	va_start(args, fmt);
+	vsnprintf((char *) msg, BUF_MAX, (const char *) fmt, args);
+	va_end(args);
+
 	gtkDlg = gtk_message_dialog_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (wmdock->plugin))),
-			GTK_DIALOG_DESTROY_WITH_PARENT,
-			GTK_MESSAGE_INFO,
-			GTK_BUTTONS_OK,
-			msg);
-	g_signal_connect (gtkDlg, "response", G_CALLBACK (wmdock_info_dialog_response), NULL);
-	gtk_widget_show_all (gtkDlg);
+			GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_OK, msg);
+	g_signal_connect (gtkDlg, "response", G_CALLBACK (wmdock_msg_dialog_response), NULL);
+	gtk_dialog_run (GTK_DIALOG(gtkDlg));
 }
diff --git a/panel-plugin/misc.h b/panel-plugin/misc.h
index 448c2ff..a2bcdb2 100644
--- a/panel-plugin/misc.h
+++ b/panel-plugin/misc.h
@@ -33,6 +33,6 @@ gboolean comp_str_with_pattern(const gchar *, gchar *, gsize);
 void wmdock_panel_draw_wmdock_icon (gboolean redraw);
 int wmdock_get_instance_count();
 AnchorPostion get_default_anchor_postion();
-void wmdock_info_dialog(const gchar *);
+void wmdock_msg_dialog(GtkMessageType, const gchar *, ...);
 
 #endif /* __MISC_H__ */
diff --git a/panel-plugin/props.c b/panel-plugin/props.c
index 4552e96..914af51 100644
--- a/panel-plugin/props.c
+++ b/panel-plugin/props.c
@@ -45,7 +45,7 @@ static struct {
 	GtkWidget *vbox, *vbox2, *vboxGeneral, *vboxDetect, *vboxPanelOffOpts; /* Vertical boxes */
 	GtkWidget *hbox, *hboxPanelOffOpts; /* Horizontal boxes */
 	GtkWidget *frmGeneral, *frmDetect, *frmPanelOffOpts; /* Frames */
-	GtkWidget *lblSel, *lblCmd, *lblPanelOffPlacement; /* Labels */
+	GtkWidget *lblSel, *lblCmd, *lblPanelOffPlacement, *lblPanelOffHint; /* Labels */
 	GtkWidget *chkDispTile, *chkPropButton, *chkAddOnlyWM, *chkPanelOff, *chkPanelOffIgnoreOffset, *chkPanelOffKeepAbove; /* Check boxes */
 	GtkWidget *radioPanelOffTL, *radioPanelOffTR, *radioPanelOffBL, *radioPanelOffBR; /* Radio buttons */
 	GtkWidget *imageContainer, *container; /* Misc. containers */
@@ -77,7 +77,7 @@ static void wmdock_properties_chkdisptile(GtkToggleButton *gtkChkDispTile, gpoin
 	gtk_widget_show_all(GTK_WIDGET(wmdock->box));
 
 	if( ! IS_PANELOFF(wmdock) )
-		wmdock_info_dialog(_("Changes maybe not work properly until you restart XFCE!"));
+		wmdock_msg_dialog(GTK_MESSAGE_INFO, _("Changes maybe not work properly until you restart XFCE!"));
 }
 
 
@@ -144,16 +144,18 @@ static void wmdock_properties_chkpaneloff(GtkToggleButton *gtkChkPanelOff, gpoin
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.radioPanelOffTL), TRUE);
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.radioPanelOffTR), TRUE);
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.lblPanelOffPlacement), TRUE);
+		gtk_widget_set_sensitive(GTK_WIDGET(prop.lblPanelOffHint), TRUE);
 	} else {
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.radioPanelOffBL), FALSE);
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.radioPanelOffBR), FALSE);
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.radioPanelOffTL), FALSE);
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.radioPanelOffTR), FALSE);
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.lblPanelOffPlacement), FALSE);
+		gtk_widget_set_sensitive(GTK_WIDGET(prop.lblPanelOffHint), FALSE);
 	}
 
 	if(g_list_length(wmdock->dapps)) {
-		wmdock_info_dialog(_("Changes will take effect when you restart XFCE!"));
+		wmdock_msg_dialog(GTK_MESSAGE_INFO, _("Changes will take effect when you restart XFCE!"));
 	} else {
 		/* If no dockapp is started enable/disable panel off mode. */
 		wmdock->propPanelOff = rcPanelOff;
@@ -233,6 +235,7 @@ static void wmdock_properties_moveup (GtkWidget *gtkBtnMoveUp, GtkWidget *gtkCom
 			gtk_box_reorder_child(GTK_BOX(wmdock->box), GTK_WIDGET(dapp->tile), pos - 1);
 
 			g_list_foreach(wmdock->dapps, (GFunc)wmdock_redraw_dockapp, NULL);
+			debug("prop.c: Move up `%s' (now at pos: %d)", dapp->name, pos - 1);
 		}
 	}
 }
@@ -257,6 +260,7 @@ static void wmdock_properties_movedown (GtkWidget *gtkBtnMoveDown, GtkWidget *gt
 			gtk_box_reorder_child(GTK_BOX(wmdock->box), GTK_WIDGET(dapp->tile), pos + 1);
 
 			g_list_foreach(wmdock->dapps, (GFunc)wmdock_redraw_dockapp, NULL);
+			debug("prop.c: Move down `%s' (now at pos: %d)", dapp->name, pos + 1);
 		}
 	}
 }
@@ -266,13 +270,16 @@ static void wmdock_properties_savecmd (GtkWidget *gtkTxtCmd, GdkEventKey *event,
 {
 	DockappNode *dapp = NULL;
 	gint pos;
+	gchar *_cmd = NULL;
 
 	pos = gtk_combo_box_get_active(GTK_COMBO_BOX(gtkComboBox));
 
 	dapp = DOCKAPP(g_list_nth_data(wmdock->dapps, pos));
 	if(dapp) {
-		g_free(dapp->cmd);
-		dapp->cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtkTxtCmd)));
+		if((_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtkTxtCmd))))) {
+			g_free(dapp->cmd);
+			dapp->cmd = _cmd;
+		}
 	}
 }
 
@@ -513,9 +520,11 @@ void wmdock_properties_dialog(XfcePanelPlugin *plugin)
 	gtk_box_pack_start (GTK_BOX (prop.vboxPanelOffOpts), prop.chkPanelOffKeepAbove, FALSE, FALSE, 0);
 	gtk_box_pack_start (GTK_BOX (prop.vboxPanelOffOpts), prop.chkPanelOffIgnoreOffset, FALSE, FALSE, 0);
 	gtk_box_pack_start (GTK_BOX(prop.vboxPanelOffOpts), prop.hboxPanelOffOpts, FALSE, FALSE, 0);
+	prop.lblPanelOffHint = gtk_label_new (_("Hint: Is the first dockapp covered by a XFCE panel, please try to move the plugin\nto this panel to correct this problem."));
+	gtk_box_pack_start (GTK_BOX(prop.vboxPanelOffOpts), prop.lblPanelOffHint, FALSE, FALSE, 0);
 
 	prop.tblPanelOff = gtk_table_new(2, 2, TRUE);
-	prop.lblPanelOffPlacement = gtk_label_new (_("Startup placement:"));
+	prop.lblPanelOffPlacement = gtk_label_new (_("Placement:"));
 	gtk_misc_set_alignment (GTK_MISC (prop.lblPanelOffPlacement), 0, 0);
 	prop.radioPanelOffTL = gtk_radio_button_new_with_label(NULL, _("Top left"));
 	prop.radioPanelOffTR = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(prop.radioPanelOffTL), _("Top right"));
@@ -551,6 +560,7 @@ void wmdock_properties_dialog(XfcePanelPlugin *plugin)
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.radioPanelOffTL), FALSE);
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.radioPanelOffTR), FALSE);
 		gtk_widget_set_sensitive(GTK_WIDGET(prop.lblPanelOffPlacement), FALSE);
+		gtk_widget_set_sensitive(GTK_WIDGET(prop.lblPanelOffHint), FALSE);
 	}
 
 	/* Fill the dockapp chooser with entries. */
diff --git a/panel-plugin/rcfile.c b/panel-plugin/rcfile.c
index 99bacd7..ca5a15a 100644
--- a/panel-plugin/rcfile.c
+++ b/panel-plugin/rcfile.c
@@ -51,7 +51,6 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin)
 	gint      i = 0, j = 0, gluePos = 0;
 	gint64    n = 0;
 	gchar     *glueName = NULL;
-	GtkWidget *gtkDlg;
 	DockappNode *dapp = NULL;
 	DockappNode **launched = NULL;
 	gchar     **glueList = NULL;
@@ -89,14 +88,7 @@ void wmdock_read_rc_file (XfcePanelPlugin *plugin)
 
 			if(wmdock_startup_dockapp(rcCmds[i]) != TRUE) {
 				launched[i] = NULL;
-				gtkDlg = gtk_message_dialog_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))),
-						GTK_DIALOG_DESTROY_WITH_PARENT,
-						GTK_MESSAGE_ERROR,
-						GTK_BUTTONS_OK,
-						_("Failed to start %s!"),
-						rcCmds[i]);
-				g_signal_connect (gtkDlg, "response", G_CALLBACK (wmdock_error_dialog_response), NULL);
-				gtk_widget_show_all (gtkDlg);
+				wmdock_msg_dialog(GTK_MESSAGE_ERROR, _("Failed to start `%s'!"), rcCmds[i]);
 			} else {
 				/* Create some dummy widget entries to locate the right position on
 				 * window swallow up.
diff --git a/panel-plugin/wmdock.c b/panel-plugin/wmdock.c
index 4b8bdc6..2e5a28f 100644
--- a/panel-plugin/wmdock.c
+++ b/panel-plugin/wmdock.c
@@ -168,7 +168,6 @@ static WmdockPlugin *wmdock_plugin_new (XfcePanelPlugin* plugin)
 static void wmdock_construct (XfcePanelPlugin *plugin)
 {
 	WnckScreen  *s;
-	GtkWidget   *gtkDlg;
 
 	init_debug();
 
@@ -184,10 +183,8 @@ static void wmdock_construct (XfcePanelPlugin *plugin)
 	wmdock = wmdock_plugin_new (plugin);
 
 	if(wmdock_get_instance_count() > 1) {
-		gtkDlg = gtk_message_dialog_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))),
-				GTK_DIALOG_DESTROY_WITH_PARENT,
+		wmdock_msg_dialog(
 				GTK_MESSAGE_ERROR,
-				GTK_BUTTONS_OK,
 #ifdef HAVE_CONFIG_H
 				_("Only a single instance of `%s' can run."),
 				GETTEXT_PACKAGE);
@@ -195,9 +192,6 @@ static void wmdock_construct (XfcePanelPlugin *plugin)
 				_("Only a single instance of `xfce4-wmdock-plugin' can run."));
 #endif /* HAVE_CONFIG_H */
 
-		g_signal_connect (gtkDlg, "response", G_CALLBACK (wmdock_error_dialog_response), NULL);
-		gtk_dialog_run (GTK_DIALOG(gtkDlg));
-
 		xfce_panel_plugin_remove(plugin);
 	}
 


More information about the Xfce4-commits mailing list