]> Dogcows Code - chaz/openbox/blobdiff - src/client.cc
provide access to the desktop names
[chaz/openbox] / src / client.cc
index 43c35ca8de784d69e0e36c8bd41568128c9b2396..33e11ce07e1e596621acb3c61fe5070e8feabc38 100644 (file)
@@ -1,8 +1,6 @@
 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
 
-#ifdef HAVE_CONFIG_H
-# include "../config.h"
-#endif
+#include "config.h"
 
 #include "client.hh"
 #include "frame.hh"
@@ -17,19 +15,18 @@ extern "C" {
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
 
-#include <assert.h>
-
 #include "gettext.h"
 #define _(str) gettext(str)
 }
 
+#include <climits>
+#include <cassert>
 #include <algorithm>
 
 namespace ob {
 
 Client::Client(int screen, Window window)
   : otk::EventHandler(),
-    WidgetBase(WidgetBase::Type_Client),
     frame(0), _screen(screen), _window(window)
 {
   assert(screen >= 0);
@@ -47,21 +44,18 @@ Client::Client(int screen, Window window)
   _urgent = false;
   _positioned = false;
   _disabled_decorations = 0;
-  _modal = false;
-  _modal_child = 0;
   _group = None;
   _desktop = 0;
   
   getArea();
   getDesktop();
+  getState();  // do this before updateTransientFor! (for _modal)
+  getShaped();
 
   updateTransientFor();
   getMwmHints();
   getType(); // this can change the mwmhints for special cases
 
-  getState();
-  getShaped();
-
   updateProtocols();
 
   getGravity();        // get the attribute gravity
@@ -223,7 +217,8 @@ void Client::setupDecorAndFunctions()
     _functions |= Func_Close;
   }
 
-  if (!(_min_size.x() < _max_size.x() || _min_size.y() < _max_size.y())) {
+  if (!(_min_size.width() < _max_size.width() ||
+        _min_size.height() < _max_size.height())) {
     _decorations &= ~(Decor_Maximize | Decor_Handle);
     _functions &= ~(Func_Resize | Func_Maximize);
   }
@@ -266,11 +261,8 @@ void Client::setupDecorAndFunctions()
         _decorations &= ~Decor_Border;
       if (! (_mwmhints.decorations & MwmDecor_Handle))
         _decorations &= ~Decor_Handle;
-      if (! (_mwmhints.decorations & MwmDecor_Title)) {
+      if (! (_mwmhints.decorations & MwmDecor_Title))
         _decorations &= ~Decor_Titlebar;
-        // if we don't have a titlebar, then we cannot shade!
-        _functions &= ~Func_Shade;
-      }
       if (! (_mwmhints.decorations & MwmDecor_Iconify))
         _decorations &= ~Decor_Iconify;
       if (! (_mwmhints.decorations & MwmDecor_Maximize))
@@ -315,16 +307,17 @@ void Client::setupDecorAndFunctions()
   if (_disabled_decorations & Decor_Close)
     _decorations &= ~Decor_Close;
 
-  // You can't shade without a titlebar
+  // if we don't have a titlebar, then we cannot shade!
   if (!(_decorations & Decor_Titlebar))
     _functions &= ~Func_Shade;
-  
+
   changeAllowedActions();
 
   if (frame) {
     frame->adjustSize(); // change the decors on the frame
     frame->adjustPosition(); // with more/less decorations, we may need to be
                              // moved
+    remaximize(); // with new decor, the window's maximized size may change
   }
 }
 
@@ -360,7 +353,7 @@ void Client::getArea()
   ret = XGetWindowAttributes(**otk::display, _window, &wattrib);
   assert(ret != BadWindow);
 
-  _area.setRect(wattrib.x, wattrib.y, wattrib.width, wattrib.height);
+  _area = otk::Rect(wattrib.x, wattrib.y, wattrib.width, wattrib.height);
   _border_width = wattrib.border_width;
 }
 
@@ -481,10 +474,10 @@ void Client::updateNormalHints()
   // defaults
   _min_ratio = 0.0;
   _max_ratio = 0.0;
