#include "extensions.h"
#include "timer.h"
#include "engine.h"
+#include "dispatch.h"
#include <X11/Xlib.h>
#include <X11/keysym.h>
Time event_lasttime = 0;
-/*! A list of all possible combinations of keyboard lock masks */
-static unsigned int mask_list[8];
/*! The value of the mask for the NumLock modifier */
-static unsigned int NumLockMask;
+unsigned int NumLockMask;
/*! The value of the mask for the ScrollLock modifier */
-static unsigned int ScrollLockMask;
+unsigned int ScrollLockMask;
/*! The key codes for the modifier keys */
static XModifierKeymap *modmap;
/*! Table of the constant modifier masks */
ScrollLockMask = mask_table[cnt / modmap->max_keypermod];
}
}
-
- mask_list[0] = 0;
- mask_list[1] = LockMask;
- mask_list[2] = NumLockMask;
- mask_list[3] = LockMask | NumLockMask;
- mask_list[4] = ScrollLockMask;
- mask_list[5] = ScrollLockMask | LockMask;
- mask_list[6] = ScrollLockMask | NumLockMask;
- mask_list[7] = ScrollLockMask | LockMask | NumLockMask;
}
void event_shutdown()
case EnterNotify:
case LeaveNotify:
event_lasttime = e->xcrossing.time;
+ /* XXX this caused problems before... but i don't remember why. hah.
+ so back it is. if problems arise again, then try filtering on the
+ detail instead of the mode. */
+ if (e->xcrossing.mode != NotifyNormal) return;
break;
}
client = g_hash_table_lookup(client_map, (gpointer)window);
+ /* deal with it in the kernel */
if (client) {
event_handle_client(client, e);
} else if (window == ob_root)
xerror_set_ignore(FALSE);
}
- /* dispatch Crossing, Pointer and Key events to the hooks */
- switch(e->type) {
- case EnterNotify:
- if (client != NULL) engine_mouse_enter(client->frame, window);
- /*HOOKFIRECLIENT(pointerenter, client);XXX*/
- break;
- case LeaveNotify:
- if (client != NULL) engine_mouse_leave(client->frame, window);
- /*HOOKFIRECLIENT(pointerleave, client);XXX*/
- break;
- case ButtonPress:
- if (client != NULL)
- engine_mouse_press(client->frame, window,
- e->xbutton.x, e->xbutton.y);
- /*pointer_event(e, client);XXX*/
- break;
- case ButtonRelease:
- if (client != NULL)
- engine_mouse_release(client->frame, window,
- e->xbutton.x, e->xbutton.y);
- /*pointer_event(e, client);XXX*/
- break;
- case MotionNotify:
- /*pointer_event(e, client);XXX*/
- break;
- case KeyPress:
- case KeyRelease:
- /*keyboard_event(&e->xkey);XXX*/
- break;
- default:
- /* XKB events */
- if (e->type == extensions_xkb_event_basep) {
- switch (((XkbAnyEvent*)&e)->xkb_type) {
- case XkbBellNotify:
- /*HOOKFIRECLIENT(bell, client);XXX*/
- break;
- }
- }
- }
+ /* dispatch the event to registered handlers */
+ dispatch_x(e, client);
}
static void event_handle_root(XEvent *e)
/* focus state can affect the stacking layer */
client_calc_layer(client);
- focus_set_client(client);
+ if (focus_client != client)
+ focus_set_client(client);
break;
case FocusOut:
client->focused = FALSE;
/* we shouldn't be able to get this unless we're iconic */
g_assert(client->iconic);
- /*HOOKFIRECLIENT(requestactivate, client);XXX*/
+ if (screen_showing_desktop)
+ screen_show_desktop(FALSE);
+ client_iconify(client, FALSE, TRUE);
+ if (!client->frame->visible)
+ /* if its not visible still, then don't mess with it */
+ break;
+ if (client->shaded)
+ client_shade(client, FALSE);
+ client_focus(client);
+ stacking_raise(client);
break;
case ClientMessage:
/* validate cuz we query stuff off the client here */
else if (!client->frame->visible)
/* if its not visible for other reasons, then don't mess
with it */
- return;
- /*HOOKFIRECLIENT(requestactivate, client);XXX*/
+ break;
+ if (client->shaded)
+ client_shade(client, FALSE);
+ client_focus(client);
+ stacking_raise(client);
}
break;
case PropertyNotify: