Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_border.c e_gadman.h e_maximize.c 


Log Message:


2 pending patches in my inbox.

1. "allow overlap" patch for modules - needs better names in the gui (Allow
windows to overlap maybe - as allow overlap is very vague)
2. itray module (buggy - buggy - beware. i know why. beware i said!)
3. TODO items

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v
retrieving revision 1.475
retrieving revision 1.476
diff -u -3 -r1.475 -r1.476
--- e_border.c  8 Jan 2006 12:32:15 -0000       1.475
+++ e_border.c  20 Jan 2006 04:04:12 -0000      1.476
@@ -1481,14 +1481,13 @@
    if ((bd->shaded) || (bd->shading)) return;
    if (bd->fullscreen)
      e_border_unfullscreen(bd);
-   if( bd->maximized == E_MAXIMIZE_VERTICAL && max == E_MAXIMIZE_VERTICAL )
+   if (bd->maximized == E_MAXIMIZE_VERTICAL && max == E_MAXIMIZE_VERTICAL)
      ; // ignore. we are already maximized vertical.
-   else if( bd->maximized == E_MAXIMIZE_HORIZONTAL && max == 
E_MAXIMIZE_HORIZONTAL )
+   else if (bd->maximized == E_MAXIMIZE_HORIZONTAL && max == 
E_MAXIMIZE_HORIZONTAL)
      ; // ignore. we are already maximized horizontaly.
-   else if ( ( bd->maximized == E_MAXIMIZE_NONE ||
-              bd->maximized == E_MAXIMIZE_VERTICAL ||
-              bd->maximized == E_MAXIMIZE_HORIZONTAL )
-          )
+   else if (( bd->maximized == E_MAXIMIZE_NONE ||
+             bd->maximized == E_MAXIMIZE_VERTICAL ||
+             bd->maximized == E_MAXIMIZE_HORIZONTAL))
      {
        int x1, y1, x2, y2;
        int w, h;
@@ -1499,13 +1498,13 @@
             return;
          }
        
-       if( !bd->maximized ) // E_MAXIMIZE_NONE
-       {
-         bd->saved.x = bd->x;
-         bd->saved.y = bd->y;
-         bd->saved.w = bd->w;
-         bd->saved.h = bd->h;
-       }
+       if (!bd->maximized) // E_MAXIMIZE_NONE
+         {
+            bd->saved.x = bd->x; 
+            bd->saved.y = bd->y; 
+            bd->saved.w = bd->w; 
+            bd->saved.h = bd->h;
+         }
        e_hints_window_size_set(bd);
 
        e_border_raise(bd);
@@ -1582,13 +1581,13 @@
              e_border_move_resize(bd, x1, y1, w, h);
              break;
            case E_MAXIMIZE_VERTICAL:
-             x1 = bd->zone->x;
+             x1 = bd->x;
              y1 = bd->zone->y;
-             x2 = bd->zone->x + bd->zone->w;
+             x2 = bd->x + bd->w;
              y2 = bd->zone->y + bd->zone->h;
 
              /* walk through all gadgets */
-             e_maximize_border_gadman_fill(bd, &x1, &y1, &x2, &y2);
+             e_maximize_border_gadman_fit(bd, &x1, &y1, &x2, &y2);
 
              /* walk through docks and toolbars */
              //e_maximize_border_dock_fit(bd, &x1, &y1, &x2, &y2);
@@ -1604,12 +1603,12 @@
              break;
            case E_MAXIMIZE_HORIZONTAL:
              x1 = bd->zone->x;
-             y1 = bd->zone->y;
+             y1 = bd->y;
              x2 = bd->zone->x + bd->zone->w;
-             y2 = bd->zone->y + bd->zone->h;
+             y2 = bd->y + bd->h;
 
              /* walk through all gadgets */
-             e_maximize_border_gadman_fill(bd, &x1, &y1, &x2, &y2);
+             e_maximize_border_gadman_fit(bd, &x1, &y1, &x2, &y2);
 
              /* walk through docks and toolbars */
              //e_maximize_border_dock_fit(bd, &x1, &y1, &x2, &y2);
