X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=154b83479df7cfa434ae15dae9984e98a2a7f862;hb=319fb35962ed80298af17476c8cacfe4ce7470b5;hp=f3ed676e79a68f422fea8cf06f2b77b455fece8f;hpb=30912d467a36b13c0d04c98a0bf8ec1b8c1cc593;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index f3ed676e..154b8347 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -306,7 +306,9 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only) /* This means focus reverted off of a client */ else if (detail == NotifyPointerRoot || detail == NotifyDetailNone || - detail == NotifyInferior) + detail == NotifyInferior || + /* This means focus got here from another screen */ + detail == NotifyNonlinear) return TRUE; else return FALSE; @@ -487,12 +489,20 @@ static void event_process(const XEvent *ec, gpointer data) } else if (e->type == FocusIn) { if (e->xfocus.detail == NotifyPointerRoot || e->xfocus.detail == NotifyDetailNone || - e->xfocus.detail == NotifyInferior) + e->xfocus.detail == NotifyInferior || + e->xfocus.detail == NotifyNonlinear) { XEvent ce; - ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none or" - " the frame window\n"); + ob_debug_type(OB_DEBUG_FOCUS, "Focus went to root, " + "pointer root/none or " + "the frame window\n"); + + if (e->xfocus.detail == NotifyInferior || + e->xfocus.detail == NotifyNonlinear) + { + focus_left_screen = FALSE; + } /* If another FocusIn is in the queue then don't fallback yet. This fixes the fun case of: @@ -999,26 +1009,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; } @@ -1087,13 +1101,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 " @@ -1108,35 +1123,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 */ @@ -1161,7 +1172,7 @@ static void event_handle_client(ObClient *client, XEvent *e) break; case ReparentNotify: /* this is when the client is first taken captive in the frame */ - if (e->xreparent.parent == client->frame->plate) break; + if (e->xreparent.parent == client->frame->window) break; /* This event is quite rare and is usually handled in unmapHandler. @@ -1341,8 +1352,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; @@ -1430,7 +1440,7 @@ static void event_handle_client(ObClient *client, XEvent *e) if (msgtype == XA_WM_NORMAL_HINTS) { client_update_normal_hints(client); /* normal hints can make a window non-resizable */ - client_setup_decor_and_functions(client); + client_setup_decor_and_functions(client, TRUE); } else if (msgtype == XA_WM_HINTS) { client_update_wmhints(client); } else if (msgtype == XA_WM_TRANSIENT_FOR) { @@ -1438,7 +1448,7 @@ static void event_handle_client(ObClient *client, XEvent *e) client_get_type_and_transientness(client); /* type may have changed, so update the layer */ client_calc_layer(client); - client_setup_decor_and_functions(client); + client_setup_decor_and_functions(client, TRUE); } else if (msgtype == prop_atoms.net_wm_name || msgtype == prop_atoms.wm_name || msgtype == prop_atoms.net_wm_icon_name || @@ -1446,11 +1456,14 @@ static void event_handle_client(ObClient *client, XEvent *e) client_update_title(client); } else if (msgtype == prop_atoms.wm_protocols) { client_update_protocols(client); - client_setup_decor_and_functions(client); + client_setup_decor_and_functions(client, TRUE); } else if (msgtype == prop_atoms.net_wm_strut) { client_update_strut(client); } + else if (msgtype == prop_atoms.net_wm_strut_partial) { + client_update_strut(client); + } else if (msgtype == prop_atoms.net_wm_icon) { client_update_icons(client); } @@ -1679,8 +1692,11 @@ static gboolean event_handle_menu(XEvent *ev) { if ((e = menu_entry_frame_under(ev->xbutton.x_root, ev->xbutton.y_root))) + { + menu_frame_select(e->frame, e, TRUE); menu_entry_frame_execute(e, ev->xbutton.state, ev->xbutton.time); + } else menu_frame_hide_all(); } @@ -1689,7 +1705,10 @@ static gboolean event_handle_menu(XEvent *ev) if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window))) { if (e->ignore_enters) --e->ignore_enters; - else + else if (!(f = find_active_menu()) || + f == e->frame || + f->parent == e->frame || + f->child == e->frame) menu_frame_select(e->frame, e, FALSE); } break; @@ -1708,7 +1727,11 @@ static gboolean event_handle_menu(XEvent *ev) case MotionNotify: if ((e = menu_entry_frame_under(ev->xmotion.x_root, ev->xmotion.y_root))) - menu_frame_select(e->frame, e, FALSE); + if (!(f = find_active_menu()) || + f == e->frame || + f->parent == e->frame || + f->child == e->frame) + menu_frame_select(e->frame, e, FALSE); break; case KeyPress: ret = event_handle_menu_keyboard(ev);