[Xfce4-commits] <xfce4-wmdock-plugin:master> Some changes for the DockApp movement.

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


Updating branch refs/heads/master
         to cc4a1e0fd1a4a67e2adb757e50e6020b066549e5 (commit)
       from 59a627add3b45886ba8d76b8fb40a2f1cbed6e6c (commit)

commit cc4a1e0fd1a4a67e2adb757e50e6020b066549e5
Author: Andre Ellguth <andre at ellguth.com>
Date:   Fri Jul 19 23:59:00 2013 +0200

    Some changes for the DockApp movement.

 panel-plugin/catchwindow.c |    3 +-
 panel-plugin/dockapp.c     |   70 +++++++++++++++++++++++++++++++++++++-------
 2 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/panel-plugin/catchwindow.c b/panel-plugin/catchwindow.c
index c630993..0daf78d 100644
--- a/panel-plugin/catchwindow.c
+++ b/panel-plugin/catchwindow.c
@@ -242,8 +242,7 @@ void wmdock_window_open(WnckScreen *s, WnckWindow *w)
 			}
 
 			/* Setup the event handler for the window. */
-			g_signal_connect(dapp->tile, "event-after", G_CALLBACK(wmdock_dockapp_paneloff_handler),
-					dapp);
+			g_signal_connect(dapp->tile, "event-after", G_CALLBACK(wmdock_dockapp_paneloff_handler), dapp);
 		}
 		/* Clear the noisy background. */
 		wmdock_redraw_dockapp(dapp);
diff --git a/panel-plugin/dockapp.c b/panel-plugin/dockapp.c
index 302df65..4605676 100644
--- a/panel-plugin/dockapp.c
+++ b/panel-plugin/dockapp.c
@@ -115,7 +115,7 @@ static void wmdock_dockapp_child_pos(DockappNode *prevDapp, gint gluepos, gint *
  * @parm gluepos Pointer to the glue position of the determined DockApp.
  * @return The determined DockApp or NULL.
  */
-static DockappNode *wmdock_determine_snapable_dockapp(DockappNode *dapp, gint *gluepos)
+static DockappNode *wmdock_get_snapable_dockapp(DockappNode *dapp, gint *gluepos)
 {
 	#define SNAPDELTA (DEFAULT_DOCKAPP_HEIGHT/2)-1
 	gint posx, posy, gluex, gluey;
@@ -147,6 +147,50 @@ static DockappNode *wmdock_determine_snapable_dockapp(DockappNode *dapp, gint *g
 
 
 /**
+ * Determine the main anchor DockApp.
+ *
+ * @return DockappNode which is the main anchor otherwise NULL.
+ */
+static DockappNode *wmdock_get_primary_anchor_dockapp()
+{
+	gint i;
+	GList *dapps1, *dapps2;
+	DockappNode *dapp1 = NULL, *dapp2 = NULL;
+
+	dapps1 = g_list_first(wmdock->dapps);
+
+	while(dapps1) {
+		if(!(dapp1 = DOCKAPP(dapps1->data)))
+			continue;
+
+		dapps2 = g_list_first(wmdock->dapps);
+		while(dapps2) {
+			if(!(dapp2 = DOCKAPP(dapps2->data)))
+				continue;
+
+			for(i = 0; i < GLUE_MAX; i++) {
+				if(dapp2->glue[i] == dapp1)
+					break;
+			}
+			if(dapp2->glue[i] == dapp1)
+				break;
+
+			dapps2 = g_list_next(dapps2);
+		}
+		/* Main anchor DockApp found. */
+		if(!dapps2) {
+			debug("dockapp.c: Found primary dockapp `%s'", dapp1->name);
+			return(dapp1);
+		}
+
+		dapps1 = g_list_next(dapps1);
+	}
+
+	return NULL;
+}
+
+
+/**
  * Remove anchors of dummy DockApp.
  */
 static void wmdock_remove_anchors_tile_dummy()
@@ -206,6 +250,7 @@ static gboolean wmdock_replace_tile_dummy(DockappNode *dapp)
 	return FALSE;
 }
 
+
 /**
  * Event handler for the tile in panel off mode.
  *
@@ -218,15 +263,20 @@ void wmdock_dockapp_paneloff_handler(GtkWidget *tile, GdkEvent *ev, DockappNode
 	static DockappNode *dappOnMove = NULL, *dappDummy = NULL;
 	DockappNode *dappSnap = NULL;
 	gint gluepos;
+	GdkModifierType gdkmodtype;
 
-	debug("dockapp.c: Window event: %d. (dapp: %s), dappOnMove: %s", ev->type, dapp->name,
+	debug("dockapp.c: Window event after: %d. (dapp: %s), dappOnMove: %s", ev->type, dapp->name,
 			dappOnMove ? "Yes": "No");
 
 	switch(ev->type) {
+	case GDK_BUTTON_PRESS:
+	case GDK_KEY_PRESS:
+		dappOnMove = dapp;
+		break;
 	case GDK_CONFIGURE: /* Movement. */
 		if(dappOnMove) {
 			wmdock_remove_anchors_tile_dummy();
-			dappSnap = wmdock_determine_snapable_dockapp(dapp, &gluepos);
+			dappSnap = wmdock_get_snapable_dockapp(dapp, &gluepos);
 			if(dappSnap) {
 				debug("dockapp.c: Snapable dockapp `%s' for dockapp `%s', glue: %d.", dappSnap->name, dapp->name, gluepos);
 				if(!dappDummy) {
@@ -242,17 +292,17 @@ void wmdock_dockapp_paneloff_handler(GtkWidget *tile, GdkEvent *ev, DockappNode
 				gtk_widget_hide(dappDummy->tile);
 			}
 		}
-		break;
-	case GDK_BUTTON_PRESS:
-	case GDK_KEY_PRESS:
-		dappOnMove = dapp;
-		break;
+
+		gdk_window_get_pointer(tile->window, NULL, NULL, &gdkmodtype);
+		if(!(dappOnMove && gdkmodtype && !(gdkmodtype & GDK_BUTTON1_MASK)))
+			break;
+		/* No break if DockApp is moved and mouse btn released. */
 	case GDK_BUTTON_RELEASE:
 	case GDK_KEY_RELEASE:
 		debug("dockapp.c: Window event button release on `%s'.", dapp->name);
 		if(wmdock_replace_tile_dummy(dapp) == TRUE) {
 			debug("dockapp.c: Replaceable dummy tile found.");
-			wmdock_order_dockapps(DOCKAPP(g_list_first(wmdock->dapps)->data));
+			wmdock_order_dockapps(wmdock_get_primary_anchor_dockapp() ? wmdock_get_primary_anchor_dockapp() : dapp);
 		} else {
 			wmdock_remove_anchors_tile_dummy();
 			wmdock_set_autoposition_dockapp(dapp, wmdock_get_parent_dockapp(dapp));
@@ -269,7 +319,7 @@ void wmdock_dockapp_paneloff_handler(GtkWidget *tile, GdkEvent *ev, DockappNode
 			g_list_foreach(wmdock->dapps, (GFunc) wmdock_dockapp_tofront, NULL);
 		}
 		if(dappOnMove) {
-			wmdock_set_autoposition_dockapp(dapp, wmdock_get_parent_dockapp(dapp));
+			//wmdock_set_autoposition_dockapp(dapp, wmdock_get_parent_dockapp(dapp));
 		}
 		break;
 	case GDK_VISIBILITY_NOTIFY:


More information about the Xfce4-commits mailing list