Updating branch refs/heads/master
         to 43d217bb9c6e6c9c19e6a2dfa285c524a4ed09a3 (commit)
       from c1a214c7e557370e87bb3164d43748155793d392 (commit)

commit 43d217bb9c6e6c9c19e6a2dfa285c524a4ed09a3
Author: Andre Ellguth <an...@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);
        }
 
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to