[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