#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);
}
gboolean fallback = TRUE;
while (TRUE) {
- if (!XCheckTypedWindowEvent(ob_display, FocusOut,
- e->xfocus.window,&fe))
+ if (!XCheckTypedWindowEvent(ob_display, e->xfocus.window,
+ FocusOut, &fe))
if (!XCheckTypedEvent(ob_display, FocusIn, &fe))
break;
if (fe.type == FocusOut) {
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;
msgtype = e->xclient.message_type;
if (msgtype == prop_atoms.wm_change_state) {
/* compress changes into a single change */
- while (XCheckTypedWindowEvent(ob_display, e->type,
- client->window, &ce)) {
+ while (XCheckTypedWindowEvent(ob_display, client->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. */
client_set_wm_state(client, e->xclient.data.l[0]);
} else if (msgtype == prop_atoms.net_wm_desktop) {
/* compress changes into a single change */
- while (XCheckTypedWindowEvent(ob_display, e->type,
- client->window, &ce)) {
+ while (XCheckTypedWindowEvent(ob_display, client->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 (!client_validate(client)) break;
/* compress changes to a single property into a single change */
- while (XCheckTypedWindowEvent(ob_display, e->type,
- client->window, &ce)) {
- /* XXX: it would be nice to compress ALL changes to a property,
+ while (XCheckTypedWindowEvent(ob_display, client->window,
+ e->type, &ce)) {
+ Atom a, b;
+
+ /* XXX: it would be nice to compress ALL changes to a property,
not just changes in a row without other props between. */
- if (ce.xproperty.atom != e->xproperty.atom) {
- XPutBackEvent(ob_display, &ce);
- break;
- }
+
+ a = ce.xproperty.atom;
+ b = e->xproperty.atom;
+
+ if (a == b)
+ continue;
+ if ((a == prop_atoms.net_wm_name ||
+ a == prop_atoms.wm_name ||
+ a == prop_atoms.net_wm_icon_name ||
+ a == prop_atoms.wm_icon_name)
+ &&
+ (b == prop_atoms.net_wm_name ||
+ b == prop_atoms.wm_name ||
+ b == prop_atoms.net_wm_icon_name ||
+ b == prop_atoms.wm_icon_name)) {
+ continue;
+ }
+ if ((a == prop_atoms.net_wm_icon ||
+ a == prop_atoms.kwm_win_icon)
+ &&
+ (b == prop_atoms.net_wm_icon ||
+ b == prop_atoms.kwm_win_icon))
+ continue;
+
+ XPutBackEvent(ob_display, &ce);
+ break;
}
msgtype = e->xproperty.atom;
client_update_normal_hints(client);
/* normal hints can make a window non-resizable */
client_setup_decor_and_functions(client);
- }
- else if (msgtype == XA_WM_HINTS)
+ } else if (msgtype == XA_WM_HINTS) {
client_update_wmhints(client);
- else if (msgtype == XA_WM_TRANSIENT_FOR) {
+ } else if (msgtype == XA_WM_TRANSIENT_FOR) {
client_update_transient_for(client);
client_get_type(client);
/* type may have changed, so update the layer */
client_calc_layer(client);
client_setup_decor_and_functions(client);
- }
- else if (msgtype == prop_atoms.net_wm_name ||
- msgtype == prop_atoms.wm_name ||
- msgtype == prop_atoms.net_wm_icon_name ||
- msgtype == prop_atoms.wm_icon_name)
+ } else if (msgtype == prop_atoms.net_wm_name ||
+ msgtype == prop_atoms.wm_name ||
+ msgtype == prop_atoms.net_wm_icon_name ||
+ msgtype == prop_atoms.wm_icon_name) {
client_update_title(client);
- else if (msgtype == prop_atoms.wm_class)
+ } else if (msgtype == prop_atoms.wm_class) {
client_update_class(client);
- else if (msgtype == prop_atoms.wm_protocols) {
+ } else if (msgtype == prop_atoms.wm_protocols) {
client_update_protocols(client);
client_setup_decor_and_functions(client);
}
client_update_strut(client);
}
else if (msgtype == prop_atoms.net_wm_icon ||
- msgtype == prop_atoms.kwm_win_icon)
+ msgtype == prop_atoms.kwm_win_icon) {
client_update_icons(client);
+ }
default:
;
#ifdef SHAPE
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;
+ }
+}