[Xfce4-commits] <xfce4-wmdock-plugin:master> Some work on the dockapp movement.

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


Updating branch refs/heads/master
         to 46586bf9fa10c33273a9066341516825f45e2798 (commit)
       from cc4a1e0fd1a4a67e2adb757e50e6020b066549e5 (commit)

commit 46586bf9fa10c33273a9066341516825f45e2798
Author: Andre Ellguth <andre at ellguth.com>
Date:   Mon Jul 22 18:43:36 2013 +0200

    Some work on the dockapp movement.

 panel-plugin/dockapp.c |  133 ++++++++++++++++++++++++++++--------------------
 panel-plugin/dockapp.h |    4 --
 2 files changed, 77 insertions(+), 60 deletions(-)

diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c
index 4605676..61c7ee9 100644
--- a/panel-plugin/dockapp.c
+++ b/panel-plugin/dockapp.c
@@ -75,26 +75,10 @@ static void wmdock_dockapp_child_pos(DockappNode *prevDapp, gint gluepos, gint *
 		*x = prevx;
 		*y = prevy - DEFAULT_DOCKAPP_HEIGHT;
 		break;
-	case GLUE_TL:
-		*x = prevx - DEFAULT_DOCKAPP_WIDTH;
-		*y = prevy - DEFAULT_DOCKAPP_HEIGHT;
-		break;
-	case GLUE_TR:
-		*x = prevx + DEFAULT_DOCKAPP_WIDTH;
-		*y = prevy - DEFAULT_DOCKAPP_HEIGHT;
-		break;
 	case GLUE_B:
 		*x = prevx;
 		*y = prevy + DEFAULT_DOCKAPP_HEIGHT;
 		break;
-	case GLUE_BL:
-		*x = prevx - DEFAULT_DOCKAPP_WIDTH;
-		*y = prevy + DEFAULT_DOCKAPP_HEIGHT;
-		break;
-	case GLUE_BR:
-		*x = prevx + DEFAULT_DOCKAPP_WIDTH;
-		*y = prevy + DEFAULT_DOCKAPP_HEIGHT;
-		break;
 	case GLUE_L:
 		*x = prevx - DEFAULT_DOCKAPP_WIDTH;
 		*y = prevy;
@@ -108,43 +92,6 @@ static void wmdock_dockapp_child_pos(DockappNode *prevDapp, gint gluepos, gint *
 	}
 }
 
-/**
- * Calculate the next snapable postion of the moving DockApp.
- *
- * @parm dapp The moving DockApp.
- * @parm gluepos Pointer to the glue position of the determined DockApp.
- * @return The determined DockApp or NULL.
- */
-static DockappNode *wmdock_get_snapable_dockapp(DockappNode *dapp, gint *gluepos)
-{
-	#define SNAPDELTA (DEFAULT_DOCKAPP_HEIGHT/2)-1
-	gint posx, posy, gluex, gluey;
-	GList *dapps;
-	DockappNode *_dapp = NULL;
-
-	gtk_window_get_position(
-			GTK_WINDOW (GTK_WIDGET (dapp->tile)), &posx, &posy);
-
-	dapps = g_list_first(wmdock->dapps);
-
-	while(dapps) {
-		if((_dapp = DOCKAPP(dapps->data))) {
-			for(*gluepos = 0; *gluepos < GLUE_MAX; *gluepos=*gluepos+1) {
-				if(!_dapp->glue[*gluepos] || !g_strcmp0(_dapp->glue[*gluepos]->name, DOCKAPP_DUMMY_TITLE)) {
-					wmdock_dockapp_child_pos(_dapp, *gluepos, &gluex, &gluey);
-					if(posx >= gluex-SNAPDELTA && posy >= gluey-SNAPDELTA &&
-							posx <= gluex+SNAPDELTA && posy <= gluey+SNAPDELTA)
-						return _dapp;
-				}
-			}
-		}
-
-		dapps = g_list_next(dapps);
-	}
-
-	return NULL;
-}
-
 
 /**
  * Determine the main anchor DockApp.
@@ -191,6 +138,73 @@ static DockappNode *wmdock_get_primary_anchor_dockapp()
 
 
 /**
+ * Calculate the next snapable postion of the moving DockApp.
+ *
+ * @parm dapp The moving DockApp.
+ * @parm gluepos Pointer to the glue position of the determined DockApp.
+ * @return The determined DockApp or NULL.
+ */
+static DockappNode *wmdock_get_snapable_dockapp(DockappNode *dapp, gint *gluepos)
+{
+	#define SNAPDELTA (DEFAULT_DOCKAPP_HEIGHT/2)-1
+	gint posx, posy, gluex, gluey;
+	gint possible = GLUE_T | GLUE_B | GLUE_L | GLUE_R;
+	gboolean prim;
+	GList *dapps;
+	DockappNode *_dapp = NULL;
+
+	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:
+		possible^= prim == TRUE ? GLUE_T : 0;
+		break;
+	case XFCE_SCREEN_POSITION_SW_H:
+	case XFCE_SCREEN_POSITION_S:
+	case XFCE_SCREEN_POSITION_SE_H:
+		possible^= prim == TRUE ? GLUE_B : 0;
+		break;
+	case XFCE_SCREEN_POSITION_NW_V:
+	case XFCE_SCREEN_POSITION_W:
+	case XFCE_SCREEN_POSITION_SW_V:
+		possible^= prim == TRUE ? GLUE_T : 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;
+		break;
+	}
+
+	gtk_window_get_position(
+			GTK_WINDOW (GTK_WIDGET (dapp->tile)), &posx, &posy);
+
+	dapps = g_list_first(wmdock->dapps);
+
+	while(dapps) {
+		if((_dapp = DOCKAPP(dapps->data))) {
+			for(*gluepos = 0; *gluepos < GLUE_MAX; *gluepos=*gluepos+1) {
+				if((!_dapp->glue[*gluepos] || !g_strcmp0(_dapp->glue[*gluepos]->name, DOCKAPP_DUMMY_TITLE))
+						&& (possible & *gluepos)) {
+					wmdock_dockapp_child_pos(_dapp, *gluepos, &gluex, &gluey);
+					if(posx >= gluex-SNAPDELTA && posy >= gluey-SNAPDELTA &&
+							posx <= gluex+SNAPDELTA && posy <= gluey+SNAPDELTA)
+						return _dapp;
+				}
+			}
+		}
+
+		dapps = g_list_next(dapps);
+	}
+
+	return NULL;
+}
+
+
+/**
  * Remove anchors of dummy DockApp.
  */
 static void wmdock_remove_anchors_tile_dummy()
@@ -223,9 +237,12 @@ static void wmdock_remove_anchors_tile_dummy()
 static gboolean wmdock_replace_tile_dummy(DockappNode *dapp)
 {
 	gint i;
+	gboolean prim;
 	GList *dapps;
 	DockappNode *_dapp = NULL;
 
+	prim = (dapp == wmdock_get_primary_anchor_dockapp()) ? TRUE : FALSE;
+
 	dapps = g_list_first(wmdock->dapps);
 	while(dapps) {
 		if((_dapp = DOCKAPP(dapps->data))) {
@@ -234,8 +251,8 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp)
 					g_list_foreach(wmdock->dapps, (GFunc) wmdock_remove_anchor_dockapp, dapp);
 					_dapp->glue[i] = dapp;
 					for(i = 0; i < GLUE_MAX; i++) {
-						if(dapp->glue[i] == _dapp) {
-							/* Remove old anchor itself. */
+						if((dapp->glue[i] == _dapp) || prim == TRUE) {
+							/* Remove old anchor itself or all anchors it was the first anchor. */
 							dapp->glue[i] = NULL;
 						}
 					}
@@ -471,7 +488,7 @@ void wmdock_remove_anchor_dockapp(DockappNode *anchor, DockappNode *dapp)
 
 	for(i = 0; i < GLUE_MAX; i++) {
 		if(anchor->glue[i] == dapp) {
-			debug("Remove glue from parent: %s", anchor->name);
+			debug("Remove dockapp `%s' from the parent: `%s'", anchor->glue[i]->name, anchor->name);
 			anchor->glue[i] = NULL;
 		}
 	}
@@ -778,6 +795,7 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp)
 		case XFCE_SCREEN_POSITION_N:
 		case XFCE_SCREEN_POSITION_NE_H:
 			if(!prevDapp) {
+				/* From the top to the bottom. */
 				x = gdk_screen_width() - DEFAULT_DOCKAPP_WIDTH;
 				y = panelx == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0;
 			} else {
@@ -790,6 +808,7 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp)
 		case XFCE_SCREEN_POSITION_S:
 		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;
 			} else {
@@ -801,6 +820,7 @@ 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. */
 				x = panely == 0 ? xfce_panel_plugin_get_size(wmdock->plugin) : 0;
 				y = 0;
 			} else {
@@ -812,6 +832,7 @@ void wmdock_set_autoposition_dockapp(DockappNode *dapp, DockappNode *prevDapp)
 		case XFCE_SCREEN_POSITION_E:
 		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;
 			} else {
diff --git a/panel-plugin/dockapp.h b/panel-plugin/dockapp.h
index 035f5b9..21cb884 100644
--- a/panel-plugin/dockapp.h
+++ b/panel-plugin/dockapp.h
@@ -30,10 +30,6 @@ enum GluePosition {
 	GLUE_B    = 2,
 	GLUE_L    = 4,
 	GLUE_R    = 8,
-	GLUE_TL   = GLUE_T | GLUE_L,
-	GLUE_TR   = GLUE_T | GLUE_R,
-	GLUE_BL   = GLUE_B | GLUE_L,
-	GLUE_BR   = GLUE_B | GLUE_R,
 	GLUE_MAX
 };
 


More information about the Xfce4-commits mailing list