diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-02-03 10:35:26 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-02-03 10:35:26 +0000 |
| commit | c9389a89704d5d27cfd5599ab19c40a22c58f65a (patch) | |
| tree | ec9ca6aa42561a5dc92f242c99ce852eae271a02 /src/screen.cc | |
| parent | e44c0cba4b56fe1b649ca03d40f1d33c6cf4fd43 (diff) | |
support for modal children, both in the focus code and in the raise/lower code
Diffstat (limited to 'src/screen.cc')
| -rw-r--r-- | src/screen.cc | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/screen.cc b/src/screen.cc index 8f16427d..c1814341 100644 --- a/src/screen.cc +++ b/src/screen.cc @@ -637,14 +637,28 @@ void Screen::lowerWindow(Client *client) Client::List::iterator it = --_stacking.end(); const Client::List::iterator end = _stacking.begin(); - for (; it != end && (*it)->layer() < client->layer(); --it); - if (*it == client) return; // already the bottom, return - - wins[0] = (*it)->frame->window(); - wins[1] = client->frame->window(); - - _stacking.remove(client); - _stacking.insert(++it, client); + if (client->modal() && client->transientFor()) { + // don't let a modal window lower below its transient_for + it = std::find(_stacking.begin(), _stacking.end(), client->transientFor()); + assert(it != _stacking.end()); + + wins[0] = (it == _stacking.begin() ? _focuswindow : + ((*(--Client::List::const_iterator(it)))->frame->window())); + wins[1] = client->frame->window(); + if (wins[0] == wins[1]) return; // already right above the window + + _stacking.remove(client); + _stacking.insert(it, client); + } else { + for (; it != end && (*it)->layer() < client->layer(); --it); + if (*it == client) return; // already the bottom, return + + wins[0] = (*it)->frame->window(); + wins[1] = client->frame->window(); + + _stacking.remove(client); + _stacking.insert(++it, client); + } XRestackWindows(**otk::display, wins, 2); changeStackingList(); @@ -676,7 +690,12 @@ void Screen::raiseWindow(Client *client) _stacking.insert(it, client); XRestackWindows(**otk::display, wins, 2); - changeStackingList(); + + // if the window has a modal child, then raise it after us to put it on top + if (client->modalChild()) + raiseWindow(client->modalChild()); + else + changeStackingList(); // no need to do this twice! } void Screen::changeDesktop(long desktop) |
