case LeaveNotify:
if( event->xcrossing.mode != NotifyNormal ) break;
- if( cursor_entered && event->xcrossing.window == win ) {
- cursor_entered = 0;
- }
+ cursor_entered = 0;
event_win = event->xany.window;
dispatch_cursor_leave();
break;
case EnterNotify:
if( event->xcrossing.mode != NotifyNormal ) break;
- if( !cursor_entered && event->xcrossing.window == win ) {
- if( !event->xcrossing.focus && get_resources()->grab_input_focus ) {
- XSetInputFocus(display, win, RevertToParent, CurrentTime);
+
+ if( !cursor_entered ) {
+ for( int i=0; i<popups.size(); ++i ) { // popups always take focus
+ if( popups[i]->win == event->xcrossing.window )
+ cursor_entered = 1;
+ }
+ if( !cursor_entered && get_resources()->grab_input_focus &&
+ !event->xcrossing.focus && event->xcrossing.window == win ) {
+ cursor_entered = 1;
}
- cursor_entered = 1;
+ if( cursor_entered )
+ focus();
}
event_win = event->xany.window;
cursor_x = event->xcrossing.x;
set_opaque();
}
+void BC_WindowBase::focus()
+{
+ XWindowAttributes xwa;
+ XGetWindowAttributes(top_level->display, top_level->win, &xwa);
+ if( xwa.map_state == IsViewable )
+ XSetInputFocus(top_level->display, top_level->win, RevertToParent, CurrentTime);
+}
+