Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        arrange.c 


Log Message:
Fix a number of window placement bugs.

===================================================================
RCS file: /cvs/e/e16/e/src/arrange.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -3 -r1.93 -r1.94
--- arrange.c   30 Apr 2006 13:23:01 -0000      1.93
+++ arrange.c   2 May 2006 23:27:39 -0000       1.94
@@ -27,6 +27,8 @@
 #include "groups.h"
 #include "screen.h"
 
+#define DEBUG_ARRANGE 0
+
 typedef struct
 {
    void               *data;
@@ -86,6 +88,12 @@
        if ((sorted[j].y + sorted[j].h) < height)
           ysize = ArrangeAddToList(yarray, ysize, sorted[j].y + sorted[j].h);
      }
+#if DEBUG_ARRANGE
+   for (j = 0; j < xsize; j++)
+      Eprintf("xarray[%d] = %d\n", j, xarray[j]);
+   for (j = 0; j < ysize; j++)
+      Eprintf("yarray[%d] = %d\n", j, yarray[j]);
+#endif
 
    /* fill the allocation array */
    for (j = 0; j < (xsize - 1) * (ysize - 1); filled[j++] = 0)
@@ -97,25 +105,28 @@
        y1 = -1;
        y2 = -1;
        for (k = 0; k < xsize - 1; k++)
-         {
-            if (sorted[j].x == xarray[k])
-              {
-                 x1 = k;
-                 x2 = k;
-              }
-            if (sorted[j].x + sorted[j].w == xarray[k + 1])
-               x2 = k;
-         }
+          if (sorted[j].x == xarray[k])
+            {
+               x1 = x2 = k;
+               break;
+            }
+       for (k++; k < xsize; k++)
+          if (sorted[j].x + sorted[j].w > xarray[k])
+             x2 = k;
        for (k = 0; k < ysize - 1; k++)
-         {
-            if (sorted[j].y == yarray[k])
-              {
-                 y1 = k;
-                 y2 = k;
-              }
-            if (sorted[j].y + sorted[j].h == yarray[k + 1])
-               y2 = k;
-         }
+          if (sorted[j].y == yarray[k])
+            {
+               y1 = y2 = k;
+               break;
+            }
+       for (k++; k < ysize; k++)
+          if (sorted[j].y + sorted[j].h > yarray[k])
+             y2 = k;
+#if DEBUG_ARRANGE
+       Eprintf("Fill %4d,%4d %4dx%4d: (%2d)%4d->(%2d)%4d,(%2d)%4d->(%2d)%4d\n",
+               sorted[j].x, sorted[j].y, sorted[j].w, sorted[j].h,
+               x1, xarray[x1], x2, xarray[x2], y1, yarray[y1], y2, yarray[y2]);
+#endif
        if ((x1 >= 0) && (x2 >= 0) && (y1 >= 0) && (y2 >= 0))
          {
             for (y = y1; y <= y2; y++)
@@ -129,6 +140,16 @@
          }
      }
 
+#if DEBUG_ARRANGE
+   Eprintf("Filled[%2d,%2d] =\n", xsize, ysize);
+   for (k = 0; k < ysize - 1; k++)
+     {
+       for (j = 0; j < xsize - 1; j++)
+          printf(" %2d", Filled(j, k));
+       printf("\n");
+     }
+#endif
+
    *nx = xsize;
    *ny = ysize;
 }
