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