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