X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=c74e15ae08a8e3bd7ae96da0c4519df99054b012;hb=48a7c32512db4358dc7c2928174bccc203d30e69;hp=625584906187834e7a65094dcc6e3c921d1e570f;hpb=b2b8ad92bfbc60392737fe9945e719b238d34933;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 62558490..c74e15ae 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- event.c for the Openbox window manager - Copyright (c) 2004 Mikael Magnusson + Copyright (c) 2006 Mikael Magnusson Copyright (c) 2003 Ben Jansens This program is free software; you can redistribute it and/or modify @@ -51,6 +51,9 @@ #ifdef HAVE_SIGNAL_H # include #endif +#ifdef XKB +# include +#endif #ifdef USE_SM #include @@ -83,7 +86,12 @@ static gboolean menu_hide_delay_func(gpointer data); (e)->xfocus.detail == NotifyAncestor || \ (e)->xfocus.detail > NotifyNonlinearVirtual) -Time event_lasttime = 0; +/* The most recent time at which an event with a timestamp occured. */ +static Time event_lasttime = 0; +/* The time for the current event being processed + (it's the event_lasttime for events without times, if this is a bug then + use CurrentTime instead, but it seems ok) */ +Time event_curtime = CurrentTime; /*! The value of the mask for the NumLock modifier */ guint NumLockMask; @@ -172,6 +180,7 @@ void event_shutdown(gboolean reconfig) #endif client_remove_destructor(focus_delay_client_dest); + client_remove_destructor(event_client_dest); XFreeModifiermap(modmap); } @@ -247,8 +256,14 @@ static void event_set_lasttime(XEvent *e) break; } - if (t > event_lasttime) + if (t > event_lasttime) { event_lasttime = t; + event_curtime = event_lasttime; + } else if (t == 0) { + event_curtime = event_lasttime; + } else { + event_curtime = t; + } } #define STRIP_MODS(s) \ @@ -259,6 +274,9 @@ static void event_set_lasttime(XEvent *e) static void event_hack_mods(XEvent *e) { +#ifdef XKB + XkbStateRec xkb_state; +#endif KeyCode *kp; gint i, k; @@ -274,6 +292,12 @@ static void event_hack_mods(XEvent *e) STRIP_MODS(e->xkey.state); /* remove from the state the mask of the modifier being released, if it is a modifier key being released (this is a little ugly..) */ +#ifdef XKB + if (XkbGetState(ob_display, XkbUseCoreKbd, &xkb_state) == Success) { + e->xkey.state = xkb_state.compat_state; + break; + } +#endif kp = modmap->modifiermap; for (i = 0; i < mask_table_size; ++i) { for (k = 0; k < modmap->max_keypermod; ++k) { @@ -588,11 +612,6 @@ static void event_handle_root(XEvent *e) break; default: ; -#ifdef VIDMODE - if (extensions_vidmode && e->type == extensions_vidmode_event_basep) { - ob_debug("VIDMODE EVENT\n"); - } -#endif } } @@ -716,7 +735,7 @@ static void event_handle_client(ObClient *client, XEvent *e) if (config_focus_follow && config_focus_delay) ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, - client); + client, TRUE); break; default: break; @@ -911,7 +930,7 @@ static void event_handle_client(ObClient *client, XEvent *e) it can happen now when the window is on another desktop, but we still don't want it! */ - client_activate(client, FALSE); + client_activate(client, FALSE, TRUE); break; case ClientMessage: /* validate cuz we query stuff off the client here */ @@ -965,8 +984,15 @@ static void event_handle_client(ObClient *client, XEvent *e) ob_debug("net_close_window for 0x%lx\n", client->window); client_close(client); } else if (msgtype == prop_atoms.net_active_window) { - ob_debug("net_active_window for 0x%lx\n", client->window); - client_activate(client, FALSE); + ob_debug("net_active_window for 0x%lx source=%s\n", + client->window, + (e->xclient.data.l[0] == 0 ? "unknown" : + (e->xclient.data.l[0] == 1 ? "application" : + (e->xclient.data.l[0] == 2 ? "user" : "INVALID")))); + /* XXX make use of data.l[1] and [2] ! */ + client_activate(client, FALSE, + (e->xclient.data.l[0] == 0 || + e->xclient.data.l[0] == 2)); } else if (msgtype == prop_atoms.net_wm_moveresize) { ob_debug("net_wm_moveresize for 0x%lx\n", client->window); if ((Atom)e->xclient.data.l[2] == @@ -1134,7 +1160,10 @@ static void event_handle_dock(ObDock *s, XEvent *e) { switch (e->type) { case ButtonPress: - stacking_raise(DOCK_AS_WINDOW(s)); + if (e->xbutton.button == 1) + stacking_raise(DOCK_AS_WINDOW(s), FALSE); + else if (e->xbutton.button == 2) + stacking_lower(DOCK_AS_WINDOW(s), FALSE); break; case EnterNotify: dock_hide(FALSE); @@ -1276,7 +1305,8 @@ static gboolean focus_delay_func(gpointer data) static void focus_delay_client_dest(ObClient *client, gpointer data) { - ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, client); + ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, + client, TRUE); } static void event_client_dest(ObClient *client, gpointer data)