[Xfce4-commits] <xfce4-wmdock-plugin:0.6.x> Some changes for the DockApp movement.
Andre Ellguth
noreply at xfce.org
Sat Jul 20 00:02:01 CEST 2013
Updating branch refs/heads/0.6.x
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