-  _size_inc.setPoint(1, 1);
-  _base_size.setPoint(0, 0);
-  _min_size.setPoint(0, 0);
-  _max_size.setPoint(INT_MAX, INT_MAX);
+  _size_inc = otk::Size(1, 1);
+  _base_size = otk::Size(0, 0);
+  _min_size = otk::Size(0, 0);
+  _max_size = otk::Size(INT_MAX, INT_MAX);
 
   // get the hints from the window
   if (XGetWMNormalHints(**otk::display, _window, &size, &ret)) {
@@ -497,9 +490,9 @@ void Client::updateNormalHints()
       // changing its gravity
       if (frame && _gravity != oldgravity) {
         // move our idea of the client's position based on its new gravity
-        int x = frame->rect().x(), y = frame->rect().y();
+        int x = frame->area().x(), y = frame->area().y();
         frame->frameGravity(x, y);
-        _area.setPos(x, y);
+        _area = otk::Rect(otk::Point(x, y), _area.size());
       }
     }
 
@@ -509,16 +502,16 @@ void Client::updateNormalHints()
     }
 
     if (size.flags & PMinSize)
-      _min_size.setPoint(size.min_width, size.min_height);
+      _min_size = otk::Size(size.min_width, size.min_height);
     
     if (size.flags & PMaxSize)
-      _max_size.setPoint(size.max_width, size.max_height);
+      _max_size = otk::Size(size.max_width, size.max_height);
     
     if (size.flags & PBaseSize)
-      _base_size.setPoint(size.base_width, size.base_height);
+      _base_size = otk::Size(size.base_width, size.base_height);
     
     if (size.flags & PResizeInc)
-      _size_inc.setPoint(size.width_inc, size.height_inc);
+      _size_inc = otk::Size(size.width_inc, size.height_inc);
   }
 }
 
@@ -584,7 +577,7 @@ void Client::updateTitle()
     _title = _("Unnamed Window");
 
   if (frame)
-    frame->setTitle(_title);
+    frame->adjustTitle();
 }
 
 
@@ -645,7 +638,7 @@ void Client::updateStrut()
     // updating here is pointless while we're being mapped cuz we're not in
     // the screen's client list yet
     if (frame)
-      openbox->screen(_screen)->updateStrut();
+      openbox->screen(_screen)->updateStruts();
   }
 
   delete [] data;
@@ -676,18 +669,11 @@ void Client::updateTransientFor()
 
   // if anything has changed...
   if (c != _transient_for) {
-    bool m = _modal;
-    if (_modal)
-      setModal(false);
-    
     if (_transient_for)
       _transient_for->_transients.remove(this); // remove from old parent
     _transient_for = c;
     if (_transient_for)
       _transient_for->_transients.push_back(this); // add to new parent
-
-    if (m)
-      setModal(true);
   }
 }
 
@@ -744,107 +730,51 @@ void Client::setWMState(long state)
   
   switch (state) {
   case IconicState:
-    setDesktop(ICONIC_DESKTOP);
+    iconify(true);
     break;
   case NormalState:
-    setDesktop(openbox->screen(_screen)->desktop());
+    iconify(false);
     break;
   }
 }
 
 
-void Client::setDesktop(long target)
+void Client::setDesktop(unsigned int target)
 {
   if (target == _desktop) return;
   
-  printf("Setting desktop %ld\n", target);
+  printf("Setting desktop %u\n", target);
 
-  if (!(target >= 0 || target == (signed)0xffffffff ||
-        target == ICONIC_DESKTOP))
+  if (!(target < openbox->screen(_screen)->numDesktops() ||
+        target == 0xffffffff))
     return;
-  
+
   _desktop = target;
 
-  // set the desktop hint, but not if we're iconifying
-  if (_desktop != ICONIC_DESKTOP)
-    otk::Property::set(_window, otk::Property::atoms.net_wm_desktop,
-                       otk::Property::atoms.cardinal, (unsigned)_desktop);
+  // set the desktop hint
+  otk::Property::set(_window, otk::Property::atoms.net_wm_desktop,
+                     otk::Property::atoms.cardinal, _desktop);
   
   // 'move' the window to the new desktop
-  if (_desktop == openbox->screen(_screen)->desktop() ||
-      _desktop == (signed)0xffffffff)
-    frame->show();
-  else
-    frame->hide();
-
-  // Handle Iconic state. Iconic state is maintained by the client being a
-  // member of the ICONIC_DESKTOP, so this is where we make iconifying and
-  // uniconifying happen.
-  bool i = _desktop == ICONIC_DESKTOP;
-  if (i != _iconic) { // has the state changed?
-    _iconic = i;
-    if (_iconic) {
-      _wmstate = IconicState;
-      ignore_unmaps++;
-      // we unmap the client itself so that we can get MapRequest events, and
-      // because the ICCCM tells us to!
-      XUnmapWindow(**otk::display, _window);
-    } else {
-      _wmstate = NormalState;
-      XMapWindow(**otk::display, _window);
-    }
-    changeState();
-  }
-  
-  frame->adjustState();
+  showhide();
+
+  openbox->screen(_screen)->updateStruts();
 }
 
 
-Client *Client::findModalChild(Client *skip) const
+void Client::showhide()
 {
-  Client *ret = 0;
-  
-  // find a modal child recursively and try focus it
-  List::const_iterator it, end = _transients.end();
-  for (it = _transients.begin(); it != end; ++it)
-    if ((*it)->_modal && *it != skip)
-      return *it; // got one
-  // none of our direct children are modal, let them try check
-  for (it = _transients.begin(); it != end; ++it)
-    if ((ret = (*it)->findModalChild()))
-      return ret; // got one
-  return ret;
-}
+  bool show;
+  Screen *s = openbox->screen(_screen);
 
+  if (_iconic) show = false;
+  else if (!(_desktop == s->desktop() ||
+             _desktop == 0xffffffff)) show = false;
+  else if (normal() && s->showingDesktop()) show = false;
+  else show = true;
 
-void Client::setModal(bool modal)
-{
-  if (modal == _modal) return;
-  
-  if (modal) {
-    Client *c = this;
-    while (c->_transient_for) {
-      c = c->_transient_for;
-      if (c->_modal_child) break; // already has a modal child
-      c->_modal_child = this;
-    }
-  } else {
-    // try find a replacement modal dialog
-    Client *replacement = 0;
-    
-    Client *c = this;
-    while (c->_transient_for) // go up the tree
-      c = c->_transient_for;
-    replacement = c->findModalChild(this); // find a modal child, skipping this
-
-    c = this;
-    while (c->_transient_for) {
-      c = c->_transient_for;
-      if (c->_modal_child != this) break; // has a different modal child
-      c->_modal_child = replacement;
-    }
-  }
-  _modal = modal;
+  if (show) frame->show();
+  else      frame->hide();
 }
 
 
@@ -854,7 +784,6 @@ void Client::setState(StateAction action, long data1, long data2)
   bool fsstate = _fullscreen;
   bool maxh = _max_horz;
   bool maxv = _max_vert;
-  bool modal = _modal;
 
   if (!(action == State_Add || action == State_Remove ||
         action == State_Toggle))
@@ -890,7 +819,7 @@ void Client::setState(StateAction action, long data1, long data2)
     if (action == State_Add) {
       if (state == otk::Property::atoms.net_wm_state_modal) {
         if (_modal) continue;
-        modal = true;
+        _modal = true;
       } else if (state == otk::Property::atoms.net_wm_state_maximized_vert) {
         maxv = true;
       } else if (state == otk::Property::atoms.net_wm_state_maximized_horz) {
@@ -915,7 +844,7 @@ void Client::setState(StateAction action, long data1, long data2)
     } else { // action == State_Remove
       if (state == otk::Property::atoms.net_wm_state_modal) {
         if (!_modal) continue;
-        modal = false;
+        _modal = false;
       } else if (state == otk::Property::atoms.net_wm_state_maximized_vert) {
         maxv = false;
       } else if (state == otk::Property::atoms.net_wm_state_maximized_horz) {
@@ -952,8 +881,6 @@ void Client::setState(StateAction action, long data1, long data2)
         maximize(maxv, 2, true);
     }
   }
-  if (modal != _modal)
-    setModal(modal);
   // change fullscreen state before shading, as it will affect if the window
   // can shade or not
   if (fsstate != _fullscreen)
@@ -1016,7 +943,7 @@ void Client::toggleClientBorder(bool addborder)
     else           y += _border_width;
     break;
   }
-  _area.setPos(x, y);
+  _area = otk::Rect(otk::Point(x, y), _area.size());
 
   if (addborder) {
     XSetWindowBorderWidth(**otk::display, _window, _border_width);
@@ -1090,13 +1017,28 @@ void Client::clientMessageHandler(const XClientMessageEvent &e)
 #ifdef DEBUG
     printf("net_active_window for 0x%lx\n", _window);
 #endif
+    if (openbox->screen(_screen)->showingDesktop())
+      openbox->screen(_screen)->showDesktop(false);
     if (_iconic)
-      setDesktop(openbox->screen(_screen)->desktop());
+      iconify(false);
+    else if (!frame->visible()) // if its not visible for other reasons, then
+      return;                   // don't mess with it
     if (_shaded)
       shade(false);
-    // XXX: deiconify
     focus();
     openbox->screen(_screen)->raiseWindow(this);
+  } else if (e.message_type == otk::Property::atoms.openbox_active_window) {
+    if (openbox->screen(_screen)->showingDesktop())
+      openbox->screen(_screen)->showDesktop(false);
+    if (_iconic)
+      iconify(false);
+    else if (!frame->visible()) // if its not visible for other reasons, then
+      return;                   // don't mess with it
+    if (e.data.l[0] && _shaded)
+      shade(false);
+    focus();
+    if (e.data.l[1])
+      openbox->screen(_screen)->raiseWindow(this);
   }
 }
 
@@ -1121,22 +1063,22 @@ void Client::resize(Corner anchor, int w, int h)
 }
 
 
-void Client::internal_resize(Corner anchor, int w, int h, bool user,
-                             int x, int y)
+void Client::internal_resize(Corner anchor, int w, int h,
+                             bool user, int x, int y)
 {
-  w -= _base_size.x(); 
-  h -= _base_size.y();
+  w -= _base_size.width();
+  h -= _base_size.height();
 
   if (user) {
     // for interactive resizing. have to move half an increment in each
     // direction.
-    int mw = w % _size_inc.x(); // how far we are towards the next size inc
-    int mh = h % _size_inc.y();
-    int aw = _size_inc.x() / 2; // amount to add
-    int ah = _size_inc.y() / 2;
+    int mw = w % _size_inc.width(); // how far we are towards the next size inc
+    int mh = h % _size_inc.height();
+    int aw = _size_inc.width() / 2; // amount to add
+    int ah = _size_inc.height() / 2;
     // don't let us move into a new size increment
-    if (mw + aw >= _size_inc.x()) aw = _size_inc.x() - mw - 1;
-    if (mh + ah >= _size_inc.y()) ah = _size_inc.y() - mh - 1;
+    if (mw + aw >= _size_inc.width()) aw = _size_inc.width() - mw - 1;
+    if (mh + ah >= _size_inc.height()) ah = _size_inc.height() - mh - 1;
     w += aw;
     h += ah;
     
@@ -1144,10 +1086,10 @@ void Client::internal_resize(Corner anchor, int w, int h, bool user,
     // and aspect ratios
 
     // smaller than min size or bigger than max size?
-    if (w < _min_size.x()) w = _min_size.x();
-    else if (w > _max_size.x()) w = _max_size.x();
-    if (h < _min_size.y()) h = _min_size.y();
-    else if (h > _max_size.y()) h = _max_size.y();
+    if (w > _max_size.width()) w = _max_size.width();
+    if (w < _min_size.width()) w = _min_size.width();
+    if (h > _max_size.height()) h = _max_size.height();
+    if (h < _min_size.height()) h = _min_size.height();
 
     // adjust the height ot match the width for the aspect ratios
     if (_min_ratio)
@@ -1157,21 +1099,21 @@ void Client::internal_resize(Corner anchor, int w, int h, bool user,
   }
 
   // keep to the increments
-  w /= _size_inc.x();
-  h /= _size_inc.y();
+  w /= _size_inc.width();
+  h /= _size_inc.height();
 
   // you cannot resize to nothing
   if (w < 1) w = 1;
   if (h < 1) h = 1;
   
   // store the logical size
-  _logical_size.setPoint(w, h);
+  _logical_size = otk::Size(w, h);
 
-  w *= _size_inc.x();
-  h *= _size_inc.y();
+  w *= _size_inc.width();
+  h *= _size_inc.height();
 
-  w += _base_size.x();
-  h += _base_size.y();
+  w += _base_size.width();
+  h += _base_size.height();
 
   if (x == INT_MIN || y == INT_MIN) {
     x = _area.x();
@@ -1192,7 +1134,7 @@ void Client::internal_resize(Corner anchor, int w, int h, bool user,
     }
   }
 
-  _area.setSize(w, h);
+  _area = otk::Rect(_area.position(), otk::Size(w, h));
 
   XResizeWindow(**otk::display, _window, w, h);
 
@@ -1213,7 +1155,7 @@ void Client::move(int x, int y)
 
 void Client::internal_move(int x, int y)
 {
-  _area.setPos(x, y);
+  _area = otk::Rect(otk::Point(x, y), _area.size());
 
   // move the frame to be in the requested position
   if (frame) { // this can be called while mapping, before frame exists
@@ -1339,6 +1281,21 @@ void Client::changeAllowedActions(void)
 
   otk::Property::set(_window, otk::Property::atoms.net_wm_allowed_actions,
                      otk::Property::atoms.atom, actions, num);
+
+  // make sure the window isn't breaking any rules now
+  
+  if (!(_functions & Func_Shade) && _shaded)
+    if (frame) shade(false);
+    else _shaded = false;
+  if (!(_functions & Func_Iconify) && _iconic)
+    if (frame) setDesktop(openbox->screen(_screen)->desktop());
+    else _iconic = false;
+  if (!(_functions & Func_Fullscreen) && _fullscreen)
+    if (frame) fullscreen(false);
+    else _fullscreen = false;
+  if (!(_functions & Func_Maximize) && (_max_horz || _max_vert))
+    if (frame) maximize(false, 0);
+    else _max_vert = _max_horz = false;
 }
 
 
@@ -1362,14 +1319,9 @@ void Client::applyStartupState()
 {
   // these are in a carefully crafted order..
 
-  if (_modal) {
-    _modal = false;
-    setModal(true);
-  }
-  
   if (_iconic) {
     _iconic = false;
-    setDesktop(ICONIC_DESKTOP);
+    iconify(true);
   }
   if (_fullscreen) {
     _fullscreen = false;
@@ -1439,8 +1391,8 @@ void Client::maximize(bool max, int dir, bool savearea)
     if (dir == 2 && !_max_vert) return;
   }
 
-  const otk::Rect &a = openbox->screen(_screen)->area();
-  int x = frame->rect().x(), y = frame->rect().y(),
+  const otk::Rect &a = openbox->screen(_screen)->area(_desktop);
+  int x = frame->area().x(), y = frame->area().y(),
     w = _area.width(), h = _area.height();
   
   if (max) {
@@ -1563,8 +1515,8 @@ void Client::fullscreen(bool fs, bool savearea)
     const otk::ScreenInfo *info = otk::display->screenInfo(_screen);
     x = 0;
     y = 0;
-    w = info->width();
-    h = info->height();
+    w = info->size().width();
+    h = info->size().height();
   } else {
     _functions = saved_func;
     _decorations = saved_decor;
@@ -1584,7 +1536,7 @@ void Client::fullscreen(bool fs, bool savearea)
       delete dimensions;
     } else {
       // pick some fallbacks...
-      const otk::Rect &a = openbox->screen(_screen)->area();
+      const otk::Rect &a = openbox->screen(_screen)->area(_desktop);
       x = a.x() + a.width() / 4;
       y = a.y() + a.height() / 4;
       w = a.width() / 2;
@@ -1605,6 +1557,36 @@ void Client::fullscreen(bool fs, bool savearea)
 }
 
 
+void Client::iconify(bool iconic, bool curdesk)
+{
+  if (_iconic == iconic) return; // nothing to do
+
+#ifdef DEBUG
+    printf("%sconifying window: 0x%lx\n", (iconic ? "I" : "Uni"), _window);
+#endif
+
+  _iconic = iconic;
+
+  if (_iconic) {
+    _wmstate = IconicState;
+    ignore_unmaps++;
+    // we unmap the client itself so that we can get MapRequest events, and
+    // because the ICCCM tells us to!
+    XUnmapWindow(**otk::display, _window);
+  } else {
+    if (curdesk)
+      setDesktop(openbox->screen(_screen)->desktop());
+    _wmstate = NormalState;
+    XMapWindow(**otk::display, _window);
+  }
+  changeState();
+
+  showhide();
+  
+  openbox->screen(_screen)->updateStruts();
+}
+
+
 void Client::disableDecorations(DecorationFlags flags)
 {
   _disabled_decorations = flags;
@@ -1616,7 +1598,6 @@ void Client::installColormap(bool install) const
 {
   XWindowAttributes wa;
   if (XGetWindowAttributes(**otk::display, _window, &wa)) {
-    printf("%snstalling Window Colormap 0x%lx!\n", install ? "I" : "Uni", _window);
     if (install)
       XInstallColormap(**otk::display, wa.colormap);
     else
@@ -1625,15 +1606,36 @@ void Client::installColormap(bool install) const
 }
 
 
+// recursively searches the client 'tree' for a modal client, always skips the
+// topmost node (the window you're starting with)
+Client *Client::searchModalTree(Client *node, Client *skip)
+{
+  List::const_iterator it, end = node->_transients.end();
+  Client *ret;
+  
+  for (it = node->_transients.begin(); it != end; ++it) {
+    if (*it == skip) continue; // circular?
+    if ((ret = searchModalTree(*it, skip))) return ret; // got one
+    if ((*it)->_modal) return *it; // got one
+  }
+  return 0;
+}
+
+Client *Client::findModalChild()
+{
+  return searchModalTree(this, this);
+}
+
+
 bool Client::focus()
 {
   // if we have a modal child, then focus it, not us
-  if (_modal_child)
-    return _modal_child->focus();
+  Client *c = findModalChild();
+  if (c) return c->focus();
 
   // won't try focus if the client doesn't want it, or if the window isn't
   // visible on the screen
-  if (!(frame->isVisible() && (_can_focus || _focus_notify))) return false;
+  if (!(frame->visible() && (_can_focus || _focus_notify))) return false;
 
   if (_focused) return true;
 
@@ -1695,8 +1697,8 @@ void Client::focusHandler(const XFocusChangeEvent &e)
   
   otk::EventHandler::focusHandler(e);
 
-  frame->focus();
   _focused = true;
+  frame->adjustFocus();
 
   openbox->setFocusedClient(this);
 }
@@ -1710,21 +1712,43 @@ void Client::unfocusHandler(const XFocusChangeEvent &e)
   
   otk::EventHandler::unfocusHandler(e);
 
-  frame->unfocus();
   _focused = false;
+  frame->adjustFocus();
 
   if (openbox->focusedClient() == this)
     openbox->setFocusedClient(0);
 }
 
 
-void Client::configureRequestHandler(const XConfigureRequestEvent &e)
+void Client::configureRequestHandler(const XConfigureRequestEvent &ec)
 {
 #ifdef    DEBUG
-  printf("ConfigureRequest for 0x%lx\n", e.window);
+  printf("ConfigureRequest for 0x%lx\n", ec.window);
 #endif // DEBUG
   
-  otk::EventHandler::configureRequestHandler(e);
+  otk::EventHandler::configureRequestHandler(ec);
+
+  // compress these
+  XConfigureRequestEvent e = ec;
+  XEvent ev;
+  while (XCheckTypedWindowEvent(**otk::display, window(), ConfigureRequest,
+                                &ev)) {
+    // XXX if this causes bad things.. we can compress config req's with the
+    //     same mask.
+    e.value_mask |= ev.xconfigurerequest.value_mask;
+    if (ev.xconfigurerequest.value_mask & CWX)
+      e.x = ev.xconfigurerequest.x;
+    if (ev.xconfigurerequest.value_mask & CWY)
+      e.y = ev.xconfigurerequest.y;
+    if (ev.xconfigurerequest.value_mask & CWWidth)
+      e.width = ev.xconfigurerequest.width;
+    if (ev.xconfigurerequest.value_mask & CWHeight)
+      e.height = ev.xconfigurerequest.height;
+    if (ev.xconfigurerequest.value_mask & CWBorderWidth)
+      e.border_width = ev.xconfigurerequest.border_width;
+    if (ev.xconfigurerequest.value_mask & CWStackMode)
+      e.detail = ev.xconfigurerequest.detail;
+  }
 
   // if we are iconic (or shaded (fvwm does this)) ignore the event
   if (_iconic || _shaded) return;
@@ -1855,7 +1879,7 @@ void Client::mapRequestHandler(const XMapRequestEvent &e)
   assert(_iconic); // we shouldn't be able to get this unless we're iconic
 
   // move to the current desktop (uniconify)
-  setDesktop(openbox->screen(_screen)->desktop());
+  iconify(false);
   // XXX: should we focus/raise the window? (basically a net_wm_active_window)
 }
 
This page took 0.04385 seconds and 4 git commands to generate.