add zone geometry property to windows and keep it updated.

SVN revision: 75310
This commit is contained in:
Carsten Haitzler 2012-08-16 09:29:42 +00:00
parent f6030fa521
commit 7a5d5b5fa4
4 changed files with 54 additions and 3 deletions

View File

@ -12,6 +12,7 @@ EAPI Ecore_X_Atom E_ATOM_BORDER_SIZE = 0;
EAPI Ecore_X_Atom E_ATOM_WINDOW_STATE = 0;
EAPI Ecore_X_Atom E_ATOM_WINDOW_STATE_CENTERED = 0;
EAPI Ecore_X_Atom E_ATOM_DESKTOP_FILE = 0;
EAPI Ecore_X_Atom E_ATOM_ZONE_GEOMETRY = 0;
/* externally accessible functions */
EINTERN int
@ -28,9 +29,10 @@ e_atoms_init(void)
"__E_WINDOW_BORDER_SIZE",
"__E_ATOM_WINDOW_STATE",
"__E_ATOM_WINDOW_STATE_CENTERED",
"__E_ATOM_DESKTOP_FILE"
"__E_ATOM_DESKTOP_FILE",
"E_ZONE_GEOMETRY"
};
Ecore_X_Atom atoms[11];
Ecore_X_Atom atoms[12];
ecore_x_atoms_get(atom_names, 11, atoms);
E_ATOM_MANAGED = atoms[0];
@ -44,6 +46,7 @@ e_atoms_init(void)
E_ATOM_WINDOW_STATE = atoms[8];
E_ATOM_WINDOW_STATE_CENTERED = atoms[9];
E_ATOM_DESKTOP_FILE = atoms[10];
E_ATOM_ZONE_GEOMETRY = atoms[11];
return 1;
}

View File

@ -15,7 +15,6 @@ extern EAPI Ecore_X_Atom E_ATOM_SHADE_DIRECTION;
extern EAPI Ecore_X_Atom E_ATOM_HIDDEN;
extern EAPI Ecore_X_Atom E_ATOM_BORDER_SIZE;
extern EAPI Ecore_X_Atom E_ATOM_DESKTOP_FILE;
/* extra e window states */
/* if we add more states, we need to fix
* * e_hints_window_e_state_get()
@ -25,6 +24,8 @@ extern EAPI Ecore_X_Atom E_ATOM_DESKTOP_FILE;
extern EAPI Ecore_X_Atom E_ATOM_WINDOW_STATE;
extern EAPI Ecore_X_Atom E_ATOM_WINDOW_STATE_CENTERED;
extern EAPI Ecore_X_Atom E_ATOM_ZONE_GEOMETRY;
EINTERN int e_atoms_init(void);
EINTERN int e_atoms_shutdown(void);

View File

@ -708,6 +708,15 @@ e_border_new(E_Container *con,
ecore_x_window_prop_card32_set(win, E_ATOM_MANAGED, &managed, 1);
ecore_x_window_prop_card32_set(win, E_ATOM_CONTAINER, &bd->zone->container->num, 1);
ecore_x_window_prop_card32_set(win, E_ATOM_ZONE, &bd->zone->num, 1);
{
unsigned int zgeom[4];
zgeom[0] = bd->zone->x;
zgeom[1] = bd->zone->y;
zgeom[2] = bd->zone->w;
zgeom[3] = bd->zone->h;
ecore_x_window_prop_card32_set(win, E_ATOM_ZONE_GEOMETRY, zgeom, 4);
}
e_desk_xy_get(bd->desk, &deskx, &desky);
desk[0] = deskx;
desk[1] = desky;
@ -864,6 +873,18 @@ e_border_zone_set(E_Border *bd,
ecore_event_add(E_EVENT_BORDER_ZONE_SET, ev, _e_border_event_border_zone_set_free, NULL);
ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_ZONE, &bd->zone->num, 1);
// XXXXXXXXXXXXXXXXXXXXXXXXX
// XXX ZZZZZZZZZZZZZZZZZZZzz
// need to adjust this if zone pos/size changes
{
unsigned int zgeom[4];
zgeom[0] = bd->zone->x;
zgeom[1] = bd->zone->y;
zgeom[2] = bd->zone->w;
zgeom[3] = bd->zone->h;
ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_ZONE_GEOMETRY, zgeom, 4);
}
e_remember_update(bd);
}

View File

@ -44,6 +44,7 @@ static void _e_zone_object_del_attach(void *o);
static E_Zone_Edge _e_zone_detect_edge(E_Zone *zone,
Ecore_X_Window win);
static void _e_zone_edge_move_resize(E_Zone *zone);
static void _e_zone_border_geometry_update(E_Zone *zone);
EAPI int E_EVENT_ZONE_DESK_COUNT_SET = 0;
EAPI int E_EVENT_POINTER_WARP = 0;
@ -299,6 +300,7 @@ e_zone_move(E_Zone *zone,
ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
}
_e_zone_border_geometry_update(zone);
}
EAPI void
@ -331,6 +333,7 @@ e_zone_resize(E_Zone *zone,
ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
}
_e_zone_border_geometry_update(zone);
}
EAPI void
@ -374,6 +377,7 @@ e_zone_move_resize(E_Zone *zone,
ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
}
_e_zone_border_geometry_update(zone);
}
EAPI void
@ -1829,3 +1833,25 @@ _e_zone_edge_move_resize(E_Zone *zone)
ecore_x_window_move_resize(zone->corner.bottom_left,
zone->x + zone->w - cw - 2, zone->y + zone->h - 1, cw, 1);
}
static void
_e_zone_border_geometry_update(E_Zone *zone)
{
Eina_List *borders, *l;
E_Border *bd;
unsigned int zgeom[4];
zgeom[0] = zone->x;
zgeom[1] = zone->y;
zgeom[2] = zone->w;
zgeom[3] = zone->h;
borders = e_border_client_list();
EINA_LIST_FOREACH(borders, l, bd)
{
if (bd->zone == zone)
ecore_x_window_prop_card32_set(bd->client.win,
E_ATOM_ZONE_GEOMETRY,
zgeom, 4);
}
}