ignore the right about of unmap notifies
This commit is contained in:
parent
a2de94e91e
commit
e5eb783aa2
2 changed files with 20 additions and 12 deletions
|
@ -104,14 +104,14 @@ void OtkEventDispatcher::dispatchEvents(void)
|
|||
if (e.xfocus.detail == NotifyNonlinear) {
|
||||
focus = e.xfocus.window;
|
||||
unfocus = None;
|
||||
printf("FocusIn focus=%lx unfocus=%lx\n", focus, unfocus);
|
||||
//printf("FocusIn focus=%lx unfocus=%lx\n", focus, unfocus);
|
||||
}
|
||||
} else if (e.type == FocusOut) {
|
||||
// any other types are not ones we're interested in
|
||||
if (e.xfocus.detail == NotifyNonlinear) {
|
||||
unfocus = e.xfocus.window;
|
||||
focus = None;
|
||||
printf("FocusOut focus=%lx unfocus=%lx\n", focus, unfocus);
|
||||
//printf("FocusOut focus=%lx unfocus=%lx\n", focus, unfocus);
|
||||
}
|
||||
// madly compress all crossing events
|
||||
} else if (e.type == EnterNotify) {
|
||||
|
@ -120,14 +120,14 @@ void OtkEventDispatcher::dispatchEvents(void)
|
|||
// any other types are not ones we're interested in
|
||||
enter = e.xcrossing.window;
|
||||
enter_root = e.xcrossing.root;
|
||||
printf("Enter enter=%lx leave=%lx\n", enter, leave);
|
||||
//printf("Enter enter=%lx leave=%lx\n", enter, leave);
|
||||
}
|
||||
} else if (e.type == LeaveNotify) {
|
||||
// any other types are not ones we're interested in
|
||||
if (e.xcrossing.mode == NotifyNormal) {
|
||||
leave = e.xcrossing.window;
|
||||
leave_root = e.xcrossing.root;
|
||||
printf("Leave enter=%lx leave=%lx\n", enter, leave);
|
||||
//printf("Leave enter=%lx leave=%lx\n", enter, leave);
|
||||
}
|
||||
} else {
|
||||
// normal events
|
||||
|
@ -137,7 +137,7 @@ void OtkEventDispatcher::dispatchEvents(void)
|
|||
|
||||
if (unfocus != None) {
|
||||
// the last focus event was an FocusOut, so where the hell is the focus at?
|
||||
printf("UNFOCUSING: %lx\n", unfocus);
|
||||
//printf("UNFOCUSING: %lx\n", unfocus);
|
||||
_focus_e.xfocus.type = FocusOut;
|
||||
_focus_e.xfocus.window = unfocus;
|
||||
dispatch(_focus_e.xfocus.window, _focus_e);
|
||||
|
@ -146,13 +146,13 @@ void OtkEventDispatcher::dispatchEvents(void)
|
|||
} else if (focus != None && focus != _focus) {
|
||||
// the last focus event was a FocusIn, so unfocus what used to be focus and
|
||||
// focus this new target
|
||||
printf("FOCUSING: %lx\n", focus);
|
||||
//printf("FOCUSING: %lx\n", focus);
|
||||
_focus_e.xfocus.type = FocusIn;
|
||||
_focus_e.xfocus.window = focus;
|
||||
dispatch(_focus_e.xfocus.window, _focus_e);
|
||||
|
||||
if (_focus != None) {
|
||||
printf("UNFOCUSING: %lx\n", _focus);
|
||||
//printf("UNFOCUSING: %lx\n", _focus);
|
||||
_focus_e.xfocus.type = FocusOut;
|
||||
_focus_e.xfocus.window = _focus;
|
||||
dispatch(_focus_e.xfocus.window, _focus_e);
|
||||
|
|
16
src/frame.cc
16
src/frame.cc
|
@ -407,8 +407,15 @@ void OBFrame::grabClient()
|
|||
// reparent the client to the frame
|
||||
XReparentWindow(otk::OBDisplay::display, _client->window(),
|
||||
_plate.window(), 0, 0);
|
||||
// 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
|
||||
/*
|
||||
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)
|
||||
|
@ -430,7 +437,8 @@ void OBFrame::releaseClient()
|
|||
if (XCheckTypedWindowEvent(otk::OBDisplay::display, _client->window(),
|
||||
ReparentNotify, &ev)) {
|
||||
// XXX: ob2/bb didn't do this.. look up this process in other wm's!
|
||||
XPutBackEvent(otk::OBDisplay::display, &ev);
|
||||
//XPutBackEvent(otk::OBDisplay::display, &ev);
|
||||
XMapWindow(otk::OBDisplay::display, _client->window());
|
||||
} else {
|
||||
// according to the ICCCM - if the client doesn't reparent to
|
||||
// root, then we have to do it for them
|
||||
|
@ -440,7 +448,7 @@ void OBFrame::releaseClient()
|
|||
}
|
||||
|
||||
// do an extra map here .. ? XXX
|
||||
XMapWindow(otk::OBDisplay::display, _client->window());
|
||||
// XMapWindow(otk::OBDisplay::display, _client->window());
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue