]> Dogcows Code - chaz/openbox/blobdiff - src/screen.cc
add a focused() member
[chaz/openbox] / src / screen.cc
index f8989a05a942949ad2ade4867a2bad798ca5b054..c181434107bd3cf08d0ad2e93fd0b076962f704e 100644 (file)
@@ -110,11 +110,12 @@ Screen::Screen(int screen)
   // the above set() will cause the updateDesktopNames to fire right away so
   // we have a list of desktop names
 
+  _desktop = 0;
+  
   if (!python_get_long("number_of_desktops", &_num_desktops))
     _num_desktops = 1;
   changeNumDesktops(_num_desktops); // set the hint
 
-  _desktop = 0;
   changeDesktop(0); // set the hint
 
   // create the window which gets focus when no clients get it
@@ -636,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
+  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)->frame->window();
-  wins[1] = client->frame->window();
+    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);
+    _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();
@@ -675,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)
@@ -717,7 +737,8 @@ void Screen::changeNumDesktops(long num)
   Client::List::iterator it, end = clients.end();
   for (it = clients.begin(); it != end; ++it) {
     int d = (*it)->desktop();
-    if (d >= num && !(d == 0xffffffff || d == Client::ICONIC_DESKTOP)) {
+    if (d >= num && !(d == (signed) 0xffffffff ||
+                      d == Client::ICONIC_DESKTOP)) {
       XEvent ce;
       ce.xclient.type = ClientMessage;
       ce.xclient.message_type = otk::Property::atoms.net_wm_desktop;
This page took 0.020682 seconds and 4 git commands to generate.