@@ -1624,8 +1623,8 @@
              e_border_move_resize(bd,x1,y1,w,h);
              break;
          }
-       if( (bd->maximized == E_MAXIMIZE_HORIZONTAL && max == 
E_MAXIMIZE_VERTICAL) ||
-           (bd->maximized == E_MAXIMIZE_VERTICAL && max == 
E_MAXIMIZE_HORIZONTAL) )
+       if ((bd->maximized == E_MAXIMIZE_HORIZONTAL && max == 
E_MAXIMIZE_VERTICAL) ||
+           (bd->maximized == E_MAXIMIZE_VERTICAL && max == 
E_MAXIMIZE_HORIZONTAL))
          bd->maximized = e_config->maximize_policy;
        else
          bd->maximized = max;
@@ -1659,47 +1658,47 @@
         case E_MAXIMIZE_SMART:
         case E_MAXIMIZE_EXPAND:
         case E_MAXIMIZE_FILL:
-          if( max == E_MAXIMIZE_VERTICAL )
-          {
-            bd->maximized = E_MAXIMIZE_NONE;
-            e_hints_window_maximized_set(bd, 0);
-
-            bd->maximized = E_MAXIMIZE_HORIZONTAL;
-            e_hints_window_maximized_set(bd, 1);
-
-            e_border_move_resize( bd, bd->x, bd->saved.y, bd->w, bd->saved.h);
-            e_hints_window_size_unset(bd);
+          if (max == E_MAXIMIZE_VERTICAL)
+            { 
+               bd->maximized = E_MAXIMIZE_NONE;
+               e_hints_window_maximized_set(bd, 0);
+
+               bd->maximized = E_MAXIMIZE_HORIZONTAL;
+               e_hints_window_maximized_set(bd, 1);
+
+               e_border_move_resize(bd, bd->x, bd->saved.y, bd->w, 
bd->saved.h);
+               e_hints_window_size_unset(bd);
+
+               //edje_object_signal_emit(bd->bg_object, "unmaximize", "");
+            }
+          if (max == E_MAXIMIZE_HORIZONTAL)
+            { 
+               bd->maximized = E_MAXIMIZE_NONE;
+               e_hints_window_maximized_set(bd, 0);
 
-            //edje_object_signal_emit(bd->bg_object, "unmaximize", "");
-          }
-          if( max == E_MAXIMIZE_HORIZONTAL )
-          {
-            bd->maximized = E_MAXIMIZE_NONE;
-            e_hints_window_maximized_set(bd, 0);
+               bd->maximized = E_MAXIMIZE_VERTICAL;
+               e_hints_window_maximized_set(bd, 1);
 
-            bd->maximized = E_MAXIMIZE_VERTICAL;
-            e_hints_window_maximized_set(bd, 1);
+               e_border_move_resize(bd, bd->saved.x, bd->y, bd->saved.w, 
bd->h);
+               e_hints_window_size_unset(bd);
 
-            e_border_move_resize( bd, bd->saved.x, bd->y, bd->saved.w, bd->h);
-            e_hints_window_size_unset(bd);
-
-            //edje_object_signal_emit(bd->bg_object, "unmaximize", "");
-          }
+               //edje_object_signal_emit(bd->bg_object, "unmaximize", "");
+            }
           break;
         case E_MAXIMIZE_VERTICAL:
-          if( max == E_MAXIMIZE_HORIZONTAL )
+          if (max == E_MAXIMIZE_HORIZONTAL)
             ; // do nothing in this case
