[Xfce4-commits] <xfce4-wmdock-plugin:master> Get the correct screen of the plugin. Correct some bugs for the dockapp movement.

Andre Ellguth noreply at xfce.org
Mon Nov 4 13:36:13 CET 2013


Updating branch refs/heads/master
         to bed00b923287a5a7d0a3f3fa3eea56ce4c4d5369 (commit)
       from 72d1dc630750645d7741f4755dbc727eb973b0ea (commit)

commit bed00b923287a5a7d0a3f3fa3eea56ce4c4d5369
Author: Andre Ellguth <andre at ellguth.com>
Date:   Wed Jul 24 22:44:31 2013 +0200

    Get the correct screen of the plugin.
    Correct some bugs for the dockapp movement.

 panel-plugin/dockapp.c |   40 ++++++++++++++++++++++++++--------------
 panel-plugin/misc.c    |   13 +++++++++++++
 panel-plugin/misc.h    |    1 +
 3 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c
index 9638cbd..08b5ce1 100644
--- a/panel-plugin/dockapp.c
+++ b/panel-plugin/dockapp.c
@@ -170,12 +170,12 @@ static DockappNode *wmdock_get_snapable_dockapp(DockappNode *dapp, gint *gluepos
 	case XFCE_SCREEN_POSITION_NW_V:
 	case XFCE_SCREEN_POSITION_W:
 	case XFCE_SCREEN_POSITION_SW_V:
-		possible^= prim == TRUE ? GLUE_T : 0;
+		possible^= prim == TRUE ? (GLUE_T | GLUE_L) : 0;
 		break;
 	case XFCE_SCREEN_POSITION_NE_V:
 	case XFCE_SCREEN_POSITION_E:
 	case XFCE_SCREEN_POSITION_SE_V:
-		possible^= prim == TRUE ? GLUE_T : 0;
+		possible^= prim == TRUE ? (GLUE_T | GLUE_R) : 0;
 		break;
 	}
 
@@ -241,6 +241,14 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp)
 	DockappNode *_dapp = NULL, *parent = NULL, *_parent = NULL;
 
 	parent = wmdock_get_parent_dockapp(dapp);
+	if(!parent && wmdock_get_primary_anchor_dockapp() == dapp) {
+		/* Set the nearest dockapp to parent if the current dapp is primary.
+		 * The nearest is the new primary dockapp. */
+		for(i = 0; i < GLUE_MAX; i++) {
+			if((parent = dapp->glue[i]))
+				break;
+		}
+	}
 	debug("dockapp.c: Parent DockApp of `%s' is `%s'", dapp->name, parent ? parent->name : "<none>");
 
 	dapps = g_list_first(wmdock->dapps);
@@ -251,10 +259,14 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp)
 					g_list_foreach(wmdock->dapps, (GFunc) wmdock_remove_anchor_dockapp, dapp);
 					for(j = 0; j < GLUE_MAX; j++) {
 						if(parent) {
+							if(parent == dapp->glue[j])
+								dapp->glue[j] = NULL;
+
 							/* Transfer all connected DockApps to the parent. */
 							_parent = parent;
-							while(_parent->glue[j])
+							while(_parent->glue[j]) {
 								_parent = _parent->glue[j];
+							}
 							_parent->glue[j] = dapp->glue[j];
 						}
 						/* Remove old anchor itself or all anchors it was the first anchor. */
@@ -800,7 +812,7 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp)
 		case XFCE_SCREEN_POSITION_NE_H:
 			if(!prevDapp) {
 				/* From the top to the bottom. */
-				x = gdk_screen_width() - DEFAULT_DOCKAPP_WIDTH;
+				x = gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH;
 				y = panelx == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0;
 			} else {
 				wmdock_dockapp_child_pos(prevDapp, GLUE_B, &x, &y);
@@ -813,8 +825,8 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp)
 		case XFCE_SCREEN_POSITION_SE_H:
 			if(!prevDapp) {
 				/* From the bottom to the top. */
-				x = gdk_screen_width() - DEFAULT_DOCKAPP_WIDTH;
-				y = panelx == 0 ? panely - DEFAULT_DOCKAPP_HEIGHT : gdk_screen_height() - DEFAULT_DOCKAPP_HEIGHT;
+				x = gdk_screen_get_width(get_current_gdkscreen()) - DEFAULT_DOCKAPP_WIDTH;
+				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;
@@ -824,12 +836,12 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp)
 		case XFCE_SCREEN_POSITION_W:
 		case XFCE_SCREEN_POSITION_SW_V:
 			if(!prevDapp) {
-				/* From the top to the bottom. */
+				/* From the left to the right. */
 				x = panely == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0;
-				y = 0;
+				y = panely == 0 ? 0 : gdk_screen_get_height(get_current_gdkscreen()) - DEFAULT_DOCKAPP_HEIGHT;
 			} else {
-				wmdock_dockapp_child_pos(prevDapp, GLUE_B, &x, &y);
-				prevDapp->glue[GLUE_B] = dapp;
+				wmdock_dockapp_child_pos(prevDapp, GLUE_R, &x, &y);
+				prevDapp->glue[GLUE_R] = dapp;
 			}
 			break;
 		case XFCE_SCREEN_POSITION_NE_V:
@@ -837,11 +849,11 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp)
 		case XFCE_SCREEN_POSITION_SE_V:
 			if(!prevDapp) {
 				/* From the top to the bottom. */
-				x = panely == 0 ? gdk_screen_width() - xfce_panel_plugin_get_size(wmdock->plugin) - DEFAULT_DOCKAPP_WIDTH : gdk_screen_width() - DEFAULT_DOCKAPP_WIDTH;
-				y = 0;
+				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_B, &x, &y);
-				prevDapp->glue[GLUE_B] = dapp;
+				wmdock_dockapp_child_pos(prevDapp, GLUE_L, &x, &y);
+				prevDapp->glue[GLUE_L] = dapp;
 			}
 			break;
 		default:
diff --git a/panel-plugin/misc.c b/panel-plugin/misc.c
index 9d8ab89..248a31b 100644
--- a/panel-plugin/misc.c
+++ b/panel-plugin/misc.c
@@ -176,6 +176,19 @@ GdkDisplay *get_current_gdkdisplay()
 
 
 /**
+ * Return the current GdkScreen.
+ *
+ * @return current GdkScreen
+ */
+GdkScreen *get_current_gdkscreen()
+{
+	if(!wmdock || !wmdock->plugin)
+		return gdk_screen_get_default();
+
+	return gdk_window_get_screen(gtk_widget_get_toplevel(GTK_WIDGET(wmdock->plugin))->window);
+}
+
+/**
  * 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 5a3927e..bb043dc 100644
--- a/panel-plugin/misc.h
+++ b/panel-plugin/misc.h
@@ -25,6 +25,7 @@
 /* Prototypes */
 GdkPixbuf *get_icon_from_xpm_scaled(const char **, gint, gint);
 GdkDisplay *get_current_gdkdisplay();
+GdkScreen *get_current_gdkscreen();
 void set_xsmp_support(WnckWindow *);
 gboolean has_dockapp_hint(WnckWindow *);
 gboolean comp_dockapp_with_filterlist(const gchar *);


More information about the Xfce4-commits mailing list