From 899d272ed5584e14ea42b3e3dc50419ab8dee8d1 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 11 Jan 2005 13:11:12 +0000 Subject: [PATCH] respect zones for resistance, window placement... SVN revision: 12898 --- src/bin/e.h | 1 + src/bin/e_border.c | 56 +++++++++++++++++++++++------- src/bin/e_border.h | 1 + src/bin/e_container.c | 2 +- src/bin/e_place.c | 81 +++++++++++++++++++++++-------------------- src/bin/e_place.h | 2 +- src/bin/e_zone.c | 25 +++++++++++-- 7 files changed, 114 insertions(+), 54 deletions(-) diff --git a/src/bin/e.h b/src/bin/e.h index 43683c7aa..373ff004d 100644 --- a/src/bin/e.h +++ b/src/bin/e.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 6fd4077c1..afa7ed3a0 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -3,7 +3,6 @@ */ #include "e.h" -#include #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; + } + } +} diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 92acd4c93..2cf6e25e4 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -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); diff --git a/src/bin/e_container.c b/src/bin/e_container.c index 45fbd1354..7ce09d69f 100644 --- a/src/bin/e_container.c +++ b/src/bin/e_container.c @@ -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; diff --git a/src/bin/e_place.c b/src/bin/e_place.c index f254a38e0..54d21bf3f 100644 --- a/src/bin/e_place.c +++ b/src/bin/e_place.c @@ -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; } diff --git a/src/bin/e_place.h b/src/bin/e_place.h index d30cf0f72..e76399acf 100644 --- a/src/bin/e_place.h +++ b/src/bin/e_place.h @@ -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 diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index 9c5dfbffb..cf2e80f33 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -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; }