-          if( max == E_MAXIMIZE_VERTICAL )
-          {
-            bd->maximized = E_MAXIMIZE_NONE;
-            e_hints_window_maximized_set(bd, 0);
+          if (max == E_MAXIMIZE_VERTICAL)
+            { 
+               bd->maximized = E_MAXIMIZE_NONE;
+               e_hints_window_maximized_set(bd, 0);
+
+               e_border_move_resize(bd, bd->saved.x, bd->saved.y, bd->saved.w, 
bd->saved.h);
+               bd->saved.x = bd->saved.y = bd->saved.w = bd->saved.h = 0;
+               e_hints_window_size_unset(bd);
 
-            e_border_move_resize( bd, bd->saved.x, bd->saved.y, bd->saved.w, 
bd->saved.h);
-            bd->saved.x = bd->saved.y = bd->saved.w = bd->saved.h = 0;
-            e_hints_window_size_unset(bd);
-
-            edje_object_signal_emit(bd->bg_object, "unmaximize", "");
-          }
+               edje_object_signal_emit(bd->bg_object, "unmaximize", "");
+            }
           break;
         case E_MAXIMIZE_HORIZONTAL:
           if( max == E_MAXIMIZE_VERTICAL )
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_gadman.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- e_gadman.h  23 Sep 2005 23:40:45 -0000      1.15
+++ e_gadman.h  20 Jan 2006 04:04:12 -0000      1.16
@@ -13,7 +13,10 @@
    E_GADMAN_POLICY_HSIZE = 1 << 9,
    E_GADMAN_POLICY_VSIZE = 1 << 10,
    E_GADMAN_POLICY_HMOVE = 1 << 11,
-   E_GADMAN_POLICY_VMOVE = 1 << 12
+   E_GADMAN_POLICY_VMOVE = 1 << 12,
+   /* more extra flags */
+   E_GADMAN_POLICY_ALLOW_OVERLAP = 1 << 15,
+   E_GADMAN_POLICY_ALWAYS_ON_TOP = 1 << 16 // not used yet
 } E_Gadman_Policy;
 
 typedef enum _E_Gadman_Change
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_maximize.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- e_maximize.c        7 Jan 2006 10:39:45 -0000       1.5
+++ e_maximize.c        20 Jan 2006 04:04:12 -0000      1.6
@@ -10,6 +10,15 @@
    int x1, y1, x2, y2;
 };
 
+struct _m_zone
+{
+  int x1;
+  int y1;
+  int x2;
+  int y2;
+  int area;
+};
+
 #define OBSTACLE(_x1, _y1, _x2, _y2) \
    { \
       r = E_NEW(E_Maximize_Rect, 1); \
@@ -19,61 +28,140 @@
 
 static void _e_maximize_border_rects_fill(E_Border *bd, Evas_List *list, int 
*x1, int *y1, int *x2, int *y2);
 
+static int _e_mzone_split(Evas_List **add_splits_to, struct _m_zone *mzone, 
E_Gadman_Client *gmc);
+
+int _e_mzone_cb_square_reverse_sort(void *e1, void *e2);
+int _e_mzone_cb_width_reverse_sort(void *e1, void *e2);
+int _e_mzone_cb_height_reverse_sort(void *e1, void *e2); // not used yet
+
 EAPI void
 e_maximize_border_gadman_fit(E_Border *bd, int *x1, int *y1, int *x2, int *y2)
 {
-   Evas_List *l;
-   int cx1, cx2, cy1, cy2;
+  int ii, jj;
+  Evas_List *l, *ll;
 
-   cx1 = bd->zone->x;
-   if (x1) cx1 = *x1;
-   
-   cy1 = bd->zone->y;
-   if (y1) cy1 = *y1;
-   
-   cx2 = bd->zone->x + bd->zone->w;
-   if (x2) cx2 = *x2;
+  Evas_List *mzones = NULL;
+  Evas_List *tmp_mzones = NULL;
 
-   cy2 = bd->zone->y + bd->zone->h;
-   if (y2) cy2 = *y2;
+  struct _m_zone *mzone = NULL;
+  struct _m_zone *mzone_split;
 
-   /* Find the smallest box */
-   for (l = bd->zone->container->gadman->clients; l; l = l->next)
-     {
-       E_Gadman_Client *gmc;
-       double ax, ay;
+  mzone = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+  if (mzone == NULL)
+    return;
 
-       gmc = l->data;
-       if ((gmc->zone != bd->zone)) continue;
+  mzone->x1 = bd->zone->x;
+  if (x1) mzone->x1 = *x1;
+
+  mzone->y1 = bd->zone->y;
+  if (y1) mzone->y1 = *y1;
+
+  mzone->x2 = bd->zone->x + bd->zone->w;
+  if (x2) mzone->x2 = *x2;
+
+  mzone->y2 = bd->zone->y + bd->zone->h;
+  if (y2) mzone->y2 = *y2;
+
+  mzones = evas_list_append(mzones, mzone);
+
+  for(l = bd->zone->container->gadman->clients; l; l = l->next)
+    {
+      E_Gadman_Client *gmc;
+
+      gmc = l->data;
+      if (gmc->zone != bd->zone || gmc->policy & 
E_GADMAN_POLICY_ALLOW_OVERLAP) continue;
+
+      tmp_mzones = mzones;
+      mzones = NULL;
 
-       ax = gmc->ax;
-       ay = gmc->ay;
+      for (ll = tmp_mzones; ll; ll = ll->next)
+      {
+        int res;
+        mzone = ll->data;
 
-       if (((ax == 0.0) || (ax == 1.0)) &&
-           ((ay == 0.0) || (ay == 1.0)))
+        res = _e_mzone_split(&mzones, mzone, gmc);
+        if (res == 0)
          {
-            /* corner gadget */
-            /* Fake removal from one alignment :) */
-            if (gmc->w > gmc->h)
-              ax = 0.5;
-            else
-              ay = 0.5;
+           if(mzones == NULL)
+             mzones = evas_list_append(mzones, mzone);
+           else
+             evas_list_append(mzones , mzone);
+           ll->data = NULL;
          }
+        else if (res == 2)
+          ;
+        else if (res == -1)
+          ; /* mem problems. Let ignor them yet */
 
-       if ((ax == 0.0) && (gmc->x + gmc->w) > cx1)
-         cx1 = (gmc->x + gmc->w);
-       else if ((ax == 1.0) && (gmc->x < cx2))
-         cx2 = gmc->x;
-       else if ((ay == 0.0) && ((gmc->y + gmc->h) > cy1))
-         cy1 = (gmc->y + gmc->h);
-       else if ((ay == 1.0) && (gmc->y < cy2))
-         cy2 = gmc->y;
-     }
-
-   if (x1) *x1 = cx1;
-   if (y1) *y1 = cy1;
-   if (x2) *x2 = cx2;
-   if (y2) *y2 = cy2;
+        if (ll->data != NULL)
+         {
+           free(ll->data);
+           ll->data = NULL;
+         }
+      }
+      evas_list_free(tmp_mzones);
+      tmp_mzones = NULL;
+    }
+
+  for (l = mzones; l; l = l->next)
+    {
+      mzone = l->data;
+      mzone->area = (mzone->x2 - mzone->x1) * (mzone->y2 - mzone->y1);
+    }
+
+  tmp_mzones = evas_list_sort(mzones, evas_list_count(mzones), 
_e_mzone_cb_square_reverse_sort);
+  mzones = NULL;
+
+  mzones = evas_list_append(mzones, tmp_mzones->data);
+
+  for (l = tmp_mzones->next; l; l = l->next)
+    {
+      if ( ((struct _m_zone *)l->data)->area ==
+           ((struct _m_zone *)mzones->data)->area)
+        evas_list_append(mzones, l->data);
+      else
+        free(l->data);
+    }
+  tmp_mzones = evas_list_free(tmp_mzones);
+  tmp_mzones = NULL;
+
+  if (mzones != NULL && mzones->next == NULL)
+    {
+      mzone = mzones->data;
+      *x1 = mzone->x1;
+      *y1 = mzone->y1;
+      *x2 = mzone->x2;
+      *y2 = mzone->y2;
+    }
+  else if (mzones != NULL && mzones->next != NULL)
+    {
+      Evas_List *wl = NULL, *hl = NULL;
+
+      /* The use of *_width_reverse_sort or *_height_reverse_sort depends
+       * on the preferences of the user - what window he/she would like to
+       * have: (i) maximized verticaly or (ii) horisontaly.
+       */
+      wl = evas_list_sort(mzones, evas_list_count(mzones), 
_e_mzone_cb_width_reverse_sort);
+      mzones = NULL;
+     // hl = evas_list_sort(mzones, -1, _e_mzone_cb_height_reverse_sort);
+
+      mzone = wl->data;
+      //mzone = hl->data;
+      *x1 = mzone->x1;
+      *y1 = mzone->y1;
+      *x2 = mzone->x2;
+      *y2 = mzone->y2;
+
+     // evas_list_free( wl );
+     // evas_list_free( hl );
+
+      mzones = wl;
+    }
+
+  for (l = mzones; l ; l = l->next)
+    if (l->data != NULL)
+      free(l->data);
+  mzones = evas_list_free(mzones);
 }
 
 EAPI void
@@ -302,3 +390,698 @@
    if (x2) *x2 = cx2;
    if (y2) *y2 = cy2;
 }
