Updating branch refs/heads/0.6.x
         to cc4a1e0fd1a4a67e2adb757e50e6020b066549e5 (commit)
       from 59a627add3b45886ba8d76b8fb40a2f1cbed6e6c (commit)

commit cc4a1e0fd1a4a67e2adb757e50e6020b066549e5
Author: Andre Ellguth <an...@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:
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to