done = 1;
} else
{ // We currently use X marshalling for xatom events, we can switch to something else later
- recieve_custom_xatoms((xatom_event *)ptr);
+ receive_custom_xatoms((xatom_event *)ptr);
}
break;
case XK_KP_Subtract: key_pressed = KPMINUS; break;
case XK_KP_Multiply: key_pressed = KPSTAR; break;
case XK_KP_Divide: key_pressed = KPSLASH; break;
- case XK_KP_1: key_pressed = '1'; break;
+ case XK_KP_1:
case XK_KP_End: key_pressed = KP1; break;
- case XK_KP_2: key_pressed = '2'; break;
+ case XK_KP_2:
case XK_KP_Down: key_pressed = KP2; break;
- case XK_KP_3: key_pressed = '3'; break;
+ case XK_KP_3:
case XK_KP_Page_Down: key_pressed = KP3; break;
- case XK_KP_4: key_pressed = '4'; break;
+ case XK_KP_4:
case XK_KP_Left: key_pressed = KP4; break;
- case XK_KP_5: key_pressed = '5'; break;
+ case XK_KP_5:
case XK_KP_Begin: key_pressed = KP5; break;
- case XK_KP_6: key_pressed = '6'; break;
+ case XK_KP_6:
case XK_KP_Right: key_pressed = KP6; break;
- case XK_KP_7: key_pressed = '7'; break;
+ case XK_KP_7:
case XK_KP_Home: key_pressed = KP7; break;
- case XK_KP_8: key_pressed = '8'; break;
+ case XK_KP_8:
case XK_KP_Up: key_pressed = KP8; break;
- case XK_KP_9: key_pressed = '9'; break;
+ case XK_KP_9:
case XK_KP_Page_Up: key_pressed = KP9; break;
- case XK_KP_0: key_pressed = '0'; break;
+ case XK_KP_0:
case XK_KP_Insert: key_pressed = KPINS; break;
case XK_KP_Decimal:
case XK_KP_Delete: key_pressed = KPDEL; break;
break;
case LeaveNotify:
- if( cursor_entered && event->xcrossing.window == win ) {
- cursor_entered = 0;
- }
+ if( event->xcrossing.mode != NotifyNormal ) break;
+ cursor_entered = 0;
event_win = event->xany.window;
dispatch_cursor_leave();
break;
case EnterNotify:
- if( !cursor_entered && event->xcrossing.window == win ) {
- if( !event->xcrossing.focus && get_resources()->grab_input_focus ) {
- XSetInputFocus(display, win, RevertToParent, CurrentTime);
+ if( event->xcrossing.mode != NotifyNormal ) break;
+
+ 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;
}
#endif
-int BC_WindowBase::recieve_custom_xatoms(xatom_event *event)
+int BC_WindowBase::receive_custom_xatoms(xatom_event *event)
{
return 0;
}
return 0;
}
+void BC_WindowBase::get_fullscreen_geometry(int &wx, int &wy, int &ww, int &wh)
+{
+ XineramaScreenInfo *info = top_level->get_xinerama_info(-1);
+ if( info ) {
+ wx = info->x_org; wy = info->y_org;
+ ww = info->width; wh = info->height;
+ }
+ else {
+ wx = get_screen_x(0, -1);
+ wy = get_screen_y(0, -1);
+ int scr_w0 = get_screen_w(0, 0);
+ int root_w = get_root_w(0);
+ int root_h = get_root_h(0);
+ if( root_w > scr_w0 ) { // multi-headed
+ if( wx >= scr_w0 ) {
+ // assumes right side is the big one
+ ww = root_w - scr_w0;
+ wh = root_h;
+ }
+ else {
+ // use same aspect ratio to compute left height
+ ww = scr_w0;
+ wh = (w*root_h) / (root_w-scr_w0);
+ }
+ }
+ else {
+ ww = root_w;
+ wh = root_h;
+ }
+ }
+}
+
int BC_WindowBase::get_screen_x(int lock_display, int screen)
{
int result = -1;
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);
+}
+