X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=6b372a85ca42a6c0ae3d06f1b5e18ebe9fc31aa0;hb=25f215444b3c8e7b186b9c3892a9a4f659e79998;hp=2ea7d30442a688f7bde0a2897169f5f2fbef6749;hpb=2aa0a6b01ba718217e2b10107abbcd4236ba5a8f;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 2ea7d304..6b372a85 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -93,13 +93,10 @@ static gboolean focus_delay_cmp(gconstpointer d1, gconstpointer d2); static gboolean focus_delay_func(gpointer data); static void focus_delay_client_dest(ObClient *client, gpointer data); -static gboolean menu_hide_delay_func(gpointer data); - /* The time for the current event being processed */ Time event_curtime = CurrentTime; static guint ignore_enter_focus = 0; -static gboolean menu_can_hide; static gboolean focus_left_screen = FALSE; #ifdef USE_SM @@ -487,6 +484,23 @@ static void event_process(const XEvent *ec, gpointer data) /* crossing events for menu */ event_handle_menu(e); } else if (e->type == FocusIn) { + if (client && + e->xfocus.detail == NotifyInferior) + { + ob_debug_type(OB_DEBUG_FOCUS, + "Focus went to the frame window"); + + focus_left_screen = FALSE; + + focus_fallback(FALSE, FALSE); + + /* We don't get a FocusOut for this case, because it's just moving + from our Inferior up to us. This happens when iconifying a + window with RevertToParent focus */ + frame_adjust_focus(client->frame, FALSE); + /* focus_set_client(NULL) has already been called */ + client_calc_layer(client); + } if (e->xfocus.detail == NotifyPointerRoot || e->xfocus.detail == NotifyDetailNone || e->xfocus.detail == NotifyInferior || @@ -494,9 +508,8 @@ static void event_process(const XEvent *ec, gpointer data) { XEvent ce; - ob_debug_type(OB_DEBUG_FOCUS, "Focus went to root, " - "pointer root/none or " - "the frame window\n"); + ob_debug_type(OB_DEBUG_FOCUS, + "Focus went to root or pointer root/none\n"); if (e->xfocus.detail == NotifyInferior || e->xfocus.detail == NotifyNonlinear) @@ -531,7 +544,7 @@ static void event_process(const XEvent *ec, gpointer data) */ if (!focus_left_screen) - focus_fallback(TRUE, FALSE); + focus_fallback(FALSE, FALSE); } } else if (!client) @@ -541,7 +554,9 @@ static void event_process(const XEvent *ec, gpointer data) /* If you send focus to a window and then it disappears, you can get the FocusIn for it, after it is unmanaged. - Just wait for the next FocusOut/FocusIn pair. */ + Just wait for the next FocusOut/FocusIn pair, but make note that + the window that was focused no longer is. */ + focus_set_client(NULL); } else if (client != focus_client) { focus_left_screen = FALSE; @@ -823,6 +838,10 @@ static void event_handle_client(ObClient *client, XEvent *e) } break; case MotionNotify: + /* when there is a grab on the pointer, we won't get enter/leave + notifies, but we still get motion events */ + if (grab_on_pointer()) break; + con = frame_context(client, e->xmotion.window, e->xmotion.x, e->xmotion.y); switch (con) { @@ -1009,26 +1028,30 @@ static void event_handle_client(ObClient *client, XEvent *e) also you can't compress stacking events */ - gint x, y, w, h, b; + gint x, y, w, h; gboolean move = FALSE; gboolean resize = FALSE; - gboolean border = FALSE; /* get the current area */ RECT_TO_DIMS(client->area, x, y, w, h); - b = client->border_width; ob_debug("ConfigureRequest for \"%s\" desktop %d wmstate %d " "visibile %d\n" " x %d y %d w %d h %d b %d\n", client->title, screen_desktop, client->wmstate, client->frame->visible, - x, y, w, h, b); + x, y, w, h, client->border_width); if (e->xconfigurerequest.value_mask & CWBorderWidth) if (client->border_width != e->xconfigurerequest.border_width) { - b = e->xconfigurerequest.border_width; - border = TRUE; + client->border_width = e->xconfigurerequest.border_width; + + /* if the border width is changing then that is the same + as requesting a resize, but we don't actually change + the client's border, so it will change their root + coordiantes (since they include the border width) and + we need to a notify then */ + move = TRUE; } @@ -1097,13 +1120,14 @@ static void event_handle_client(ObClient *client, XEvent *e) desktop. eg. open amarok window on desktop 1, switch to desktop 2, click amarok tray icon. it will move by its decoration size. */ - if (move && !resize && - x != client->area.x && + if (x != client->area.x && x == (client->frame->area.x + client->frame->size.left - (gint)client->border_width) && y != client->area.y && y == (client->frame->area.y + client->frame->size.top - - (gint)client->border_width)) + (gint)client->border_width) && + w == client->area.width && + h == client->area.height) { ob_debug_type(OB_DEBUG_APP_BUGS, "Application %s is trying to move via " @@ -1118,35 +1142,31 @@ static void event_handle_client(ObClient *client, XEvent *e) notify is sent or not */ } - if (move || resize || border) { + if (move || resize) { gint lw,lh; - if (move || resize) { - client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE); + client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE); - /* if x was not given, then use gravity to figure out the new - x. the reference point should not be moved */ - if ((e->xconfigurerequest.value_mask & CWWidth && - !(e->xconfigurerequest.value_mask & CWX))) - client_gravity_resize_w(client, &x, client->area.width, w); - /* if y was not given, then use gravity to figure out the new - y. the reference point should not be moved */ - if ((e->xconfigurerequest.value_mask & CWHeight && - !(e->xconfigurerequest.value_mask & CWY))) - client_gravity_resize_h(client, &y, client->area.height,h); + /* if x was not given, then use gravity to figure out the new + x. the reference point should not be moved */ + if ((e->xconfigurerequest.value_mask & CWWidth && + !(e->xconfigurerequest.value_mask & CWX))) + client_gravity_resize_w(client, &x, client->area.width, w); + /* if y was not given, then use gravity to figure out the new + y. the reference point should not be moved */ + if ((e->xconfigurerequest.value_mask & CWHeight && + !(e->xconfigurerequest.value_mask & CWY))) + client_gravity_resize_h(client, &y, client->area.height,h); + + client_find_onscreen(client, &x, &y, w, h, FALSE); - client_find_onscreen(client, &x, &y, w, h, FALSE); - } /* if they requested something that moves the window, or if the window is actually being changed then configure it and send a configure notify to them */ - if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h) || - border) - { - ob_debug("Granting ConfigureRequest x %d y %d w %d h %d " - "b %d\n", - x, y, w, h, b); - client_configure(client, x, y, w, h, b, FALSE, TRUE); + if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h)) { + ob_debug("Granting ConfigureRequest x %d y %d w %d h %d\n", + x, y, w, h); + client_configure(client, x, y, w, h, FALSE, TRUE); } /* ignore enter events caused by these like ob actions do */ @@ -1351,8 +1371,7 @@ static void event_handle_client(ObClient *client, XEvent *e) client_find_onscreen(client, &x, &y, w, h, FALSE); - client_configure(client, x, y, w, h, client->border_width, - FALSE, TRUE); + client_configure(client, x, y, w, h, FALSE, TRUE); client->gravity = ograv; @@ -1509,7 +1528,9 @@ static void event_handle_dock(ObDock *s, XEvent *e) dock_hide(FALSE); break; case LeaveNotify: - dock_hide(TRUE); + /* don't hide when moving into a dock app */ + if (e->xcrossing.detail != NotifyInferior) + dock_hide(TRUE); break; } } @@ -1578,13 +1599,8 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) if (frame == NULL) ret = FALSE; - else if (keycode == ob_keycode(OB_KEY_ESCAPE) && state == 0) { - /* Escape goes to the parent menu or closes the last one */ - if (frame->parent) - menu_frame_select(frame, NULL, TRUE); - else - menu_frame_hide_all(); - } + else if (keycode == ob_keycode(OB_KEY_ESCAPE) && state == 0) + menu_frame_hide_all(); else if (keycode == ob_keycode(OB_KEY_RETURN) && (state == 0 || state == ControlMask)) @@ -1687,8 +1703,8 @@ static gboolean event_handle_menu(XEvent *ev) switch (ev->type) { case ButtonRelease: - if ((ev->xbutton.button < 4 || ev->xbutton.button > 5) - && menu_can_hide) + if (menu_hide_delay_reached() && + (ev->xbutton.button < 4 || ev->xbutton.button > 5)) { if ((e = menu_entry_frame_under(ev->xbutton.x_root, ev->xbutton.y_root))) @@ -1764,12 +1780,6 @@ static void event_handle_user_input(ObClient *client, XEvent *e) moved/resized */ client = moveresize_client; - menu_can_hide = FALSE; - ob_main_loop_timeout_add(ob_main_loop, - config_menu_hide_delay * 1000, - menu_hide_delay_func, - NULL, g_direct_equal, NULL); - if (e->type == ButtonPress || e->type == ButtonRelease || e->type == MotionNotify) @@ -1785,12 +1795,6 @@ static void event_handle_user_input(ObClient *client, XEvent *e) } } -static gboolean menu_hide_delay_func(gpointer data) -{ - menu_can_hide = TRUE; - return FALSE; /* no repeat */ -} - static void focus_delay_dest(gpointer data) { g_free(data);