@@ -136,10 +157,11 @@
 static void
 ArrangeFindSpaces(const int *xarray, int xsize, const int *yarray, int ysize,
                  unsigned char *filled, RectBox * spaces, int *ns,
-                 RectBox * fit)
+                 RectBox * fit, int must_fit)
 {
-   int                 j, x, y, x1, y1;
+   int                 i, j, x, y, x1, y1, xbest, ybest;
    int                 num_spaces;
+   unsigned int        a, abest;
 
    /* create list of all "spaces" */
    num_spaces = 0;
@@ -148,59 +170,75 @@
        for (x = 0; x < xsize - 1; x++)
          {
             /* if the square is empty "grow" the space */
-            if (Filled(x, y) <= fit->p)
-              {
-                 int                 can_expand_x = 1;
-                 int                 can_expand_y = 1;
+            if (Filled(x, y) > fit->p)
+               continue;
 
-                 Filled(x, y) = 100;
-                 x1 = x + 1;
-                 y1 = y + 1;
-                 if (x >= xsize - 2)
-                    can_expand_x = 0;
-                 if (y >= ysize - 2)
-                    can_expand_y = 0;
-                 while ((can_expand_x) || (can_expand_y))
-                   {
-                      if (x1 >= xsize - 1)
-                         can_expand_x = 0;
-                      if (y1 >= ysize - 1)
-                         can_expand_y = 0;
-                      if (can_expand_x)
-                        {
-                           for (j = y; j < y1; j++)
-                             {
-                                if (Filled(x1, j) > fit->p)
-                                   can_expand_x = 0;
-                             }
-                        }
-                      if (can_expand_x)
-                         x1++;
-                      if (can_expand_y)
+            xbest = x;
+            ybest = y;
+            abest = 0;
+            x1 = xsize - 1;
+#if DEBUG_ARRANGE
+            Eprintf("Check %d,%d: %d,%d\n", x, y, xarray[x], yarray[y]);
+#endif
+            for (j = y; j < ysize - 1;)
+              {
+                 for (i = x; i < x1; i++)
+                   {
+                      if (Filled(i, j) > fit->p)
+                         break;
+                   }
+                 x1 = i;
+                 j++;
+                 if (x1 <= x)
+                    break;
+                 if (must_fit && (xarray[x1] - xarray[x] < fit->w))
+                    continue;
+                 for (; j < ysize - 1; j++)
+                   {
+                      for (i = x; i < x1; i++)
                         {
-                           for (j = x; j < x1; j++)
-                             {
-                                if (Filled(j, y1) > fit->p)
-                                   can_expand_y = 0;
-                             }
+                           if (Filled(i, j) > fit->p)
+                              goto got_one;
                         }
-                      if (can_expand_y)
-                         y1++;
                    }
-                 spaces[num_spaces].x = xarray[x];
-                 spaces[num_spaces].y = yarray[y];
-                 spaces[num_spaces].w = xarray[x1] - xarray[x];
-                 spaces[num_spaces].h = yarray[y1] - yarray[y];
+               got_one:
+                 y1 = j;
+                 if (must_fit && (yarray[y1] - yarray[y] < fit->h))
+                    continue;
+                 a = (xarray[x1] - xarray[x]) * (yarray[y1] - yarray[y]);
+#if DEBUG_ARRANGE
+                 Eprintf("Got %4d,%4d %4dx%4d: %d\n", xarray[x],
+                         yarray[y], xarray[x1] - xarray[x],
+                         yarray[y1] - yarray[y], a);
+#endif
+                 if (a > abest)
+                   {
+                      xbest = x1;
+                      ybest = y1;
+                      abest = a;
+                   }
+              }
+            if (abest == 0)
+               continue;
+
+            spaces[num_spaces].x = xarray[x];
+            spaces[num_spaces].y = yarray[y];
+            spaces[num_spaces].w = xarray[xbest] - xarray[x];
+            spaces[num_spaces].h = yarray[ybest] - yarray[y];
 #if 0
-                 spaces[num_spaces].p = spaces[num_spaces].w >= fit->w &&
-                    spaces[num_spaces].h >= fit->h;
+            spaces[num_spaces].p = spaces[num_spaces].w >= fit->w &&
+               spaces[num_spaces].h >= fit->h;
 #else
-                 spaces[num_spaces].p = 1;
+            spaces[num_spaces].p = 1;
 #endif
-                 num_spaces++;
-              }
+            num_spaces++;
          }
      }
+#if DEBUG_ARRANGE
+   for (j = 0; j < num_spaces; j++)
+      Eprintf("Spaces: x,y=%4d,%4d wxh=%3dx%3d p=%2d\n",
+             spaces[j].x, spaces[j].y, spaces[j].w, spaces[j].h, spaces[j].p);
+#endif
 
    *ns = num_spaces;
 }
@@ -228,7 +266,7 @@
 }
 
 static void
-ArrangeRects(RectBox * fixed, int fixed_count, RectBox * floating,
+ArrangeRects(const RectBox * fixed, int fixed_count, RectBox * floating,
             int floating_count, RectBox * sorted, int startx, int starty,
             int width, int height, int policy, char initial_window)
 {
@@ -260,6 +298,9 @@
        if (height > yy2)
           height = yy2;
      }
+#if DEBUG_ARRANGE
+   Eprintf("Start %d,%d %dx%d\n", startx, starty, width, height);
+#endif
 
    switch (policy)
      {
@@ -330,7 +371,7 @@
 
        /* create list of all "spaces" */
        ArrangeFindSpaces(xarray, xsize, yarray, ysize, filled,
-                         spaces, &num_spaces, floating + i);
+                         spaces, &num_spaces, floating + i, 1);
 
        /* find the first space that fits */
        k = -1;
@@ -363,7 +404,7 @@
             else
               {
                  k = j;
-                 j = num_spaces;
+                 break;
               }
          }
 
@@ -411,6 +452,9 @@
           leftover[num_leftover++] = i;
      }
 
+#if DEBUG_ARRANGE
+   Eprintf("Leftovers: %d\n", num_leftover);
+#endif
    /* ok we cant fit everything in this baby.... time to fit */
    /* the leftovers into the leftover space */
    for (i = 0; i < num_leftover; i++)
@@ -420,7 +464,7 @@
 
        /* create list of all "spaces" */
        ArrangeFindSpaces(xarray, xsize, yarray, ysize, filled,
-                         spaces, &num_spaces, floating + leftover[i]);
+                         spaces, &num_spaces, floating + leftover[i], 0);
 
        /* find the first space that fits */
        k = -1;
