X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=22a074fd462cfe420cc6864b114a5868f3134f3b;hb=be15e8c01c49327ff328e44bced78b220e16f132;hp=00036b48c83ed8b228bd5c2bbfe03c453b208776;hpb=418095b48ea33dfce904a0250f1659a6a0feeb78;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 00036b48..22a074fd 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -24,10 +24,6 @@ #include #include -#ifdef USE_LIBSN -# include -#endif - #ifdef HAVE_SYS_SELECT_H # include #endif @@ -49,6 +45,8 @@ static void event_handle_client(ObClient *c, XEvent *e); static gboolean focus_delay_func(gpointer data); static void focus_delay_client_dest(gpointer data); +static gboolean menu_hide_delay_func(gpointer data); + #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \ (e)->xfocus.detail == NotifyAncestor || \ (e)->xfocus.detail > NotifyNonlinearVirtual) @@ -72,6 +70,10 @@ static const int mask_table[] = { }; static int mask_table_size; +static ObClient *focus_delay_client; + +static gboolean menu_can_hide; + #ifdef USE_SM static void ice_handler(int fd, gpointer conn) { @@ -94,18 +96,10 @@ static void ice_watch(IceConn conn, IcePointer data, Bool opening, } #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) */ @@ -137,15 +131,13 @@ void event_startup() 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); } @@ -331,7 +323,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) break; if (fe.type == FocusOut) { #ifdef DEBUG_FOCUS - ob_debug("found pending FocusOut"); + ob_debug("found pending FocusOut\n"); #endif if (!INVALID_FOCUSOUT(&fe)) { /* if there is a VALID FocusOut still coming, don't @@ -342,7 +334,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) } } else { #ifdef DEBUG_FOCUS - ob_debug("found pending FocusIn"); + ob_debug("found pending FocusIn\n"); #endif /* is the focused window getting a FocusOut/In back to itself? @@ -360,7 +352,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) if (focus_client) { #ifdef DEBUG_FOCUS ob_debug("focused window got an Out/In back to " - "itself IGNORED both"); + "itself IGNORED both\n"); #endif return TRUE; } else { @@ -368,7 +360,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) #ifdef DEBUG_FOCUS ob_debug("focused window got an Out/In back to " "itself but focus_client was null " - "IGNORED just the Out"); + "IGNORED just the Out\n"); #endif return TRUE; } @@ -388,7 +380,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) if (fallback) { #ifdef DEBUG_FOCUS ob_debug("no valid FocusIn and no FocusOut events found, " - "falling back"); + "falling back\n"); #endif focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); } @@ -404,7 +396,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) (e->xcrossing.mode == NotifyUngrab && e->xcrossing.detail == NotifyVirtual)) { #ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx IGNORED", + ob_debug("%sNotify mode %d detail %d on %lx IGNORED\n", (e->type == EnterNotify ? "Enter" : "Leave"), e->xcrossing.mode, e->xcrossing.detail, client?client->window:0); @@ -412,7 +404,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) return TRUE; } #ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx", + ob_debug("%sNotify mode %d detail %d on %lx\n", (e->type == EnterNotify ? "Enter" : "Leave"), e->xcrossing.mode, e->xcrossing.detail, client?client->window:0); @@ -499,19 +491,27 @@ static void event_process(const XEvent *ec, gpointer data) { if (menu_frame_visible) event_handle_menu(e); - else if (moveresize_in_progress) - moveresize_event(e); else { - ObFrameContext context; + if (!keyboard_process_interactive_grab(e, &client)) { + if (moveresize_in_progress) + moveresize_event(e); - context = frame_context(client, e->xany.window); + menu_can_hide = FALSE; + ob_main_loop_timeout_add(ob_main_loop, + G_USEC_PER_SEC / 4, + menu_hide_delay_func, + NULL, NULL); - if (!keyboard_process_interactive_grab(e, &client, &context)) { if (e->type == ButtonPress || e->type == ButtonRelease || e->type == MotionNotify) - mouse_event(client, context, e); + mouse_event(client, e); else if (e->type == KeyPress) - keyboard_event(client, e); + /* when in the middle of a focus cycling action, this + causes the window which appears to be focused to be + the one on which the actions will be executed */ + keyboard_event((focus_cycle_target ? + focus_cycle_target : + (client ? client : focus_client)), e); } } } @@ -581,7 +581,9 @@ static void event_handle_client(ObClient *client, XEvent *e) /* Wheel buttons don't draw because they are an instant click, so it is a waste of resources to go drawing it. */ if (!(e->xbutton.button == 4 || e->xbutton.button == 5)) { - switch (frame_context(client, e->xbutton.window)) { + con = frame_context(client, e->xbutton.window); + con = mouse_button_frame_context(con, e->xbutton.button); + switch (con) { case OB_FRAME_CONTEXT_MAXIMIZE: client->frame->max_press = (e->type == ButtonPress); framerender_frame(client->frame); @@ -657,8 +659,12 @@ static void event_handle_client(ObClient *client, XEvent *e) case OB_FRAME_CONTEXT_FRAME: /* XXX if doing a 'reconfigure' make sure you kill this timer, maybe all timers.. */ - if (config_focus_delay) - ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + 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; } @@ -705,8 +711,8 @@ static void event_handle_client(ObClient *client, XEvent *e) ob_main_loop_timeout_add(ob_main_loop, config_focus_delay, focus_delay_func, - client, - NULL); + client, NULL); + focus_delay_client = client; } else client_focus(client); } @@ -1128,15 +1134,11 @@ static void event_handle_menu(XEvent *ev) switch (ev->type) { case ButtonRelease: - if (!(f = menu_frame_under(ev->xbutton.x_root, - ev->xbutton.y_root))) + if ((e = menu_entry_frame_under(ev->xbutton.x_root, + ev->xbutton.y_root))) + menu_entry_frame_execute(e, ev->xbutton.state); + else if (menu_can_hide) menu_frame_hide_all(); - else { - if ((e = menu_entry_frame_under(ev->xbutton.x_root, - ev->xbutton.y_root))) - menu_entry_frame_execute(e, - !(ev->xbutton.state & ControlMask)); - } break; case MotionNotify: if ((f = menu_frame_under(ev->xmotion.x_root, @@ -1153,8 +1155,7 @@ static void event_handle_menu(XEvent *ev) else if (ev->xkey.keycode == ob_keycode(OB_KEY_RETURN)) { ObMenuFrame *f; if ((f = find_active_menu())) - menu_entry_frame_execute(f->selected, - !(ev->xkey.state & ControlMask)); + menu_entry_frame_execute(f->selected, ev->xkey.state); } else if (ev->xkey.keycode == ob_keycode(OB_KEY_LEFT)) { ObMenuFrame *f; if ((f = find_active_menu()) && f->parent) @@ -1176,14 +1177,24 @@ static void event_handle_menu(XEvent *ev) } } +static gboolean menu_hide_delay_func(gpointer data) +{ + menu_can_hide = TRUE; + return FALSE; /* no repeat */ +} + static gboolean focus_delay_func(gpointer data) { - ObClient *c = data; - client_focus(c); + client_focus(focus_delay_client); return FALSE; /* no repeat */ } static void focus_delay_client_dest(gpointer data) { - ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + 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; + } }