forked from enlightenment/enlightenment
respect zones for resistance, window placement...
SVN revision: 12898
This commit is contained in:
parent
960fcb4bc4
commit
899d272ed5
|
@ -20,6 +20,7 @@
|
|||
#include <Ecore_Job.h>
|
||||
#include <Ecore_Txt.h>
|
||||
#include <Ecore_Config.h>
|
||||
#include <Ecore_X_Atoms.h>
|
||||
#include <Eet.h>
|
||||
#include <Edje.h>
|
||||
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
*/
|
||||
|
||||
#include "e.h"
|
||||
#include <Ecore_X_Atoms.h>
|
||||
|
||||
#define RESIZE_NONE 0
|
||||
#define RESIZE_TL 1
|
||||
|
@ -79,6 +78,8 @@ static void _e_border_event_border_move_free(void *data, void *ev);
|
|||
static void _e_border_event_border_show_free(void *data, void *ev);
|
||||
static void _e_border_event_border_hide_free(void *data, void *ev);
|
||||
|
||||
static void _e_border_zone_update(E_Border *bd);
|
||||
|
||||
/* local subsystem globals */
|
||||
static Evas_List *handlers = NULL;
|
||||
static Evas_List *borders = NULL;
|
||||
|
@ -153,7 +154,7 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map)
|
|||
|
||||
bd = E_OBJECT_ALLOC(E_Border, _e_border_free);
|
||||
if (!bd) return NULL;
|
||||
e_object_del_func_set(bd, _e_border_del);
|
||||
e_object_del_func_set(E_OBJECT(bd), E_OBJECT_CLEANUP_FUNC(_e_border_del));
|
||||
|
||||
printf("##- NEW CLIENT 0x%x\n", win);
|
||||
bd->container = con;
|
||||
|
@ -365,7 +366,7 @@ e_border_move(E_Border *bd, int x, int y)
|
|||
bd->y + bd->client_inset.t,
|
||||
bd->client.w,
|
||||
bd->client.h);
|
||||
|
||||
_e_border_zone_update(bd);
|
||||
ev = calloc(1, sizeof(E_Event_Border_Move));
|
||||
ev->border = bd;
|
||||
e_object_ref(E_OBJECT(bd));
|
||||
|
@ -389,7 +390,7 @@ e_border_resize(E_Border *bd, int w, int h)
|
|||
bd->y + bd->client_inset.t,
|
||||
bd->client.w,
|
||||
bd->client.h);
|
||||
|
||||
_e_border_zone_update(bd);
|
||||
ev = calloc(1, sizeof(E_Event_Border_Resize));
|
||||
ev->border = bd;
|
||||
e_object_ref(E_OBJECT(bd));
|
||||
|
@ -418,7 +419,7 @@ e_border_move_resize(E_Border *bd, int x, int y, int w, int h)
|
|||
bd->y + bd->client_inset.t,
|
||||
bd->client.w,
|
||||
bd->client.h);
|
||||
|
||||
_e_border_zone_update(bd);
|
||||
mev = calloc(1, sizeof(E_Event_Border_Move));
|
||||
mev->border = bd;
|
||||
e_object_ref(E_OBJECT(bd));
|
||||
|
@ -781,6 +782,12 @@ e_border_find_by_client_window(Ecore_X_Window win)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
E_Border *
|
||||
e_border_focused_get(void)
|
||||
{
|
||||
return focused;
|
||||
}
|
||||
|
||||
void
|
||||
e_border_idler_before(void)
|
||||
{
|
||||
|
@ -2148,18 +2155,18 @@ _e_border_eval(E_Border *bd)
|
|||
|
||||
printf("##- AUTO POS 0x%x\n", bd->client.win);
|
||||
if (bd->zone->w > bd->w)
|
||||
new_x = rand() % (bd->zone->w - bd->w);
|
||||
new_x = bd->zone->x + (rand() % (bd->zone->w - bd->w));
|
||||
else
|
||||
new_x = 0;
|
||||
new_x = bd->zone->x;
|
||||
if (bd->zone->h > bd->h)
|
||||
new_y = rand() % (bd->zone->h - bd->h);
|
||||
new_y = bd->zone->y + (rand() % (bd->zone->h - bd->h));
|
||||
else
|
||||
new_y = 0;
|
||||
new_y = bd->zone->y;
|
||||
|
||||
skiplist = evas_list_append(skiplist, bd);
|
||||
e_place_container_region_smart(bd->container, skiplist,
|
||||
bd->x, bd->y, bd->w, bd->h,
|
||||
&new_x, &new_y);
|
||||
e_place_zone_region_smart(bd->zone, skiplist,
|
||||
bd->x, bd->y, bd->w, bd->h,
|
||||
&new_x, &new_y);
|
||||
evas_list_free(skiplist);
|
||||
bd->x = new_x;
|
||||
bd->y = new_y;
|
||||
|
@ -2811,3 +2818,28 @@ _e_border_event_border_desk_set_free(void *data, void *ev)
|
|||
free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_border_zone_update(E_Border *bd)
|
||||
{
|
||||
E_Container *con;
|
||||
Evas_List *l;
|
||||
|
||||
/* still within old zone - leave it there */
|
||||
if (E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
|
||||
bd->zone->x, bd->zone->y, bd->zone->w, bd->zone->h))
|
||||
return;
|
||||
/* find a new zone */
|
||||
con = bd->zone->container;
|
||||
for (l = con->zones; l; l = l->next)
|
||||
{
|
||||
E_Zone *zone;
|
||||
|
||||
zone = l->data;
|
||||
if (E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
|
||||
zone->x, zone->y, zone->w, zone->h))
|
||||
{
|
||||
bd->zone = zone;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -255,6 +255,7 @@ EAPI void e_border_stick(E_Border *bd);
|
|||
EAPI void e_border_unstick(E_Border *bd);
|
||||
|
||||
EAPI E_Border *e_border_find_by_client_window(Ecore_X_Window win);
|
||||
EAPI E_Border *e_border_focused_get(void);
|
||||
|
||||
EAPI void e_border_idler_before(void);
|
||||
|
||||
|
|
|
@ -410,7 +410,7 @@ _e_container_resize_handle(E_Container *con)
|
|||
}
|
||||
|
||||
static void
|
||||
_e_container_event_container_resize_free(void *data, void *ev)
|
||||
_e_container_event_container_resize_free(void *data, void *ev)
|
||||
{
|
||||
E_Event_Container_Resize *e;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "e.h"
|
||||
|
||||
int
|
||||
e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int y, int w, int h, int *rx, int *ry)
|
||||
e_place_zone_region_smart(E_Zone *zone, Evas_List *skiplist, int x, int y, int w, int h, int *rx, int *ry)
|
||||
{
|
||||
int a_w = 0, a_h = 0;
|
||||
int *a_x = NULL, *a_y = NULL;
|
||||
|
@ -12,12 +12,15 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
a_x = E_NEW(int, 2);
|
||||
a_y = E_NEW(int, 2);
|
||||
|
||||
x -= zone->x;
|
||||
y -= zone->y;
|
||||
|
||||
a_x[0] = 0;
|
||||
a_x[1] = con->w;
|
||||
a_x[1] = zone->w;
|
||||
a_y[0] = 0;
|
||||
a_y[1] = con->h;
|
||||
a_y[1] = zone->h;
|
||||
|
||||
for (l = con->clients; l; l = l->next)
|
||||
for (l = zone->container->clients; l; l = l->next)
|
||||
{
|
||||
E_Border *bd;
|
||||
int ok;
|
||||
|
@ -34,8 +37,8 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
}
|
||||
if ((ok) && (bd->visible))
|
||||
{
|
||||
if (E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
|
||||
0, 0, con->w, con->h))
|
||||
if (E_INTERSECTS((bd->x - zone->x), (bd->y - zone->y),
|
||||
bd->w, bd->h, 0, 0, zone->w, zone->h))
|
||||
{
|
||||
int i, j;
|
||||
|
||||
|
@ -43,18 +46,18 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
{
|
||||
int ok = 1;
|
||||
|
||||
if (bd->x > 0)
|
||||
if ((bd->x - zone->x) > 0)
|
||||
{
|
||||
if (a_x[i] == bd->x)
|
||||
if (a_x[i] == (bd->x - zone->x))
|
||||
ok = 0;
|
||||
else if (a_x[i] > bd->x)
|
||||
else if (a_x[i] > (bd->x - zone->x))
|
||||
{
|
||||
a_w++;
|
||||
E_REALLOC(a_x, int, a_w);
|
||||
|
||||
for (j = a_w - 1; j > i; j--)
|
||||
a_x[j] = a_x[j - 1];
|
||||
a_x[i] = bd->x;
|
||||
a_x[i] = (bd->x - zone->x);
|
||||
ok = 0;
|
||||
}
|
||||
}
|
||||
|
@ -65,18 +68,18 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
{
|
||||
int ok = 1;
|
||||
|
||||
if (bd->x + bd->w < con->w)
|
||||
if ((bd->x - zone->x) + bd->w < zone->w)
|
||||
{
|
||||
if (a_x[i] == bd->x + bd->w)
|
||||
if (a_x[i] == (bd->x - zone->x) + bd->w)
|
||||
ok = 0;
|
||||
else if (a_x[i] > bd->x + bd->w)
|
||||
else if (a_x[i] > (bd->x - zone->x) + bd->w)
|
||||
{
|
||||
a_w++;
|
||||
E_REALLOC(a_x, int, a_w);
|
||||
|
||||
for (j = a_w - 1; j > i; j--)
|
||||
a_x[j] = a_x[j - 1];
|
||||
a_x[i] = bd->x + bd->w;
|
||||
a_x[i] = (bd->x - zone->x) + bd->w;
|
||||
ok = 0;
|
||||
}
|
||||
}
|
||||
|
@ -87,18 +90,18 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
{
|
||||
int ok = 1;
|
||||
|
||||
if (bd->y > 0)
|
||||
if ((bd->y - zone->y) > 0)
|
||||
{
|
||||
if (a_y[i] == bd->y)
|
||||
if (a_y[i] == (bd->y - zone->y))
|
||||
ok = 0;
|
||||
else if (a_y[i] > bd->y)
|
||||
else if (a_y[i] > (bd->y - zone->y))
|
||||
{
|
||||
a_h++;
|
||||
E_REALLOC(a_y, int, a_h);
|
||||
|
||||
for (j = a_h - 1; j > i; j--)
|
||||
a_y[j] = a_y[j - 1];
|
||||
a_y[i] = bd->y;
|
||||
a_y[i] = (bd->y - zone->y);
|
||||
ok = 0;
|
||||
}
|
||||
}
|
||||
|
@ -109,18 +112,18 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
{
|
||||
int ok = 1;
|
||||
|
||||
if (bd->y + bd->h < con->h)
|
||||
if ((bd->y - zone->y) + bd->h < zone->h)
|
||||
{
|
||||
if (a_y[i] == bd->y + bd->h)
|
||||
if (a_y[i] == (bd->y - zone->y) + bd->h)
|
||||
ok = 0;
|
||||
else if (a_y[i] > bd->y + bd->h)
|
||||
else if (a_y[i] > (bd->y - zone->y) + bd->h)
|
||||
{
|
||||
a_h++;
|
||||
E_REALLOC(a_y, int, a_h);
|
||||
|
||||
for (j = a_h - 1; j > i; j--)
|
||||
a_y[j] = a_y[j - 1];
|
||||
a_y[i] = bd->y + bd->h;
|
||||
a_y[i] = (bd->y - zone->y) + bd->h;
|
||||
ok = 0;
|
||||
}
|
||||
}
|
||||
|
@ -138,12 +141,12 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
{
|
||||
for (i = 0; i < a_w - 1; i++)
|
||||
{
|
||||
if ((a_x[i] < (con->w - w)) &&
|
||||
(a_y[j] < (con->h - h)))
|
||||
if ((a_x[i] < (zone->w - w)) &&
|
||||
(a_y[j] < (zone->h - h)))
|
||||
{
|
||||
int ar = 0;
|
||||
|
||||
for (l = con->clients; l; l = l->next)
|
||||
for (l = zone->container->clients; l; l = l->next)
|
||||
{
|
||||
E_Border *bd;
|
||||
int x1, y1, w1, h1, x2, y2, w2, h2;
|
||||
|
@ -155,8 +158,8 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
y1 = a_y[j];
|
||||
w1 = w;
|
||||
h1 = h;
|
||||
x2 = bd->x;
|
||||
y2 = bd->y;
|
||||
x2 = (bd->x - zone->x);
|
||||
y2 = (bd->y - zone->y);
|
||||
w2 = bd->w;
|
||||
h2 = bd->h;
|
||||
for (ll = skiplist; ll; ll = ll->next)
|
||||
|
@ -201,11 +204,11 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
goto done;
|
||||
}
|
||||
}
|
||||
if ((a_x[i + 1] - w > 0) && (a_y[j] < (con->h - h)))
|
||||
if ((a_x[i + 1] - w > 0) && (a_y[j] < (zone->h - h)))
|
||||
{
|
||||
int ar = 0;
|
||||
|
||||
for (l = con->clients; l; l = l->next)
|
||||
for (l = zone->container->clients; l; l = l->next)
|
||||
{
|
||||
E_Border *bd;
|
||||
int x1, y1, w1, h1, x2, y2, w2, h2;
|
||||
|
@ -217,8 +220,8 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
y1 = a_y[j];
|
||||
w1 = w;
|
||||
h1 = h;
|
||||
x2 = bd->x;
|
||||
y2 = bd->y;
|
||||
x2 = (bd->x - zone->x);
|
||||
y2 = (bd->y - zone->y);
|
||||
w2 = bd->w;
|
||||
h2 = bd->h;
|
||||
for (ll = skiplist; ll; ll = ll->next)
|
||||
|
@ -267,7 +270,7 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
{
|
||||
int ar = 0;
|
||||
|
||||
for (l = con->clients; l; l = l->next)
|
||||
for (l = zone->container->clients; l; l = l->next)
|
||||
{
|
||||
E_Border *bd;
|
||||
int x1, y1, w1, h1, x2, y2, w2, h2;
|
||||
|
@ -279,8 +282,8 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
y1 = a_y[j + 1] - h;
|
||||
w1 = w;
|
||||
h1 = h;
|
||||
x2 = bd->x;
|
||||
y2 = bd->y;
|
||||
x2 = (bd->x - zone->x);
|
||||
y2 = (bd->y - zone->y);
|
||||
w2 = bd->w;
|
||||
h2 = bd->h;
|
||||
for (ll = skiplist; ll; ll = ll->next)
|
||||
|
@ -325,11 +328,11 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
goto done;
|
||||
}
|
||||
}
|
||||
if ((a_x[i] < (con->w - w)) && (a_y[j + 1] - h > 0))
|
||||
if ((a_x[i] < (zone->w - w)) && (a_y[j + 1] - h > 0))
|
||||
{
|
||||
int ar = 0;
|
||||
|
||||
for (l = con->clients; l; l = l->next)
|
||||
for (l = zone->container->clients; l; l = l->next)
|
||||
{
|
||||
E_Border *bd;
|
||||
int x1, y1, w1, h1, x2, y2, w2, h2;
|
||||
|
@ -341,8 +344,8 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
y1 = a_y[j + 1] - h;
|
||||
w1 = w;
|
||||
h1 = h;
|
||||
x2 = bd->x;
|
||||
y2 = bd->y;
|
||||
x2 = (bd->x - zone->x);
|
||||
y2 = (bd->y - zone->y);
|
||||
w2 = bd->w;
|
||||
h2 = bd->h;
|
||||
for (ll = skiplist; ll; ll = ll->next)
|
||||
|
@ -393,5 +396,7 @@ e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int
|
|||
done:
|
||||
E_FREE(a_x);
|
||||
E_FREE(a_y);
|
||||
*rx += zone->x;
|
||||
*ry += zone->y;
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#ifndef E_PLACE_H
|
||||
#define E_PLACE_H
|
||||
|
||||
EAPI int e_place_container_region_smart(E_Container *con, Evas_List *skiplist, int x, int y, int w, int h, int *rx, int *ry);
|
||||
EAPI int e_place_zone_region_smart(E_Zone *zone, Evas_List *skiplist, int x, int y, int w, int h, int *rx, int *ry);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -144,10 +144,31 @@ E_Zone *
|
|||
e_zone_current_get(E_Container *con)
|
||||
{
|
||||
Evas_List *l;
|
||||
|
||||
E_Border *bd;
|
||||
|
||||
E_OBJECT_CHECK_RETURN(con, NULL);
|
||||
bd = e_border_focused_get();
|
||||
if (bd)
|
||||
{
|
||||
/* the current zone is whatever zone has the focused window */
|
||||
return bd->zone;
|
||||
}
|
||||
else
|
||||
{
|
||||
int x, y;
|
||||
|
||||
ecore_x_pointer_last_xy_get(&x, &y);
|
||||
for (l = con->zones; l; l = l->next)
|
||||
{
|
||||
E_Zone *zone;
|
||||
|
||||
zone = l->data;
|
||||
if (E_INTERSECTS(x, y, 1, 1,
|
||||
zone->x, zone->y, zone->w, zone->h))
|
||||
return zone;
|
||||
}
|
||||
}
|
||||
l = con->zones;
|
||||
/* FIXME: Should return the zone the pointer is currently in */
|
||||
return (E_Zone *)l->data;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue