Here's a patch to wobbly.c to handle edge snapping with multiple outputs...

Also, I tweaked the window edge snapping to include dock window types, to
support the case where dock windows may be on the inner edges of multiple
monitors (and thus currently ignored as struts in the output workarea setup).

I personally think we should include these "inner" struts when calculating the
workarea for each output (which also helps window maximizing), and only
ignore them in the screen workarea case (for the _NET_WORKAREA hint).

Any reason that wouldn't make sense?

...MC
--- plugins/wobbly.c
+++ plugins/wobbly.c
@@ -510,6 +510,9 @@ findNextWestEdge (CompWindow *w,
     int e, end;
     int x;
 
+    int        output;
+    XRectangle workArea;
+
     start = -65535.0f;
     end   =  65535.0f;
 
@@ -518,15 +521,20 @@ findNextWestEdge (CompWindow *w,
 
     x = object->position.x + w->output.left - w->input.left;
 
-    if (x >= w->screen->workArea.x)
+    output = outputDeviceForPoint (w->screen, x, object->position.y);
+    workArea = w->screen->outputDev[output].workArea;
+
+    if (x >= workArea.x)
     {
        CompWindow *p;
 
-       v1 = w->screen->workArea.x;
+       v1 = workArea.x;
 
        for (p = w->screen->windows; p; p = p->next)
        {
-           if (p->invisible || w == p || p->type != CompWindowTypeNormalMask)
+           if (p->invisible || w == p ||
+                   (p->type != CompWindowTypeNormalMask &&
+                    p->type != CompWindowTypeDockMask))
                continue;
 
            s = p->attrib.y - p->output.top;
@@ -566,7 +574,7 @@ findNextWestEdge (CompWindow *w,
     }
     else
     {
-       v2 = w->screen->workArea.x;
+       v2 = workArea.x;
     }
 
     v1 = v1 - w->output.left + w->input.left;
@@ -594,6 +602,9 @@ findNextEastEdge (CompWindow *w,
     int e, end;
     int x;
 
+    int        output;
+    XRectangle workArea; 
+
     start = -65535.0f;
     end   =  65535.0f;
 
@@ -602,15 +613,20 @@ findNextEastEdge (CompWindow *w,
 
     x = object->position.x - w->output.right + w->input.right;
 
-    if (x <= w->screen->workArea.x + w->screen->workArea.width)
+    output = outputDeviceForPoint (w->screen, x, object->position.y);
+    workArea = w->screen->outputDev[output].workArea;
+
+    if (x <= workArea.x + workArea.width)
     {
        CompWindow *p;
 
-       v1 = w->screen->workArea.x + w->screen->workArea.width;
+       v1 = workArea.x + workArea.width;
 
        for (p = w->screen->windows; p; p = p->next)
        {
-           if (p->invisible || w == p || p->type != CompWindowTypeNormalMask)
+           if (p->invisible || w == p ||
+                   (p->type != CompWindowTypeNormalMask &&
+                    p->type != CompWindowTypeDockMask))
                continue;
 
            s = p->attrib.y - p->output.top;
@@ -650,7 +666,7 @@ findNextEastEdge (CompWindow *w,
     }
     else
     {
-       v2 = w->screen->workArea.x + w->screen->workArea.width;
+       v2 = workArea.x + workArea.width;
     }
 
     v1 = v1 + w->output.right - w->input.right;
@@ -678,6 +694,9 @@ findNextNorthEdge (CompWindow *w,
     int e, end;
     int y;
 
+    int        output;
+    XRectangle workArea;
+
     start = -65535.0f;
     end   =  65535.0f;
 
@@ -686,15 +705,20 @@ findNextNorthEdge (CompWindow *w,
 
     y = object->position.y + w->output.top - w->input.top;
 
-    if (y >= w->screen->workArea.y)
+    output = outputDeviceForPoint (w->screen, object->position.x, y);
+    workArea = w->screen->outputDev[output].workArea;
+
+    if (y >= workArea.y)
     {
        CompWindow *p;
 
-       v1 = w->screen->workArea.y;
+       v1 = workArea.y;
 
        for (p = w->screen->windows; p; p = p->next)
        {
-           if (p->invisible || w == p || p->type != CompWindowTypeNormalMask)
+           if (p->invisible || w == p ||
+                   (p->type != CompWindowTypeNormalMask &&
+                    p->type != CompWindowTypeDockMask))
                continue;
 
            s = p->attrib.x - p->output.left;
@@ -734,7 +758,7 @@ findNextNorthEdge (CompWindow *w,
     }
     else
     {
-       v2 = w->screen->workArea.y;
+       v2 = workArea.y;
     }
 
     v1 = v1 - w->output.top + w->input.top;
@@ -762,6 +786,9 @@ findNextSouthEdge (CompWindow *w,
     int e, end;
     int y;
 
+    int        output;
+    XRectangle workArea;
+
     start = -65535.0f;
     end   =  65535.0f;
 
@@ -770,15 +797,20 @@ findNextSouthEdge (CompWindow *w,
 
     y = object->position.y - w->output.bottom + w->input.bottom;
 
-    if (y <= w->screen->workArea.y + w->screen->workArea.height)
+    output = outputDeviceForPoint (w->screen, object->position.x, y);
+    workArea = w->screen->outputDev[output].workArea;
+
+    if (y <= workArea.y + workArea.height)
     {
        CompWindow *p;
 
-       v1 = w->screen->workArea.y + w->screen->workArea.height;
+       v1 = workArea.y + workArea.height;
 
        for (p = w->screen->windows; p; p = p->next)
        {
-           if (p->invisible || w == p || p->type != CompWindowTypeNormalMask)
+           if (p->invisible || w == p ||
+                   (p->type != CompWindowTypeNormalMask &&
+                    p->type != CompWindowTypeDockMask))
                continue;
 
            s = p->attrib.x - p->output.left;
@@ -818,7 +850,7 @@ findNextSouthEdge (CompWindow *w,
     }
     else
     {
-       v2 = w->screen->workArea.y + w->screen->workArea.height;
+       v2 = workArea.y + workArea.height;
     }
 
     v1 = v1 + w->output.bottom - w->input.bottom;
_______________________________________________
compiz mailing list
compiz@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/compiz

Reply via email to