From 9af20469859317b1f7821762aafc1dcbac8a70ae Mon Sep 17 00:00:00 2001 From: sebastid Date: Fri, 2 Sep 2005 06:15:57 +0000 Subject: [PATCH] * Check and remember WM_TRANSIENT_FOR relationships. * Only check if bd->client.icccm.transient_for is set, bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DIALOG is only for decorations. * When a border is raised, raise it's children above it. * Should this behaviour be userdefineable? SVN revision: 16459 --- TODO | 1 - src/bin/e_border.c | 51 ++++++++++++++++++++++++++++++++-------------- src/bin/e_border.h | 3 ++- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/TODO b/TODO index caa473566..b401661e9 100644 --- a/TODO +++ b/TODO @@ -17,7 +17,6 @@ Some of the things (in very short form) that need to be done to E17... * BUG: if you have 2 zones and you fill up zone 2 (right) mostly and then run a big xev (xev -g 1280x1024) that wont fit it gets placed offscreen to the right of zone 2 -* BUG?: xine's ui window/panel is under its video window when u go fullscreen ]]] [[[ diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 4428a0939..20101415f 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -782,6 +782,7 @@ void e_border_raise(E_Border *bd) { E_Border *above; + Evas_List *l; E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); @@ -807,6 +808,13 @@ e_border_raise(E_Border *bd) ev->below = NULL; ecore_event_add(E_EVENT_BORDER_LOWER, ev, _e_border_event_border_lower_free, NULL); } + for (l = bd->children; l; l = l->next) + { + E_Border *child; + + child = l->data; + e_border_stack_above(child, bd); + } } void @@ -2210,6 +2218,17 @@ _e_border_del(E_Border *bd) // e_object_breadcrumb_add(E_OBJECT(bd), "border_remove_event"); ecore_event_add(E_EVENT_BORDER_REMOVE, ev, _e_border_event_border_remove_free, NULL); } + + if (bd->parent) + bd->parent->children = evas_list_remove(bd->parent->children, bd); + while (bd->children) + { + E_Border *child; + + child = bd->children->data; + child->parent = NULL; + bd->children = evas_list_remove_list(bd->children, bd->children); + } } static void @@ -4596,6 +4615,17 @@ _e_border_eval(E_Border *bd) if (bd->new_client) { bd->new_client = 0; + if (bd->client.icccm.transient_for) + { + E_Border *bd_parent; + + bd_parent = e_border_find_by_client_window(bd->client.icccm.transient_for); + if (bd_parent) + { + bd_parent->children = evas_list_append(bd_parent->children, bd); + bd->parent = bd_parent; + } + } // printf("##- NEW CLIENT SETUP 0x%x\n", bd->client.win); if (bd->re_manage) { @@ -4658,22 +4688,13 @@ _e_border_eval(E_Border *bd) /* FIXME: special placement for dialogs etc. etc. etc goes * here */ - if ((bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DIALOG) && - ((bd->client.icccm.transient_for != 0))) + /* FIXME: what if parent is not on this desktop - or zone? */ + if ((bd->parent) && (bd->parent->visible)) { - E_Border *bd_parent; - - bd_parent = e_border_find_by_client_window(bd->client.icccm.transient_for); -// if (!bd_parent) -// bd_parent = e_border_find_by_client_window(bd->client.icccm.client_leader); - /* FIXME: what if parent is not on this desktop - or zone? */ - if ((bd_parent) && (bd_parent->visible)) - { - bd->x = bd_parent->x + ((bd_parent->w - bd->w) / 2); - bd->y = bd_parent->y + ((bd_parent->h - bd->h) / 2); - bd->changes.pos = 1; - placed = 1; - } + bd->x = bd->parent->x + ((bd->parent->w - bd->w) / 2); + bd->y = bd->parent->y + ((bd->parent->h - bd->h) / 2); + bd->changes.pos = 1; + placed = 1; } if (!placed) { diff --git a/src/bin/e_border.h b/src/bin/e_border.h index a3c0001cc..aafc285c8 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -385,7 +385,8 @@ struct _E_Border Ecore_X_Rectangle *shape_rects; E_Remember *remember; -// Ecore_Timer *dangling_ref_check; + E_Border *parent; + Evas_List *children; }; struct _E_Border_Pending_Move_Resize