From 2796c8917e3753c18570923160c6b55fe2db2ad7 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 8 May 2006 13:09:51 +0000 Subject: [PATCH] fix maximize to respect shelves SVN revision: 22487 --- src/bin/e_maximize.c | 1426 +----------------------------------------- 1 file changed, 3 insertions(+), 1423 deletions(-) diff --git a/src/bin/e_maximize.c b/src/bin/e_maximize.c index 261104b08..e450db8b2 100644 --- a/src/bin/e_maximize.c +++ b/src/bin/e_maximize.c @@ -13,15 +13,6 @@ struct _E_Maximize_Rect 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); \ @@ -30,166 +21,11 @@ struct _m_zone } 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_gadman_split(Evas_List **add_splits_to, struct _m_zone *mzone, E_Gadman_Client *gmc); -static int _e_mzone_shelf_split(Evas_List **add_splits_to, struct _m_zone *mzone, E_Shelf *es); -static int _e_mzone_cb_square_reverse_sort(void *e1, void *e2); -static int _e_mzone_cb_width_reverse_sort(void *e1, void *e2); -static 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, *ll; - Evas_List *mzones = NULL; - Evas_List *tmp_mzones = NULL; - struct _m_zone *mzone = NULL; - - mzone = (struct _m_zone *)malloc(sizeof(struct _m_zone)); - if (mzone == NULL) - return; - - 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; - - for (ll = tmp_mzones; ll; ll = ll->next) - { - int res; - mzone = ll->data; - - res = _e_mzone_gadman_split(&mzones, mzone, gmc); - if (res == 0) - { - mzones = evas_list_append(mzones, mzone); - ll->data = NULL; - } - else if (res == 2) - ; - else if (res == -1) - ; /* mem problems. Let ignor them yet */ - - if (ll->data != NULL) - { - free(ll->data); - ll->data = NULL; - } - } - evas_list_free(tmp_mzones); - tmp_mzones = NULL; - } - - for (l = e_shelf_list(); l; l = l->next) - { - E_Shelf *es; - - es = l->data; - if (es->zone != bd->zone) continue; - printf("ES\n"); - for (ll = tmp_mzones; ll; ll = ll->next) - { - int res; - mzone = ll->data; - - res = _e_mzone_shelf_split(&mzones, mzone, es); - if (res == 0) - { - mzones = evas_list_append(mzones, mzone); - ll->data = NULL; - } - else if (res == 2) - ; - else if (res == -1) - ; /* mem problems. Let ignor them yet */ - - 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) - mzones = 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; - - /* 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; - - 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); + return e_maximize_border_gadman_fill(bd, x1, y1, x2, y2); } EAPI void @@ -215,12 +51,12 @@ e_maximize_border_dock_fit(E_Border *bd, int *x1, int *y1, int *x2, int *y2) while ((bd2 = e_container_border_list_next(bl))) { enum { - TOP, + TOP, RIGHT, BOTTOM, LEFT } edge = TOP; - + if ((bd2->zone != bd->zone) || (bd2 == bd) || (bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK)) continue; @@ -427,1259 +263,3 @@ _e_maximize_border_rects_fill(E_Border *bd, Evas_List *rects, int *x1, int *y1, if (x2) *x2 = cx2; if (y2) *y2 = cy2; } - -static int -_e_mzone_gadman_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; - } - *add_splits_to = 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; - } - *add_splits_to = 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; - } - *add_splits_to = 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; - } - *add_splits_to = 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; - } - *add_splits_to = 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; - } - *add_splits_to = 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; - } - *add_splits_to = 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; - } - *add_splits_to = 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; - } - *add_splits_to = 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; - - *add_splits_to = 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; - - *add_splits_to = 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; - - *add_splits_to = 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; - } - *add_splits_to = 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; - - *add_splits_to = 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; -} - -static int -_e_mzone_shelf_split(Evas_List **add_splits_to, struct _m_zone *mzone, E_Shelf *es) -{ - int ii; - int mzone_splitted = 0; - struct _m_zone *mzone_split = NULL; - - if (mzone == NULL || es == NULL) - return -1; - - if ((mzone->x2 - mzone->x1) <= 0 || (mzone->y2 - mzone->y1) <= 0) - return 1; - - if (es->x > mzone->x1 && es->y > mzone->y1 && - es->x + es->w < mzone->x2 && es->y + es->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 = es->y; - break; - case 1: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = es->y; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = es->y + es->h; - break; - case 2: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y + es->h; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - case 3: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y; - mzone_split->x2 = es->x; - mzone_split->y2 = es->y + es->h; - break; - case 4: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 5: - mzone_split->x1 = es->x; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = es->x + es->w; - mzone_split->y2 = es->y; - break; - case 6: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - case 7: - mzone_split->x1 = es->x; - mzone_split->y1 = es->y + es->h; - mzone_split->x2 = es->x + es->w; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } // if - else if (es->x + es->w > mzone->x1 && es->x + es->w < mzone->x2 && - es->y + es->h > mzone->y1 && es->y + es->h < mzone->y2 && - es->x <= mzone->x1 && es->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 = es->x + es->w; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = es->y + es->h; - break; - case 1: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y + es->h; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - case 2: - mzone_split->x1 = es->x + es->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 = es->y + es->h; - mzone_split->x2 = es->x + es->w; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x > mzone->x1 && es->y <= mzone->y1 && - es->x + es->w < mzone->x2 && - es->y + es->h > mzone->y1 && es->y + es->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 = es->x; - mzone_split->y2 = es->y + es->h; - break; - case 1: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = es->y + es->h; - break; - case 2: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y + es->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 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 4: - mzone_split->x1 = es->x; - mzone_split->y1 = es->y + es->h; - mzone_split->x2 = es->x + es->w; - mzone_split->y2 = mzone->y2; - break; - case 5: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x > mzone->x1 && es->x < mzone->x2 && - es->y + es->h > mzone->y1 && es->y + es->h < mzone->y2 && - es->y <= mzone->y1 && - es->x + es->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 = es->x; - mzone_split->y2 = es->y + es->h; - break; - case 1: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y + es->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 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 3: - mzone_split->x1 = es->x; - mzone_split->y1 = es->y + es->h; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x > mzone->x1 && es->x < mzone->x2 && - es->y > mzone->y1 && - es->y + es->h < mzone->y2 && - es->x + es->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 = es->y; - break; - case 1: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y; - mzone_split->x2 = es->x; - mzone_split->y2 = es->y + es->h; - break; - case 2: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y + es->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 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 4: - mzone_split->x1 = es->x; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = es->y; - break; - case 5: - mzone_split->x1 = es->x; - mzone_split->y1 = es->y + es->h; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x > mzone->x1 && es->x < mzone->x2 && - es->y > mzone->y1 && es->y < mzone->y2 && - es->x + es->w >= mzone->x2 && - es->y + es->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 = es->y; - break; - case 1: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y; - mzone_split->x2 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 2: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 3: - mzone_split->x1 = es->x; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = es->y; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x > mzone->x1 && - es->y > mzone->y1 && es->y < mzone->y2 && - es->x + es->w < mzone->x2 && - es->y + es->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 = es->y; - break; - case 1: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y; - mzone_split->x2 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 2: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = es->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 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 4: - mzone_split->x1 = es->x; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = es->x + es->w; - mzone_split->y2 = es->y; - break; - case 5: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x <= mzone->x1 && - es->y > mzone->y1 && es->y < mzone->y2 && - es->x + es->w > mzone->x1 && es->x + es->w < mzone->x2 && - es->y + es->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 = es->y; - break; - case 1: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = es->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 = es->x + es->w; - mzone_split->y2 = es->y; - break; - case 3: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x <= mzone->x1 && - es->y > mzone->y1 && - es->y + es->h < mzone->y2 && - es->x + es->w > mzone->x1 && es->x + es->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 = es->y; - break; - case 1: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = es->y; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = es->y + es->h; - break; - case 2: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y + es->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 = es->x + es->w; - mzone_split->y2 = es->y; - break; - case 4: - mzone_split->x1 = es->x + es->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 = es->y + es->h; - mzone_split->x2 = es->x + es->w; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x <= mzone->x1 && es->y <= mzone->y1 && - es->x + es->w >= mzone->x2 && - es->y + es->h > mzone->y1 && - es->y + es->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 = es->y + es->h; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - else if (es->x <= mzone->x1 && - es->x + es->w >= mzone->x2 && - es->y > mzone->y1 && es->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 = es->y; - break; - case 1: - mzone_split->x1 = mzone->x1; - mzone_split->y1 = es->y + es->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 (es->x <= mzone->x1 && - es->x + es->w >= mzone->x2 && - es->y > mzone->y1 && es->y < mzone->y2 && - es->y + es->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 = es->y; - - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - else if (es->x <= mzone->x1 && - es->y <= mzone->y1 && - es->y + es->h >= mzone->y2 && - es->x + es->w > mzone->x1 && es->x + es->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 = es->x + es->w; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - else if (es->x > mzone->x1 && - es->x + es->w < mzone->x2 && - es->y <= mzone->y1 && - es->y + es->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 = es->x; - mzone_split->y2 = mzone->y2; - break; - case 1: - mzone_split->x1 = es->x + es->w; - mzone_split->y1 = mzone->y1; - mzone_split->x2 = mzone->x2; - mzone_split->y2 = mzone->y2; - break; - } - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - } - else if (es->x > mzone->x1 && es->x < mzone->x2 && - es->y <= mzone->y1 && - es->x + es->w >= mzone->x2 && - es->y + es->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 = es->x; - mzone_split->y2 = mzone->y2; - - *add_splits_to = evas_list_append(*add_splits_to, mzone_split); - } - else if (es->x <= mzone->x1 && es->y <= mzone->y1 && - es->x + es->w >= mzone->x2 && es->y + es->h >= mzone->y2) - { - mzone_splitted = 2; - } - - return mzone_splitted; -} - -static 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; -} - -static 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; -} - -static 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; -} -