+
+int _e_mzone_split(Evas_List **add_splits_to, struct _m_zone *mzone, 
E_Gadman_Client *gmc)
+{
+  int ii;
+  int mzone_splitted = 0;
+  struct _m_zone *mzone_split = NULL;
+
+  if (mzone == NULL || gmc == NULL)
+    return -1;
+
+  if ((mzone->x2 - mzone->x1) <= 0 || (mzone->y2 - mzone->y1) <= 0)
+    return 1;
+
+  if (gmc->x > mzone->x1 && gmc->y > mzone->y1 && 
+      gmc->x + gmc->w < mzone->x2 && gmc->y + gmc->h < mzone->y2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 8; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if(mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 1:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = gmc->y;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y + gmc->h;
+            break;
+          case 2:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 3:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = gmc->y + gmc->h;
+            break;
+          case 4:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 5:
+            mzone_split->x1 = gmc->x;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x + gmc->w;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 6:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 7:
+            mzone_split->x1 = gmc->x;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = gmc->x + gmc->w;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    } // if
+  else if (gmc->x + gmc->w > mzone->x1 && gmc->x + gmc->w < mzone->x2 &&
+          gmc->y + gmc->h > mzone->y1 && gmc->y + gmc->h < mzone->y2 &&
+          gmc->x <= mzone->x1 && gmc->y <= mzone->y1)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 4; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y + gmc->h;
+            break;
+          case 1:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 2:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 3:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = gmc->x + gmc->w;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x > mzone->x1 && gmc->y <= mzone->y1 &&
+          gmc->x + gmc->w < mzone->x2 &&
+          gmc->y + gmc->h > mzone->y1 && gmc->y + gmc->h < mzone->y2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 6; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = gmc->y + gmc->h;
+            break;
+          case 1:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y + gmc->h;
+            break;
+          case 2:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 3:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 4:
+            mzone_split->x1 = gmc->x;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = gmc->x + gmc->w;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 5:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x > mzone->x1 && gmc->x < mzone->x2 &&
+          gmc->y + gmc->h > mzone->y1 && gmc->y + gmc->h < mzone->y2 &&
+          gmc->y <= mzone->y1 &&
+          gmc->x + gmc->w >= mzone->x2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 4; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = gmc->y + gmc->h;
+            break;
+          case 1:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 2:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 3:
+            mzone_split->x1 = gmc->x;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x > mzone->x1 && gmc->x < mzone->x2 &&
+          gmc->y > mzone->y1 &&
+          gmc->y + gmc->h < mzone->y2 &&
+          gmc->x + gmc->w >= mzone->x2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 6; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 1:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = gmc->y + gmc->h;
+            break;
+          case 2:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 3:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 4:
+            mzone_split->x1 = gmc->x;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 5:
+            mzone_split->x1 = gmc->x;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x > mzone->x1 && gmc->x < mzone->x2 &&
+          gmc->y > mzone->y1 && gmc->y < mzone->y2 &&
+          gmc->x + gmc->w >= mzone->x2 &&
+          gmc->y + gmc->h >= mzone->y2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 4; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 1:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 2:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 3:
+            mzone_split->x1 = gmc->x;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x > mzone->x1 &&
+          gmc->y > mzone->y1 && gmc->y < mzone->y2 &&
+          gmc->x + gmc->w < mzone->x2 &&
+          gmc->y + gmc->h >= mzone->y2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 6; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 1:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 2:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = gmc->y;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 3:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 4:
+            mzone_split->x1 = gmc->x;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x + gmc->w;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 5:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if(*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x <= mzone->x1 &&
+          gmc->y > mzone->y1 && gmc->y < mzone->y2 &&
+          gmc->x + gmc->w > mzone->x1 && gmc->x + gmc->w < mzone->x2 &&
+          gmc->y + gmc->h >= mzone->y2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 4; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+         case 1:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = gmc->y;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 2:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x + gmc->w;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 3:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x <= mzone->x1 &&
+          gmc->y > mzone->y1 &&
+          gmc->y + gmc->h < mzone->y2 &&
+          gmc->x + gmc->w > mzone->x1 && gmc->x + gmc->w < mzone->x2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 6; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 1:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = gmc->y;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y + gmc->h;
+            break;
+          case 2:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 3:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x + gmc->w;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 4:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 5:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = gmc->x + gmc->w;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x <= mzone->x1 && gmc->y <= mzone->y1 &&
+          gmc->x + gmc->w >= mzone->x2 &&
+          gmc->y + gmc->h > mzone->y1 &&
+          gmc->y + gmc->h < mzone->y2)
+    {
+      mzone_splitted = 1;
+      mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+      if (mzone_split == NULL)
+        return -1;
+
+      mzone_split->x1 = mzone->x1;
+      mzone_split->y1 = gmc->y + gmc->h;
+      mzone_split->x2 = mzone->x2;
+      mzone_split->y2 = mzone->y2;
+
+      if (*add_splits_to == NULL)
+        *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+      else
+        evas_list_append(*add_splits_to, mzone_split);
+    }
+  else if (gmc->x <= mzone->x1 &&
+          gmc->x + gmc->w >= mzone->x2 &&
+          gmc->y > mzone->y1 && gmc->y < mzone->y2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 2; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = gmc->y;
+            break;
+          case 1:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = gmc->y + gmc->h;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x <= mzone->x1 &&
+          gmc->x + gmc->w >= mzone->x2 &&
+          gmc->y > mzone->y1 && gmc->y < mzone->y2 &&
+          gmc->y + gmc->h >= mzone->y2)
+    {
+      mzone_splitted = 1;
+      mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+      if (mzone_split == NULL)
+        return -1;
+
+      mzone_split->x1 = mzone->x1;
+      mzone_split->y1 = mzone->y1;
+      mzone_split->x2 = mzone->x2;
+      mzone_split->y2 = gmc->y;
+
+      if (*add_splits_to == NULL)
+        *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+      else
+        evas_list_append(*add_splits_to, mzone_split);
+    }
+  else if (gmc->x <= mzone->x1 &&
+          gmc->y <= mzone->y1 &&
+          gmc->y + gmc->h >= mzone->y2 &&
+          gmc->x + gmc->w > mzone->x1 && gmc->x + gmc->w < mzone->x2)
+    {
+      mzone_splitted = 1;
+      mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+      if (mzone_split == NULL)
+        return -1;
+
+      mzone_split->x1 = gmc->x + gmc->w;
+      mzone_split->y1 = mzone->y1;
+      mzone_split->x2 = mzone->x2;
+      mzone_split->y2 = mzone->y2;
+
+      if (*add_splits_to == NULL)
+        *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+      else
+        evas_list_append(*add_splits_to, mzone_split);
+    }
+  else if (gmc->x > mzone->x1 &&
+          gmc->x + gmc->w < mzone->x2 &&
+          gmc->y <= mzone->y1 &&
+          gmc->y + gmc->h >= mzone->y2)
+    {
+      mzone_splitted = 1;
+      for (ii = 0; ii < 2; ii ++)
+      {
+        mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+        if (mzone_split == NULL)
+          return -1;
+
+        switch(ii)
+        {
+          case 0:
+            mzone_split->x1 = mzone->x1;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = gmc->x;
+            mzone_split->y2 = mzone->y2;
+            break;
+          case 1:
+            mzone_split->x1 = gmc->x + gmc->w;
+            mzone_split->y1 = mzone->y1;
+            mzone_split->x2 = mzone->x2;
+            mzone_split->y2 = mzone->y2;
+            break;
+        }
+        if (*add_splits_to == NULL)
+          *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+        else
+          evas_list_append(*add_splits_to, mzone_split);
+      }
+    }
+  else if (gmc->x > mzone->x1 && gmc->x < mzone->x2 &&
+          gmc->y <= mzone->y1 &&
+          gmc->x + gmc->w >= mzone->x2 &&
+          gmc->y + gmc->h >= mzone->y2)
+    {
+      mzone_splitted = 1;
+      mzone_split = (struct _m_zone *)malloc(sizeof(struct _m_zone));
+      if (mzone_split == NULL)
+        return -1;
+
+      mzone_split->x1 = mzone->x1;
+      mzone_split->y1 = mzone->y1;
+      mzone_split->x2 = gmc->x;
+      mzone_split->y2 = mzone->y2;
+
+      if (*add_splits_to == NULL)
+        *add_splits_to = evas_list_append(*add_splits_to, mzone_split);
+      else
+        evas_list_append(*add_splits_to, mzone_split);
+    }
+  else if (gmc->x <= mzone->x1 && gmc->y <= mzone->y1 &&
+          gmc->x + gmc->w >= mzone->x2 && gmc->y + gmc->h >= mzone->y2)
+    {
+      mzone_splitted = 2;
+    }
+
+  return mzone_splitted;
+}
+int _e_mzone_cb_square_reverse_sort(void *e1, void *e2)
+{
+  struct _m_zone *mz1 = (struct _m_zone *)e1;
+  struct _m_zone *mz2 = (struct _m_zone *)e2;
+
+  if (e1 == NULL) return 1;
+  if (e2 == NULL) return -1;
+
+  if (mz1->area > mz2->area)
+    return -1;
+  else if (mz1->area <  mz2->area)
+    return 1;
+
+  return 0;
+}
+
+int _e_mzone_cb_width_reverse_sort(void *e1, void *e2)
+{
+  int w1, w2;
+  struct _m_zone *mz1 = (struct _m_zone *)e1;
+  struct _m_zone *mz2 = (struct _m_zone *)e2;
+
+  if (e1 == NULL) return 1;
+  if (e2 == NULL) return -1;
+  
+  w1 = mz1->x2 - mz1->x1;
+  w2 = mz2->x2 - mz2->x1;
+
+  if (w1 > w2)
+    return -1;
+  else if (w1 < w2)
+    return 1;
+
+  return 0;
+}
+
+int _e_mzone_cb_height_reverse_sort(void *e1, void *e2)
+{
+  int h1, h2;
+  struct _m_zone *mz1 = (struct _m_zone *)e1;
+  struct _m_zone *mz2 = (struct _m_zone *)e2;
+  
+  if (e1 == NULL) return 1;
+  if (e2 == NULL) return -1;
+
+  h1 = mz1->y2 - mz1->y1;
+  h2 = mz2->y2 - mz2->y1;
+
+  if (h1 > h2)
+    return -1;
+  else if (h1 < h2)
+    return 1;
+
+  return 0;
+}
+




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to