#include <X11/Xatom.h>
#include <glib.h>
-#ifdef USE_LIBSN
-# include <libsn/sn.h>
-#endif
-
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
static void event_handle_dockapp(ObDockApp *app, XEvent *e);
static void event_handle_client(ObClient *c, XEvent *e);
+static gboolean focus_delay_func(gpointer data);
+static void focus_delay_client_dest(gpointer data);
+
#define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
(e)->xfocus.detail == NotifyAncestor || \
(e)->xfocus.detail > NotifyNonlinearVirtual)
};
static int mask_table_size;
+static ObClient *focus_delay_client;
+
#ifdef USE_SM
static void ice_handler(int fd, gpointer conn)
{
}
#endif
-#ifdef USE_LIBSN
-static void sn_handler(const XEvent *e, gpointer display)
+void event_startup(gboolean reconfig)
{
- XEvent ec;
- ec = *e;
- sn_display_process_event(display, &ec);
-}
-#endif
-
+ if (reconfig) return;
-void event_startup()
-{
mask_table_size = sizeof(mask_table) / sizeof(mask_table[0]);
/* get lock masks that are defined by the display (not constant) */
IceAddConnectionWatch(ice_watch, NULL);
#endif
-#ifdef USE_LIBSN
- ob_main_loop_x_add(ob_main_loop, sn_handler, ob_sn_display, NULL);
-#endif
+ client_add_destructor(focus_delay_client_dest);
}
-void event_shutdown()
+void event_shutdown(gboolean reconfig)
{
+ if (reconfig) return;
+
+ client_remove_destructor(focus_delay_client_dest);
XFreeModifiermap(modmap);
}
ee = *ec;
e = ⅇ
- g_message("Event %d", e->type);
-
window = event_get_window(e);
if ((obwin = g_hash_table_lookup(window_map, &window))) {
switch (obwin->type) {
client->frame->close_hover = FALSE;
frame_adjust_state(client->frame);
break;
+ case OB_FRAME_CONTEXT_FRAME:
+ /* XXX if doing a 'reconfigure' make sure you kill this timer,
+ maybe all timers.. */
+ if (config_focus_delay && client == focus_delay_client) {
+ ob_main_loop_timeout_remove_data(ob_main_loop,
+ focus_delay_func,
+ focus_delay_client);
+ focus_delay_client = NULL;
+ }
default:
break;
}
ob_debug("EnterNotify on %lx, focusing window\n",
client->window);
#endif
- client_focus(client);
+ if (config_focus_delay) {
+ ob_main_loop_timeout_add(ob_main_loop,
+ config_focus_delay,
+ focus_delay_func,
+ client, NULL);
+ focus_delay_client = client;
+ } else
+ client_focus(client);
}
}
break;
break;
}
}
+
+static gboolean focus_delay_func(gpointer data)
+{
+ client_focus(focus_delay_client);
+ return FALSE; /* no repeat */
+}
+
+static void focus_delay_client_dest(gpointer data)
+{
+ ObClient *c = data;
+ if (c == focus_delay_client) {
+ ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func,
+ focus_delay_client);
+ focus_delay_client = NULL;
+ }
+}