From eb0f1bd307ab7710aaed61463ece2e84c40b9b8d Mon Sep 17 00:00:00 2001 From: handyande Date: Thu, 20 Jan 2005 14:01:31 +0000 Subject: [PATCH] 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 --- src/bin/e_atoms.c | 8 +++++++- src/bin/e_atoms.h | 7 +++++++ src/bin/e_border.c | 22 ++++++++++++++++++++++ src/bin/e_desk.c | 25 +++++++++++++++++++++++++ src/bin/e_desk.h | 1 + src/bin/e_main.c | 40 ++++++++++++++++++++++++++++++++++------ 6 files changed, 96 insertions(+), 7 deletions(-) diff --git a/src/bin/e_atoms.c b/src/bin/e_atoms.c index 425930885..ba78d6ee0 100644 --- a/src/bin/e_atoms.c +++ b/src/bin/e_atoms.c @@ -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; } diff --git a/src/bin/e_atoms.h b/src/bin/e_atoms.h index 20b464864..78ca0eeed 100644 --- a/src/bin/e_atoms.h +++ b/src/bin/e_atoms.h @@ -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); diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 9d058115d..89c3cc3ab 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -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 diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index 0d43b8b7f..e5cd05d18 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -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) { diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h index 69bdfc1ff..eb9bc6c7d 100644 --- a/src/bin/e_desk.h +++ b/src/bin/e_desk.h @@ -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); diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 08c18b38d..fd390d6fd 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -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); } } }