Remeber border hints when restarting (or recovering) E. This is currently set on all windows all the time in case of crash - it could be moved to being set on E shutdown (before a restart)

SVN revision: 13028
This commit is contained in:
handyande 2005-01-20 14:01:31 +00:00 committed by handyande
parent 45ef78688c
commit eb0f1bd307
6 changed files with 96 additions and 7 deletions

View File

@ -1,12 +1,18 @@
#include "e.h"
/* Atoms */
/* There are no e17 specific atoms defined yet */
Ecore_X_Atom E_ATOM_MANAGED = 0;
Ecore_X_Atom E_ATOM_DESK = 0;
Ecore_X_Atom E_ATOM_ICONIC = 0;
/* externally accessible functions */
int
e_atoms_init(void)
{
E_ATOM_MANAGED = ecore_x_atom_get("__E_WINDOW_MANAGED");
E_ATOM_DESK = ecore_x_atom_get("__E_WINDOW_DESK");
E_ATOM_ICONIC = ecore_x_atom_get("__E_WINDOW_ICONIC");
return 1;
}

View File

@ -3,6 +3,13 @@
#ifndef E_ATOMS_H
#define E_ATOMS_H
/* an "overall" atom to see that we recognise the window */
extern Ecore_X_Atom E_ATOM_MANAGED;
/* basic window properties */
extern Ecore_X_Atom E_ATOM_DESK;
extern Ecore_X_Atom E_ATOM_ICONIC;
EAPI int e_atoms_init(void);
EAPI int e_atoms_shutdown(void);

View File

@ -153,6 +153,8 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map)
{
E_Border *bd;
Ecore_X_Window_Attributes *att;
unsigned int managed, desk[2];
int deskx, desky;
bd = E_OBJECT_ALLOC(E_Border, _e_border_free);
if (!bd) return NULL;
@ -277,6 +279,13 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map)
con->clients = evas_list_append(con->clients, bd);
borders = evas_list_append(borders, bd);
managed = 1;
ecore_x_window_prop_card32_set(win, E_ATOM_MANAGED, &managed, 1);
e_desk_xy_get(bd->desk, &deskx, &desky);
desk[0] = deskx;
desk[1] = desky;
ecore_x_window_prop_card32_set(win, E_ATOM_DESK, desk, 2);
return bd;
}
@ -284,6 +293,8 @@ void
e_border_desk_set(E_Border *bd, E_Desk *desk)
{
E_Event_Border_Desk_Set *ev;
int deskx, desky;
unsigned int deskpos[2];
E_OBJECT_CHECK(bd);
E_OBJECT_CHECK(desk);
@ -300,6 +311,11 @@ e_border_desk_set(E_Border *bd, E_Desk *desk)
ev->desk = desk;
e_object_ref(E_OBJECT(desk));
ecore_event_add(E_EVENT_BORDER_DESK_SET, ev, _e_border_event_border_desk_set_free, NULL);
e_desk_xy_get(desk, &deskx, &desky);
deskpos[0] = deskx;
deskpos[1] = desky;
ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_DESK, deskpos, 2);
}
void
@ -777,6 +793,7 @@ e_border_unmaximize(E_Border *bd)
void
e_border_iconify(E_Border *bd)
{
unsigned int iconic;
E_OBJECT_CHECK(bd);
if ((bd->shading)) return;
if (!bd->iconic)
@ -785,12 +802,15 @@ e_border_iconify(E_Border *bd)
e_border_hide(bd);
edje_object_signal_emit(bd->bg_object, "iconify", "");
}
iconic = 1;
ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_ICONIC, &iconic, 1);
}
void
e_border_uniconify(E_Border *bd)
{
E_Desk *desk;
unsigned int iconic;
E_OBJECT_CHECK(bd);
if ((bd->shading)) return;
@ -804,6 +824,8 @@ e_border_uniconify(E_Border *bd)
e_iconify_border_remove(bd);
edje_object_signal_emit(bd->bg_object, "uniconify", "");
}
iconic = 0;
ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_ICONIC, &iconic, 1);
}
void

View File

@ -138,6 +138,31 @@ e_desk_at_xy_get(E_Zone *zone, int x, int y)
return (E_Desk *) zone->desks[x + (y * zone->desk_x_count)];
}
void
e_desk_xy_get(E_Desk *desk, int *x, int *y)
{
int xx, yy;
E_OBJECT_CHECK(zone);
E_OBJECT_CHECK(desk);
for (xx = 0; xx < desk->zone->desk_x_count; xx++)
{
for (yy = 0; yy < desk->zone->desk_y_count; yy++)
{
E_Desk *next;
next = e_desk_at_xy_get(desk->zone, xx, yy);
if (next == desk)
{
*x = xx;
*y = yy;
return;
}
}
}
}
void
e_desk_next(E_Zone *zone)
{

View File

@ -27,6 +27,7 @@ EAPI void e_desk_name_set(E_Desk *desk, const char *name);
EAPI void e_desk_show(E_Desk *desk);
EAPI E_Desk *e_desk_current_get(E_Zone *zone);
EAPI E_Desk *e_desk_at_xy_get(E_Zone *zone, int x, int y);
EAPI void e_desk_xy_get(E_Desk *desk, int *x, int *y);
EAPI void e_desk_next(E_Zone *zone);
EAPI void e_desk_prev(E_Zone *zone);
EAPI void e_desk_row_add(E_Zone *zone);

View File

@ -504,24 +504,52 @@ _e_main_screens_init(void)
{
/* FIXME: move this to an actual function to start managing */
Ecore_X_Window *windows;
int num;
int wnum;
windows = ecore_x_window_children_get(con->manager->root, &num);
windows = ecore_x_window_children_get(con->manager->root, &wnum);
if (windows)
{
int i;
for (i = 0; i < num; i++)
for (i = 0; i < wnum; i++)
{
Ecore_X_Window_Attributes att;
unsigned int ret_val, deskxy[2];
int ret;
ecore_x_window_attributes_get(windows[i], &att);
if ((att.visible) && (!att.override) &&
(!att.input_only))
ret = ecore_x_window_prop_card32_get(windows[i],
E_ATOM_MANAGED,
&ret_val, 1);
if (((att.visible) && (!att.override) &&
(!att.input_only)) || (ret > -1 && ret_val == 1))
{
E_Border *bd;
/* get all information from window before it is
* reset by e_border_new */
ret = ecore_x_window_prop_card32_get(windows[i],
E_ATOM_DESK,
deskxy, 2);
bd = e_border_new(con, windows[i], 1);
if (bd) e_border_show(bd);
if (bd)
{
if (ret == 2)
{
E_Desk *target;
target = e_desk_at_xy_get(bd->zone,
deskxy[0],
deskxy[1]);
e_border_desk_set(bd, target);
if (target == e_desk_current_get(bd->zone))
e_border_show(bd);
}
}
ret = ecore_x_window_prop_card32_get(windows[i],
E_ATOM_ICONIC,
&ret_val, 1);
if ((ret > -1) && ret_val)
e_border_iconify(bd);
}
}
}