|
|
|
@ -10,6 +10,15 @@ 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); \
|
|
|
|
@ -19,61 +28,140 @@ struct _E_Maximize_Rect |
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
ax = gmc->ax; |
|
|
|
|
ay = gmc->ay; |
|
|
|
|
mzone->x2 = bd->zone->x + bd->zone->w; |
|
|
|
|
if (x2) mzone->x2 = *x2; |
|
|
|
|
|
|
|
|
|
if (((ax == 0.0) || (ax == 1.0)) && |
|
|
|
|
((ay == 0.0) || (ay == 1.0))) |
|
|
|
|
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_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 (ll->data != NULL) |
|
|
|
|
{ |
|
|
|
|
free(ll->data); |
|
|
|
|
ll->data = NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
evas_list_free(tmp_mzones); |
|
|
|
|
tmp_mzones = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (x1) *x1 = cx1; |
|
|
|
|
if (y1) *y1 = cy1; |
|
|
|
|
if (x2) *x2 = cx2; |
|
|
|
|
if (y2) *y2 = cy2; |
|
|
|
|
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 @@ _e_maximize_border_rects_fill(E_Border *bd, Evas_List *rects, int *x1, int *y1, |
|
|
|
|
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 && gm |