+void event_leave_client(ObClient *client)
+{
+ g_assert(config_focus_follow);
+
+ if (is_enter_focus_event_ignored(event_curserial)) {
+ ob_debug_type(OB_DEBUG_FOCUS, "Ignoring leave event with serial %lu\n"
+ "on client 0x%x", event_curserial, client->window);
+ return;
+ }
+
+ if (client == focus_client) {
+ if (config_focus_delay) {
+ ObFocusDelayData *data;
+
+ obt_main_loop_timeout_remove(ob_main_loop, unfocus_delay_func);
+
+ data = g_slice_new(ObFocusDelayData);
+ data->client = client;
+ data->time = event_curtime;
+ data->serial = event_curserial;
+
+ obt_main_loop_timeout_add(ob_main_loop,
+ config_focus_delay * 1000,
+ unfocus_delay_func,
+ data, focus_delay_cmp, focus_delay_dest);
+ } else {
+ ObFocusDelayData data;
+ data.client = client;
+ data.time = event_curtime;
+ data.serial = event_curserial;
+ unfocus_delay_func(&data);
+ }
+ }
+}
+
+static gboolean *context_to_button(ObFrame *f, ObFrameContext con, gboolean press)
+{
+ if (press) {
+ switch (con) {
+ case OB_FRAME_CONTEXT_MAXIMIZE:
+ return &f->max_press;
+ case OB_FRAME_CONTEXT_CLOSE:
+ return &f->close_press;
+ case OB_FRAME_CONTEXT_ICONIFY:
+ return &f->iconify_press;
+ case OB_FRAME_CONTEXT_ALLDESKTOPS:
+ return &f->desk_press;
+ case OB_FRAME_CONTEXT_SHADE:
+ return &f->shade_press;
+ default:
+ return NULL;
+ }
+ } else {
+ switch (con) {
+ case OB_FRAME_CONTEXT_MAXIMIZE:
+ return &f->max_hover;
+ case OB_FRAME_CONTEXT_CLOSE:
+ return &f->close_hover;
+ case OB_FRAME_CONTEXT_ICONIFY:
+ return &f->iconify_hover;
+ case OB_FRAME_CONTEXT_ALLDESKTOPS:
+ return &f->desk_hover;
+ case OB_FRAME_CONTEXT_SHADE:
+ return &f->shade_hover;
+ default:
+ return NULL;
+ }
+ }
+}
+
+static void compress_client_message_event(XEvent *e, XEvent *ce, Window window,
+ Atom msgtype)
+{
+ /* compress changes into a single change */
+ while (XCheckTypedWindowEvent(obt_display, window, e->type, ce)) {
+ /* XXX: it would be nice to compress ALL messages of a
+ type, not just messages in a row without other
+ message types between. */
+ if (ce->xclient.message_type != msgtype) {
+ XPutBackEvent(obt_display, ce);
+ break;
+ }
+ e->xclient = ce->xclient;
+ }
+}
+