#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
static void event_process(XEvent *e);
static void event_handle_root(XEvent *e);
/* pick a window */
switch (e->type) {
+ case MapRequest:
+ window = e->xmap.window;
+ break;
case UnmapNotify:
window = e->xunmap.window;
break;
event_lasttime = e->xproperty.time;
break;
case FocusIn:
+ if (e->xfocus.mode == NotifyGrab) return;
+/* if (e->type == FocusIn && window == focus_backup && focus_client != NULL) {
+*/
+ /* Something's focused but we got a focus event for the backup
+ window. this means that something unfocused before we received
+ the new FocusIn. Just ignore it, and refocus what should be
+ focused! */
+/* client_focus(focus_client);
+ return;
+ }
+*/
+ break;
case FocusOut:
- if (e->xfocus.mode == NotifyGrab)
+ if (e->xfocus.mode == NotifyGrab) return;
/*|| e.xfocus.mode == NotifyUngrab ||*/
-
/* From Metacity, from WindowMaker, ignore all funky pointer
root events. Its commented out cuz I don't think we need this
at all. If problems arise we can look into it */
/*e.xfocus.detail > NotifyNonlinearVirtual) */
- return; /* skip me! */
- if (e->type == FocusOut) {
- /* FocusOut events just make us look for FocusIn events. They
- are mostly ignored otherwise. */
- XEvent fi;
- if (XCheckTypedEvent(ob_display, FocusIn, &fi)) {
+
+ /* FocusOut events just make us look for FocusIn events. They
+ are mostly ignored otherwise. */
+ {
+ XEvent fi;
+ if (XCheckTypedEvent(ob_display, FocusIn, &fi)) {
event_process(&fi);
/* dont unfocus the window we just focused! */
if (fi.xfocus.window == e->xfocus.window)
return;
}
- }
+ }
break;
case EnterNotify:
case LeaveNotify:
client = g_hash_table_lookup(client_map, (gpointer)window);
/* deal with it in the kernel */
- if (client) {
+ if (client)
event_handle_client(client, e);
- } else if (window == ob_root)
+ else if (window == ob_root)
event_handle_root(e);
+ else if (e->type == MapRequest)
+ client_manage(window);
else if (e->type == ConfigureRequest) {
/* unhandled configure requests must be used to configure the
window directly */
Atom msgtype;
switch(e->type) {
- case MapRequest:
- g_message("MapRequest on root");
- client_manage(e->xmap.window);
- break;
case ClientMessage:
if (e->xclient.format != 32) break;
switch (e->type) {
case FocusIn:
- client_set_focused(client, TRUE);
+ if (focus_client != client)
+ focus_set_client(client);
+
+ /* focus state can affect the stacking layer */
+ client_calc_layer(client);
+
+ engine_frame_adjust_focus(client->frame);
break;
case FocusOut:
- client_set_focused(client, FALSE);
+ if (focus_client == client)
+ focus_set_client(NULL);
+
+ /* focus state can affect the stacking layer */
+ client_calc_layer(client);
+
+ engine_frame_adjust_focus(client->frame);
break;
case ConfigureRequest:
g_message("ConfigureRequest for window %lx", client->window);
client_unmanage(client);
break;
case MapRequest:
- /* we shouldn't be able to get this unless we're iconic */
- g_assert(client->iconic);
-
if (screen_showing_desktop)
screen_show_desktop(FALSE);
client_iconify(client, FALSE, TRUE);