]> Dogcows Code - chaz/openbox/commitdiff
handle unmaps better. all thanks to acroread sending wacky unmap events
authorDana Jansens <danakj@orodu.net>
Tue, 7 Jan 2003 09:30:00 +0000 (09:30 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 7 Jan 2003 09:30:00 +0000 (09:30 +0000)
otk/eventdispatcher.cc
otk/eventdispatcher.hh
src/client.cc
src/frame.cc
src/frame.hh
src/screen.cc

index 22ad73c1c4557c1e83cb76be5d9a03a798fd229d..36802f164d59f021e210d1a1e88ec00983040687 100644 (file)
@@ -43,7 +43,6 @@ void OtkEventDispatcher::clearHandler(Window id)
 
 void OtkEventDispatcher::dispatchEvents(void)
 {
-  OtkEventMap::iterator it;
   XEvent e;
   Window focus = None, unfocus = None;
   Window enter = None, leave = None;
@@ -52,10 +51,27 @@ void OtkEventDispatcher::dispatchEvents(void)
   while (XPending(OBDisplay::display)) {
     XNextEvent(OBDisplay::display, &e);
 
-#if 0
+#if 0//defined(DEBUG)
     printf("Event %d window %lx\n", e.type, e.xany.window);
 #endif
 
+    Window win;
+
+    // pick a window
+    switch (e.type) {
+    case UnmapNotify:
+      win = e.xunmap.window;
+      break;
+    case DestroyNotify:
+      win = e.xdestroywindow.window;
+      break;
+    case ConfigureRequest:
+      win = e.xconfigurerequest.window;
+      break;
+    default:
+      win = e.xany.window;
+    }
+    
     // grab the lasttime and hack up the modifiers
     switch (e.type) {
     case ButtonPress:
@@ -74,40 +90,16 @@ void OtkEventDispatcher::dispatchEvents(void)
                            OBDisplay::scrollLockMask());
       break;
     case PropertyNotify:
-      _lasttime = e.xproperty.time; break;
+      _lasttime = e.xproperty.time;
+      break;
     case EnterNotify:
     case LeaveNotify:
-      _lasttime = e.xcrossing.time; break;
+      _lasttime = e.xcrossing.time;
+      break;
     }
 
-    // these ConfigureRequests require some special attention
-    if (e.type == ConfigureRequest) {
-      // find the actual window! e.xany.window is the parent window
-      it = _map.find(e.xconfigurerequest.window);
-
-      if (_master)
-        _master->handle(e);
-
-      if (it != _map.end())
-        it->second->handle(e);
-      else {
-        // unhandled configure requests must be used to configure the window
-        // directly
-        XWindowChanges xwc;
-
-        xwc.x = e.xconfigurerequest.x;
-        xwc.y = e.xconfigurerequest.y;
-        xwc.width = e.xconfigurerequest.width;
-        xwc.height = e.xconfigurerequest.height;
-        xwc.border_width = e.xconfigurerequest.border_width;
-        xwc.sibling = e.xconfigurerequest.above;
-        xwc.stack_mode = e.xconfigurerequest.detail;
-
-        XConfigureWindow(otk::OBDisplay::display, e.xconfigurerequest.window,
-                         e.xconfigurerequest.value_mask, &xwc);
-      }
     // madly compress all focus events
-    } else if (e.type == FocusIn) {
+    if (e.type == FocusIn) {
       // any other types are not ones we're interested in
       if (e.xfocus.detail == NotifyNonlinear) {
         focus = e.xfocus.window;
@@ -139,7 +131,7 @@ void OtkEventDispatcher::dispatchEvents(void)
       }
     } else {
       // normal events
-      dispatch(e);
+      dispatch(win, e);
     }
   }
 
@@ -148,7 +140,7 @@ void OtkEventDispatcher::dispatchEvents(void)
     //printf("UNFOCUSING: %lx\n", unfocus);
     _focus_e.xfocus.type = FocusOut;
     _focus_e.xfocus.window = unfocus;
-    dispatch(_focus_e);
+    dispatch(_focus_e.xfocus.window, _focus_e);
 
     _focus = None;
   } else if (focus != None && focus != _focus) {
@@ -157,13 +149,13 @@ void OtkEventDispatcher::dispatchEvents(void)
     //printf("FOCUSING: %lx\n", focus);
     _focus_e.xfocus.type = FocusIn;
     _focus_e.xfocus.window = focus;
-    dispatch(_focus_e);
+    dispatch(_focus_e.xfocus.window, _focus_e);
 
     if (_focus != None) {
       //printf("UNFOCUSING: %lx\n", _focus);
       _focus_e.xfocus.type = FocusOut;
       _focus_e.xfocus.window = _focus;
-      dispatch(_focus_e);
+      dispatch(_focus_e.xfocus.window, _focus_e);
     }
     
     _focus = focus;
@@ -173,28 +165,44 @@ void OtkEventDispatcher::dispatchEvents(void)
     _crossing_e.xcrossing.type = LeaveNotify;
     _crossing_e.xcrossing.window = leave;
     _crossing_e.xcrossing.root = leave_root;
-    dispatch(_crossing_e);
+    dispatch(_crossing_e.xcrossing.window, _crossing_e);
   }
   if (enter != None) {
     _crossing_e.xcrossing.type = EnterNotify;
     _crossing_e.xcrossing.window = enter;
     _crossing_e.xcrossing.root = enter_root;
-    dispatch(_crossing_e);
+    dispatch(_crossing_e.xcrossing.window, _crossing_e);
   }
 }
 
-void OtkEventDispatcher::dispatch(const XEvent &e) {
-  OtkEventHandler *handler;
+void OtkEventDispatcher::dispatch(Window win, const XEvent &e) {
+  OtkEventHandler *handler = 0;
   OtkEventMap::iterator it;
 
   if (_master)
     _master->handle(e);
 
-  it = _map.find(e.xany.window);
+  it = _map.find(win);
   
   if (it != _map.end())
     handler = it->second;
-  else
+  // these ConfigureRequests require some special attention
+  else if (e.type == ConfigureRequest) {
+    // unhandled configure requests must be used to configure the window
+    // directly
+    XWindowChanges xwc;
+      
+    xwc.x = e.xconfigurerequest.x;
+    xwc.y = e.xconfigurerequest.y;
+    xwc.width = e.xconfigurerequest.width;
+    xwc.height = e.xconfigurerequest.height;
+    xwc.border_width = e.xconfigurerequest.border_width;
+    xwc.sibling = e.xconfigurerequest.above;
+    xwc.stack_mode = e.xconfigurerequest.detail;
+      
+    XConfigureWindow(otk::OBDisplay::display, e.xconfigurerequest.window,
+                     e.xconfigurerequest.value_mask, &xwc);
+  } else
     handler = _fallback;
 
   if (handler)
index 6a66afd1e632c23ef85eb7fcd48bbbe1246ff763..caf33ad0817b454e0f52f9ec41897082e046b0f9 100644 (file)
@@ -45,7 +45,7 @@ private:
   //! The time at which the last XEvent with a time was received
   Time _lasttime;
 
-  void dispatch(const XEvent &e);
+  void dispatch(Window win, const XEvent &e);
 };
 
 }
index 320fe4d76810524e15cfbc0e9ba95f6fd6b05298..d38ca79b0e39a613618b83e8215d17eedc5fdf38 100644 (file)
@@ -1219,15 +1219,18 @@ void OBClient::configureRequestHandler(const XConfigureRequestEvent &e)
 
 void OBClient::unmapHandler(const XUnmapEvent &e)
 {
+  if (ignore_unmaps) {
 #ifdef    DEBUG
-  printf("UnmapNotify for 0x%lx\n", e.window);
+    printf("Ignored UnmapNotify for 0x%lx (event 0x%lx)\n", e.window, e.event);
 #endif // DEBUG
-
-  if (ignore_unmaps) {
     ignore_unmaps--;
     return;
   }
   
+#ifdef    DEBUG
+  printf("UnmapNotify for 0x%lx\n", e.window);
+#endif // DEBUG
+
   OtkEventHandler::unmapHandler(e);
 
   // this deletes us etc
index 0cc96c2a6e401272ce062fdb1d1f9b9a4efb2831..5bed5833428cc001ef0860cdecf0504096b5d4e8 100644 (file)
@@ -63,7 +63,7 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style)
 
 OBFrame::~OBFrame()
 {
-  releaseClient(false);
+  releaseClient();
 }
 
 
@@ -404,11 +404,12 @@ 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++;
+  // this generates 2 unmap's that we catch, one to the window and one to root,
+  // but both have .window set to this window, so both need to be ignored
+  _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,14 +423,14 @@ 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;
   if (XCheckTypedWindowEvent(otk::OBDisplay::display, _client->window(),
                              ReparentNotify, &ev)) {
-    remap = true; // XXX: why do we remap the window if they already
-                  // reparented to root?
+    // XXX: ob2/bb didn't do this.. look up this process in other wm's!
+    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
@@ -438,9 +439,8 @@ void OBFrame::releaseClient(bool remap)
                     _client->area().x(), _client->area().y());
   }
 
-  // if we want to remap the window, do so now
-  if (remap)
-    XMapWindow(otk::OBDisplay::display, _client->window());
+  // do an extra map here .. ? XXX
+  XMapWindow(otk::OBDisplay::display, _client->window());
 }
 
 
index a36a6eec531cbe3ea46c318bb5ae67da81ff6590..b204567ed75fcadbccfc2090b9455f554ec4a926 100644 (file)
@@ -70,10 +70,7 @@ private:
   //! Reparents the client window from the root window onto the frame
   void grabClient();
   //! Reparents the client window back to the root window
-  /*!
-    @param remap Re-map the client window when we're done reparenting?
-  */
-  void releaseClient(bool remap);
+  void releaseClient();
 
 public:
   //! Constructs an OBFrame object, and reparents the client to itself
index 2dcc110f5b668381ec791716af77f2dbf0833a31..3c364b4c25827528beede789704b8ba7ae5cd943 100644 (file)
@@ -459,19 +459,21 @@ void OBScreen::manageWindow(Window window)
   XWMHints *wmhint;
   XSetWindowAttributes attrib_set;
 
+  otk::OBDisplay::grab();
+
   // is the window a docking app
   if ((wmhint = XGetWMHints(otk::OBDisplay::display, window))) {
     if ((wmhint->flags & StateHint) &&
         wmhint->initial_state == WithdrawnState) {
       //slit->addClient(w); // XXX: make dock apps work!
+      otk::OBDisplay::ungrab();
+
       XFree(wmhint);
       return;
     }
     XFree(wmhint);
   }
 
-  otk::OBDisplay::grab();
-
   // choose the events we want to receive on the CLIENT window
   attrib_set.event_mask = OBClient::event_mask;
   attrib_set.do_not_propagate_mask = OBClient::no_propagate_mask;
@@ -517,12 +519,9 @@ void OBScreen::manageWindow(Window window)
   Openbox::instance->addClient(client->frame->grip_left(), client);
   Openbox::instance->addClient(client->frame->grip_right(), client);
 
-  bool shown = false;
-  
   // if on the current desktop.. (or all desktops)
   if (client->desktop() == _desktop ||
       client->desktop() == (signed)0xffffffff) {
-    shown = true;
     client->frame->show();
   }
  
This page took 0.03645 seconds and 4 git commands to generate.