]> Dogcows Code - chaz/openbox/blobdiff - src/frame.cc
clarify an incorrect comment, and make some funcs const
[chaz/openbox] / src / frame.cc
index 0cc96c2a6e401272ce062fdb1d1f9b9a4efb2831..555f5c6e3142163d3fe3ad7455669888328c7b27 100644 (file)
@@ -56,14 +56,11 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style)
   otk::OtkWidget::unfocus(); // stuff starts out appearing focused in otk
   
   _plate.show(); // the other stuff is shown based on decor settings
-  
-  grabClient();
 }
 
 
 OBFrame::~OBFrame()
 {
-  releaseClient(false);
 }
 
 
@@ -404,11 +401,19 @@ void OBFrame::adjustShape()
 
 void OBFrame::grabClient()
 {
-  
   // reparent the client to the frame
   XReparentWindow(otk::OBDisplay::display, _client->window(),
                   _plate.window(), 0, 0);
-  _client->ignore_unmaps++;
+  /*
+    When reparenting the client window, it is usually not mapped yet, since
+    this occurs from a MapRequest. However, in the case where Openbox is
+    starting up, the window is already mapped, so we'll see unmap events for
+    it. There are 2 unmap events generated that we see, one with the 'event'
+    member set the root window, and one set to the client, but both get handled
+    and need to be ignored.
+  */
+  if (Openbox::instance->state() == Openbox::State_Starting)
+    _client->ignore_unmaps += 2;
 
   // select the event mask on the client's parent (to receive config req's)
   XSelectInput(otk::OBDisplay::display, _plate.window(),
@@ -422,25 +427,21 @@ void OBFrame::grabClient()
 }
 
 
-void OBFrame::releaseClient(bool remap)
+void OBFrame::releaseClient()
 {
-  // check if the app has already reparented its window to the root window
   XEvent ev;
+
+  // check if the app has already reparented its window away
   if (XCheckTypedWindowEvent(otk::OBDisplay::display, _client->window(),
                              ReparentNotify, &ev)) {
-    remap = true; // XXX: why do we remap the window if they already
-                  // reparented to root?
+    XPutBackEvent(otk::OBDisplay::display, &ev);
   } else {
-    // according to the ICCCM - if the client doesn't reparent to
-    // root, then we have to do it for them
+    // according to the ICCCM - if the client doesn't reparent itself, then we
+    // will reparent the window to root for them
     XReparentWindow(otk::OBDisplay::display, _client->window(),
                     _screen->rootWindow(),
                     _client->area().x(), _client->area().y());
   }
-
-  // if we want to remap the window, do so now
-  if (remap)
-    XMapWindow(otk::OBDisplay::display, _client->window());
 }
 
 
This page took 0.021889 seconds and 4 git commands to generate.