@@ -437,52 +481,40 @@
               }
          }
 
-       /* if there's a small space ... */
        if (k >= 0)
          {
+            /* if there's a small space ... */
             sorted[num_sorted].x = spaces[k].x;
             sorted[num_sorted].y = spaces[k].y;
-            sorted[num_sorted].data = floating[leftover[i]].data;
-            sorted[num_sorted].w = floating[leftover[i]].w;
-            sorted[num_sorted].h = floating[leftover[i]].h;
-            if ((sorted[num_sorted].x + sorted[num_sorted].w) > width)
-               sorted[num_sorted].x = width - sorted[num_sorted].w;
-            if ((sorted[num_sorted].y + sorted[num_sorted].h) > height)
-               sorted[num_sorted].y = height - sorted[num_sorted].h;
-            if (sorted[num_sorted].x < startx)
-               sorted[num_sorted].x = startx;
-            if (sorted[num_sorted].y < starty)
-               sorted[num_sorted].y = starty;
-            num_sorted++;
          }
        else
          {
             /* there is no room - put it centered */
             /* (but dont put top left off screen) */
-            sorted[num_sorted].data = floating[leftover[i]].data;
             sorted[num_sorted].x = (width - floating[leftover[i]].w) / 2;
             sorted[num_sorted].y = (height - floating[leftover[i]].h) / 2;
-            sorted[num_sorted].w = floating[leftover[i]].w;
-            sorted[num_sorted].h = floating[leftover[i]].h;
-            if (sorted[num_sorted].x < startx)
-               sorted[num_sorted].x = startx;
-            if (sorted[num_sorted].y < starty)
-               sorted[num_sorted].y = starty;
-            num_sorted++;
          }
+       sorted[num_sorted].data = floating[leftover[i]].data;
+       sorted[num_sorted].w = floating[leftover[i]].w;
+       sorted[num_sorted].h = floating[leftover[i]].h;
+       sorted[num_sorted].p = floating[leftover[i]].p;
+       if ((sorted[num_sorted].x + sorted[num_sorted].w) > width)
+          sorted[num_sorted].x = width - sorted[num_sorted].w;
+       if ((sorted[num_sorted].y + sorted[num_sorted].h) > height)
+          sorted[num_sorted].y = height - sorted[num_sorted].h;
+       if (sorted[num_sorted].x < startx)
+          sorted[num_sorted].x = startx;
+       if (sorted[num_sorted].y < starty)
+          sorted[num_sorted].y = starty;
+       num_sorted++;
      }
 
+#if DEBUG_ARRANGE
    for (i = 0; i < num_sorted; i++)
-     {
-       if ((sorted[i].x + sorted[i].w) > width)
-          sorted[i].x = VRoot.w - sorted[i].w;
-       if ((sorted[i].y + sorted[i].h) > height)
-          sorted[i].y = VRoot.h - sorted[i].h;
-       if (sorted[i].x < startx)
-          sorted[i].x = startx;
-       if (sorted[i].y < starty)
-          sorted[i].y = starty;
-     }
+      Eprintf("Sorted: x,y=%4d,%4d wxh=%3dx%3d p=%2d: %s\n",
+             sorted[i].x, sorted[i].y, sorted[i].w, sorted[i].h, sorted[i].p,
+             (sorted[i].data) ? ((EObj *) sorted[i].data)->name : "?");
+#endif
 
  done:
    /* free up memory */
@@ -800,7 +832,7 @@
                       rb->w = EoGetW(ew);
                       rb->h = EoGetH(ew);
                       rb->p = EoGetLayer(ew);
-#if 0
+#if DEBUG_ARRANGE
                       Eprintf("Add float: x,y=%4d,%4d wxh=%3dx%3d p=%2d: %s\n",
                               rb->x, rb->y, rb->w, rb->h, rb->p, eo->name);
 #endif
@@ -856,7 +888,7 @@
        rb->y = y;
        rb->w = w;
        rb->h = h;
-#if 0
+#if DEBUG_ARRANGE
        Eprintf("Add fixed: x,y=%4d,%4d wxh=%3dx%3d p=%2d: %s\n", rb->x, rb->y,
                rb->w, rb->h, rb->p, eo->name);
 #endif
@@ -865,7 +897,7 @@
      }
 
  done:
-#if 0
+#if DEBUG_ARRANGE
    Eprintf("Fixed: %p/%d  Floating: %p/%d\n", fixed, nfix, floating, nflt);
 #endif
    *pfixed = fixed;
@@ -963,9 +995,9 @@
 
    ret = Emalloc(sizeof(RectBox) * (nflt + nfix));
    ArrangeRects(fixed, nfix, floating, nflt, ret, 0, 0, VRoot.w, VRoot.h,
-               method, 0);
+               method, 1);
 
-   for (i = 0; i < (nflt + nfix); i++)
+   for (i = nfix; i < nflt + nfix; i++)
      {
        if (!ret[i].data)
           continue;




-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to