Updating branch refs/heads/0.6.x to a5a23d4397b58043b04917f9139adbf66735f624 (commit) from 62926768568bf222739c07aebc2480f4895a36b2 (commit)
commit a5a23d4397b58043b04917f9139adbf66735f624 Author: Andre Ellguth <an...@ellguth.com> Date: Fri Sep 20 18:41:05 2013 +0200 Added alignment options for the panel off mode. Integrated the new anchor postions. panel-plugin/catchwindow.c | 2 +- panel-plugin/dockapp.c | 182 ++++++++++++++++++++++++-------------------- panel-plugin/misc.c | 44 +++++++++++ panel-plugin/misc.h | 1 + panel-plugin/props.c | 37 +++++++-- panel-plugin/wmdock.c | 2 +- panel-plugin/wmdock.h | 9 ++- 7 files changed, 186 insertions(+), 91 deletions(-) diff --git a/panel-plugin/catchwindow.c b/panel-plugin/catchwindow.c index 0daf78d..e12ef92 100644 --- a/panel-plugin/catchwindow.c +++ b/panel-plugin/catchwindow.c @@ -236,7 +236,7 @@ void wmdock_window_open(WnckScreen *s, WnckWindow *w) _dapps = g_list_find(wmdock->dapps, (gconstpointer) dapp); wmdock_set_autoposition_dockapp( dapp, (DOCKAPP(g_list_first(wmdock->dapps)->data) != dapp && _dapps) ? - DOCKAPP(g_list_previous(_dapps)->data) : NULL); + DOCKAPP(((GList *) g_list_previous(_dapps))->data) : NULL); wmdock_order_dockapps(DOCKAPP(g_list_first(wmdock->dapps)->data)); } diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c index 4ba8f43..06eac91 100644 --- a/panel-plugin/dockapp.c +++ b/panel-plugin/dockapp.c @@ -149,7 +149,7 @@ static DockappNode *wmdock_get_primary_anchor_dockapp() */ static DockappNode *wmdock_get_snapable_dockapp(DockappNode *dapp, gint *gluepos) { - #define SNAPDELTA (DEFAULT_DOCKAPP_HEIGHT/2)-1 +#define SNAPDELTA (DEFAULT_DOCKAPP_HEIGHT/2)-1 gint posx, posy, gluex, gluey; gint possible = GLUE_T | GLUE_B | GLUE_L | GLUE_R; gboolean prim; @@ -159,26 +159,18 @@ static DockappNode *wmdock_get_snapable_dockapp(DockappNode *dapp, gint *gluepos prim = (dapp == wmdock_get_primary_anchor_dockapp()) ? TRUE : FALSE; switch(wmdock->anchorPos) { - /* Remove not possible snap positions. */ - case XFCE_SCREEN_POSITION_NW_H: - case XFCE_SCREEN_POSITION_N: - case XFCE_SCREEN_POSITION_NE_H: + /* Remove not possible snap positions for the first dockapp. */ + case ANCHOR_TR: possible^= prim == TRUE ? (GLUE_T | GLUE_L | GLUE_R) : 0; break; - case XFCE_SCREEN_POSITION_SW_H: - case XFCE_SCREEN_POSITION_S: - case XFCE_SCREEN_POSITION_SE_H: + case ANCHOR_BR: possible^= prim == TRUE ? (GLUE_B | GLUE_L | GLUE_R): 0; break; - case XFCE_SCREEN_POSITION_NW_V: - case XFCE_SCREEN_POSITION_W: - case XFCE_SCREEN_POSITION_SW_V: - possible^= prim == TRUE ? (GLUE_B | GLUE_T | GLUE_L) : 0; + case ANCHOR_TL: + possible^= prim == TRUE ? (GLUE_T | GLUE_L | GLUE_R) : 0; break; - case XFCE_SCREEN_POSITION_NE_V: - case XFCE_SCREEN_POSITION_E: - case XFCE_SCREEN_POSITION_SE_V: - possible^= prim == TRUE ? (GLUE_B | GLUE_T | GLUE_R) : 0; + case ANCHOR_BL: + possible^= prim == TRUE ? (GLUE_B | GLUE_L | GLUE_R) : 0; break; } @@ -403,7 +395,7 @@ GtkWidget *wmdock_create_tile_dummy() gtk_window_set_skip_pager_hint(GTK_WINDOW(dummy), TRUE); gtk_window_set_opacity(GTK_WINDOW(dummy), 0.6); gtk_widget_set_size_request(dummy, DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT); -// gtk_window_set_type_hint(GTK_WINDOW(dummy), GDK_WINDOW_TYPE_HINT_DND); + // gtk_window_set_type_hint(GTK_WINDOW(dummy), GDK_WINDOW_TYPE_HINT_DND); return (dummy); } @@ -787,7 +779,8 @@ GtkWidget *wmdock_create_tile_from_socket(DockappNode *dapp) void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp) { gint panelx, panely, plugx, plugy; - gint x, y, i, gluepos = GLUE_MAX; + gint x, y, i, offsetx, offsety, gluepos = GLUE_MAX; + XfceScreenPosition xfceScrPos; if(!IS_PANELOFF(wmdock)) return; @@ -800,78 +793,103 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp) &panelx, &panely); gdk_window_get_position (GDK_WINDOW (GTK_WIDGET (wmdock->plugin)->window), &plugx, &plugy); - /* Initial define the position of the first anchor dockapp. */ - if(wmdock->anchorPos == -1) - wmdock->anchorPos = xfce_panel_plugin_get_screen_position(wmdock->plugin); - - if(prevDapp) { - for(i = 0; i < GLUE_MAX; i++) { - if(prevDapp->glue[i] == dapp) { - gluepos = i; - break; - } + for(i = 0; prevDapp && i < GLUE_MAX; i++) { + if(prevDapp->glue[i] == dapp) { + gluepos = i; + break; } } if(gluepos != GLUE_MAX) { + /* Realign the existing dockapp. */ wmdock_dockapp_child_pos(prevDapp, gluepos, &x, &y); } else { - /* Determine the initial dockapp position. */ - switch(wmdock->anchorPos) { - case XFCE_SCREEN_POSITION_NW_H: - case XFCE_SCREEN_POSITION_N: - case XFCE_SCREEN_POSITION_NE_H: - if(!prevDapp) { - /* From the top to the bottom. */ - x = wmdock->anchorPos == XFCE_SCREEN_POSITION_NW_H ? gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH : 0; - y = panelx == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0; - } else { - wmdock_dockapp_child_pos(prevDapp, GLUE_B, &x, &y); - prevDapp->glue[GLUE_B] = dapp; - } - break; + /* Align a new dockapp. */ + if(prevDapp) { + /* If a parent dockapp already exists. */ + if(wmdock->anchorPos == ANCHOR_TL || wmdock->anchorPos == ANCHOR_TR) + gluepos = GLUE_B; + else + gluepos = GLUE_T; + + wmdock_dockapp_child_pos(prevDapp, gluepos, &x, &y); + prevDapp->glue[gluepos] = dapp; + } else { + /* Determine the initial dockapp position. */ + xfceScrPos = xfce_panel_plugin_get_screen_position(wmdock->plugin); + + offsetx = offsety = 0; + switch(wmdock->anchorPos) { + case ANCHOR_TL: + if(xfceScrPos == XFCE_SCREEN_POSITION_NW_V || + xfceScrPos == XFCE_SCREEN_POSITION_W || + xfceScrPos == XFCE_SCREEN_POSITION_SW_V) { + offsetx = panelx == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0; + offsety = 0; + } else if (xfceScrPos == XFCE_SCREEN_POSITION_NW_H || + xfceScrPos == XFCE_SCREEN_POSITION_N || + xfceScrPos == XFCE_SCREEN_POSITION_NE_H) { + offsetx = 0; + offsety = panely == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0; + } - case XFCE_SCREEN_POSITION_SW_H: - case XFCE_SCREEN_POSITION_S: - case XFCE_SCREEN_POSITION_SE_H: - if(!prevDapp) { - /* From the bottom to the top. */ - x = wmdock->anchorPos == XFCE_SCREEN_POSITION_SW_H ? gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH : 0; - y = panelx == 0 ? panely - DEFAULT_DOCKAPP_HEIGHT : gdk_screen_get_height(get_current_gdkscreen()) - DEFAULT_DOCKAPP_HEIGHT; - } else { - wmdock_dockapp_child_pos(prevDapp, GLUE_T, &x, &y); - prevDapp->glue[GLUE_T] = dapp; - } - break; - case XFCE_SCREEN_POSITION_NW_V: - case XFCE_SCREEN_POSITION_W: - case XFCE_SCREEN_POSITION_SW_V: - if(!prevDapp) { - /* From the left to the right. */ - x = panely == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0; - y = panely == 0 ? 0 : gdk_screen_get_height(get_current_gdkscreen()) - DEFAULT_DOCKAPP_HEIGHT; - } else { - wmdock_dockapp_child_pos(prevDapp, GLUE_R, &x, &y); - prevDapp->glue[GLUE_R] = dapp; - } - break; - case XFCE_SCREEN_POSITION_NE_V: - case XFCE_SCREEN_POSITION_E: - case XFCE_SCREEN_POSITION_SE_V: - if(!prevDapp) { - /* From the top to the bottom. */ - x = panely == 0 ? gdk_screen_get_width(get_current_gdkscreen()) - xfce_panel_plugin_get_size(wmdock->plugin) - DEFAULT_DOCKAPP_WIDTH : gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH; - y = panely == 0 ? 0 : gdk_screen_get_height(get_current_gdkscreen()) - DEFAULT_DOCKAPP_HEIGHT; - } else { - wmdock_dockapp_child_pos(prevDapp, GLUE_L, &x, &y); - prevDapp->glue[GLUE_L] = dapp; + x = 0 + offsetx; + y = 0 + offsety; + break; + case ANCHOR_TR: + if(xfceScrPos == XFCE_SCREEN_POSITION_NE_V || + xfceScrPos == XFCE_SCREEN_POSITION_E || + xfceScrPos == XFCE_SCREEN_POSITION_SE_V) { + offsetx = xfce_panel_plugin_get_size(wmdock->plugin); + offsety = 0; + } else if (xfceScrPos == XFCE_SCREEN_POSITION_NW_H || + xfceScrPos == XFCE_SCREEN_POSITION_N || + xfceScrPos == XFCE_SCREEN_POSITION_NE_H) { + offsetx = 0; + offsety = panely == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0; + } + + x = gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH - offsetx; + y = 0 + offsety; + break; + case ANCHOR_BL: + if(xfceScrPos == XFCE_SCREEN_POSITION_NW_V || + xfceScrPos == XFCE_SCREEN_POSITION_W || + xfceScrPos == XFCE_SCREEN_POSITION_SW_V) { + offsetx = panelx == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0; + offsety = 0; + } else if (xfceScrPos == XFCE_SCREEN_POSITION_SW_H || + xfceScrPos == XFCE_SCREEN_POSITION_S || + xfceScrPos == XFCE_SCREEN_POSITION_SE_H) { + offsetx = 0; + offsety = xfce_panel_plugin_get_size(wmdock->plugin); + } + + x = 0 + offsetx; + y = gdk_screen_get_height(get_current_gdkscreen()) - DEFAULT_DOCKAPP_HEIGHT - offsety; + break; + case ANCHOR_BR: + if(xfceScrPos == XFCE_SCREEN_POSITION_NE_V || + xfceScrPos == XFCE_SCREEN_POSITION_E || + xfceScrPos == XFCE_SCREEN_POSITION_SE_V) { + offsetx = xfce_panel_plugin_get_size(wmdock->plugin); + offsety = 0; + } else if (xfceScrPos == XFCE_SCREEN_POSITION_SW_H || + xfceScrPos == XFCE_SCREEN_POSITION_S || + xfceScrPos == XFCE_SCREEN_POSITION_SE_H) { + offsetx = 0; + offsety = xfce_panel_plugin_get_size(wmdock->plugin); + } + + x = gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH - offsetx; + y = gdk_screen_get_height(get_current_gdkscreen()) - DEFAULT_DOCKAPP_HEIGHT - offsety; + break; + default: + debug("dockapp.c: Can not determine panel position x = y = 0."); + x = y = 0; + break; } - break; - default: - debug("dockapp.c: Can not determine panel position x = y = 0."); - x = y = 0; - break; - } + } /* else */ } gtk_window_move(GTK_WINDOW(dapp->tile), x, y); diff --git a/panel-plugin/misc.c b/panel-plugin/misc.c index 248a31b..3dd6a9e 100644 --- a/panel-plugin/misc.c +++ b/panel-plugin/misc.c @@ -189,6 +189,50 @@ GdkScreen *get_current_gdkscreen() } /** + * Returns the default anchor postion for the XFCE panel. + * + * @return default anchor postion + */ +AnchorPostion get_default_anchor_postion() +{ + AnchorPostion anchorPos = ANCHOR_BR; + + if(!wmdock || !wmdock->plugin) + return anchorPos; + + switch(xfce_panel_plugin_get_screen_position(wmdock->plugin)) { + case XFCE_SCREEN_POSITION_NW_H: + case XFCE_SCREEN_POSITION_N: + case XFCE_SCREEN_POSITION_NE_H: + anchorPos = ANCHOR_TR; + break; + + case XFCE_SCREEN_POSITION_SW_H: + case XFCE_SCREEN_POSITION_S: + case XFCE_SCREEN_POSITION_SE_H: + anchorPos = ANCHOR_BR; + break; + + case XFCE_SCREEN_POSITION_NW_V: + case XFCE_SCREEN_POSITION_W: + case XFCE_SCREEN_POSITION_SW_V: + anchorPos = ANCHOR_TL; + break; + + case XFCE_SCREEN_POSITION_NE_V: + case XFCE_SCREEN_POSITION_E: + case XFCE_SCREEN_POSITION_SE_V: + anchorPos = ANCHOR_TR; + break; + + default: + break; + } + + return anchorPos; +} + +/** * Function which interacts with the wmdock icon. * * @param icon The wmdock icon widget. diff --git a/panel-plugin/misc.h b/panel-plugin/misc.h index bb043dc..9d52ea4 100644 --- a/panel-plugin/misc.h +++ b/panel-plugin/misc.h @@ -32,5 +32,6 @@ gboolean comp_dockapp_with_filterlist(const gchar *); 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(); #endif /* __MISC_H__ */ diff --git a/panel-plugin/props.c b/panel-plugin/props.c index 762b271..f20892d 100644 --- a/panel-plugin/props.c +++ b/panel-plugin/props.c @@ -43,10 +43,11 @@ static struct { GtkWidget *dlg; GtkWidget *vbox, *vbox2, *vboxGeneral, *vboxDetect; - GtkWidget *hbox; - GtkWidget *frmGeneral, *frmDetect; + GtkWidget *hbox, *hboxPanelOffOpts; + GtkWidget *frmGeneral, *frmDetect, *frmPanelOffOpts; GtkWidget *lblSel, *lblCmd; GtkWidget *chkDispTile, *chkPropButton, *chkAddOnlyWM, *chkPanelOff; + GtkWidget *radioPanelOffTL, *radioPanelOffTR, *radioPanelOffBL, *radioPanelOffBR; GtkWidget *imageContainer, *container; GtkWidget *imageTile, *image; GtkWidget *txtCmd; @@ -107,11 +108,14 @@ static void wmdock_properties_chkpaneloff(GtkToggleButton *gtkChkPanelOff, gpoin { GtkWidget *gtkDlg; - rcPanelOff = gtk_toggle_button_get_active(gtkChkPanelOff); + if((rcPanelOff = gtk_toggle_button_get_active(gtkChkPanelOff)) == TRUE) { + wmdock->anchorPos = xfce_panel_plugin_get_screen_position(wmdock->plugin); + gtk_widget_set_sensitive(GTK_WIDGET(prop.frmPanelOffOpts), TRUE); + } else { + gtk_widget_set_sensitive(GTK_WIDGET(prop.frmPanelOffOpts), FALSE); + } if(g_list_length(wmdock->dapps)) { - if(rcPanelOff == TRUE) - wmdock->anchorPos = xfce_panel_plugin_get_screen_position(wmdock->plugin); gtkDlg = gtk_message_dialog_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (wmdock->plugin))), GTK_DIALOG_DESTROY_WITH_PARENT, @@ -380,6 +384,7 @@ void wmdock_properties_dialog(XfcePanelPlugin *plugin) prop.frmGeneral = gtk_frame_new(_("General settings")); prop.frmDetect = gtk_frame_new(_("Dockapp detection")); + prop.frmPanelOffOpts = gtk_frame_new(_("Alignment options")); prop.vboxGeneral = gtk_vbox_new(FALSE, 6); prop.vboxDetect = gtk_vbox_new(FALSE, 6); @@ -397,13 +402,15 @@ void wmdock_properties_dialog(XfcePanelPlugin *plugin) gtk_box_pack_start (GTK_BOX (prop.hbox), prop.vbox, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (prop.hbox), prop.vbox2, FALSE, FALSE, 0); - prop.imageContainer = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_widget_set_size_request(GTK_WIDGET(prop.imageContainer), DEFAULT_DOCKAPP_WIDTH, DEFAULT_DOCKAPP_HEIGHT); prop.container = gtk_fixed_new(); + prop.hboxPanelOffOpts = gtk_hbox_new(FALSE, 4); + + /* Create the GTK widget objects. */ gdkPbIcon = gdk_pixbuf_new_from_xpm_data((const char**) xfce4_wmdock_plugin_xpm); @@ -470,8 +477,11 @@ void wmdock_properties_dialog(XfcePanelPlugin *plugin) gtk_container_add(GTK_CONTAINER(prop.frmGeneral), prop.vboxGeneral); gtk_container_add(GTK_CONTAINER(prop.frmDetect), prop.vboxDetect); + gtk_box_pack_start (GTK_BOX(prop.vboxGeneral), prop.chkPanelOff, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(prop.vboxGeneral), prop.frmPanelOffOpts, + FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(prop.vboxGeneral), prop.chkDispTile, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(prop.vboxGeneral), prop.chkPropButton, @@ -481,6 +491,21 @@ void wmdock_properties_dialog(XfcePanelPlugin *plugin) gtk_box_pack_start (GTK_BOX(prop.vboxDetect), prop.txtPatterns, FALSE, FALSE, 0); + /* Setup advanced panel off mode options frame. */ + 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")); + prop.radioPanelOffBL = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(prop.radioPanelOffTL), _("Bottom left")); + prop.radioPanelOffBR = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(prop.radioPanelOffTL), _("Bottom right")); + + gtk_container_add(GTK_CONTAINER(prop.frmPanelOffOpts), prop.hboxPanelOffOpts); + gtk_box_pack_start (GTK_BOX (prop.hboxPanelOffOpts), prop.radioPanelOffTL, + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (prop.hboxPanelOffOpts), prop.radioPanelOffTR, + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (prop.hboxPanelOffOpts), prop.radioPanelOffBL, + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (prop.hboxPanelOffOpts), prop.radioPanelOffBR, + FALSE, FALSE, 0); /* Fill the dockapp chooser with entries. */ wmdock_refresh_properties_dialog(); diff --git a/panel-plugin/wmdock.c b/panel-plugin/wmdock.c index 033e1b2..cd95366 100644 --- a/panel-plugin/wmdock.c +++ b/panel-plugin/wmdock.c @@ -119,7 +119,7 @@ static WmdockPlugin *wmdock_plugin_new (XfcePanelPlugin* plugin) /* TODO: Set panel off to FALSE. */ wmdock->propPanelOff = TRUE; wmdock->filterList = g_strdup(DOCKAPP_FILTER_PATTERN); - wmdock->anchorPos = -1; + wmdock->anchorPos = ANCHOR_BR; wmdock->eventBox = gtk_event_box_new (); gtk_widget_show(GTK_WIDGET(wmdock->eventBox)); diff --git a/panel-plugin/wmdock.h b/panel-plugin/wmdock.h index d7178b0..2a2f480 100644 --- a/panel-plugin/wmdock.h +++ b/panel-plugin/wmdock.h @@ -28,6 +28,13 @@ #define WNCK_I_KNOW_THIS_IS_UNSTABLE #include <libwnck/libwnck.h> +typedef enum { + ANCHOR_TL, + ANCHOR_TR, + ANCHOR_BL, + ANCHOR_BR +} AnchorPostion; + typedef struct { XfcePanelPlugin *plugin; @@ -42,7 +49,7 @@ typedef struct { gboolean propDispPropButton; gboolean propDispAddOnlyWM; gboolean propPanelOff; - gint anchorPos; + AnchorPostion anchorPos; gchar *filterList; GList *dapps; _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits