X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fevent.c;h=ddd2e3263a81c9c015edebac2dccb483bbc0f9de;hb=1169118e60050ee361e22111ffce842ff393d8bf;hp=29be63e43d4060b64869938e4adbbd2307524096;hpb=ab9233ddb1fe654941fa718506f3c7b0a786aa6f;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 29be63e4..ddd2e326 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -651,10 +651,12 @@ static void event_process(const XEvent *ec, gpointer data) else if (e->type == MappingNotify) { /* keyboard layout changes for modifier mapping changes. reload the modifier map, and rebind all the key bindings as appropriate */ - ob_debug("Kepboard map changed. Reloading keyboard bindings.\n"); + ob_debug("Keyboard map changed. Reloading keyboard bindings.\n"); + ob_set_state(OB_STATE_RECONFIGURING); modkeys_shutdown(TRUE); modkeys_startup(TRUE); keyboard_rebind(); + ob_set_state(OB_STATE_RUNNING); } else if (e->type == ClientMessage) { /* This is for _NET_WM_REQUEST_FRAME_EXTENTS messages. They come for @@ -871,6 +873,22 @@ static gboolean *context_to_button(ObFrame *f, ObFrameContext con, gboolean pres } } +static void compress_client_message_event(XEvent *e, XEvent *ce, Window window, + Atom msgtype) +{ + /* compress changes into a single change */ + while (XCheckTypedWindowEvent(ob_display, 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 (ce->xclient.message_type != msgtype) { + XPutBackEvent(ob_display, ce); + break; + } + e->xclient = ce->xclient; + } +} + static void event_handle_client(ObClient *client, XEvent *e) { XEvent ce; @@ -937,11 +955,11 @@ static void event_handle_client(ObClient *client, XEvent *e) client->frame->shade_hover || client->frame->iconify_hover || client->frame->close_hover) { - client->frame->max_hover = FALSE; - client->frame->desk_hover = FALSE; - client->frame->shade_hover = FALSE; - client->frame->iconify_hover = FALSE; - client->frame->close_hover = FALSE; + client->frame->max_hover = + client->frame->desk_hover = + client->frame->shade_hover = + client->frame->iconify_hover = + client->frame->close_hover = FALSE; frame_adjust_state(client->frame); } break; @@ -962,17 +980,17 @@ static void event_handle_client(ObClient *client, XEvent *e) case OB_FRAME_CONTEXT_TLCORNER: case OB_FRAME_CONTEXT_TRCORNER: /* we've left the button area inside the titlebar */ - client->frame->max_hover = FALSE; - client->frame->desk_hover = FALSE; - client->frame->shade_hover = FALSE; - client->frame->iconify_hover = FALSE; - client->frame->close_hover = FALSE; + client->frame->max_hover = + client->frame->desk_hover = + client->frame->shade_hover = + client->frame->iconify_hover = + client->frame->close_hover = FALSE; if (e->xcrossing.mode == NotifyGrab) { - client->frame->max_press = FALSE; - client->frame->desk_press = FALSE; - client->frame->shade_press = FALSE; - client->frame->iconify_press = FALSE; - client->frame->close_press = FALSE; + client->frame->max_press = + client->frame->desk_press = + client->frame->shade_press = + client->frame->iconify_press = + client->frame->close_press = FALSE; } break; case OB_FRAME_CONTEXT_FRAME: @@ -1078,7 +1096,7 @@ static void event_handle_client(ObClient *client, XEvent *e) RECT_TO_DIMS(client->area, x, y, w, h); ob_debug("ConfigureRequest for \"%s\" desktop %d wmstate %d " - "visibile %d\n" + "visible %d\n" " x %d y %d w %d h %d b %d\n", client->title, screen_desktop, client->wmstate, client->frame->visible, @@ -1091,12 +1109,11 @@ static void event_handle_client(ObClient *client, XEvent *e) /* 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 + coordinates (since they include the border width) and we need to a notify then */ move = TRUE; } - if (e->xconfigurerequest.value_mask & CWStackMode) { ObClient *sibling = NULL; gulong ignore_start; @@ -1136,16 +1153,14 @@ static void event_handle_client(ObClient *client, XEvent *e) (e->xconfigurerequest.value_mask & CWWidth) || (e->xconfigurerequest.value_mask & CWHeight)) { + /* don't allow clients to move shaded windows (fvwm does this) + */ if (e->xconfigurerequest.value_mask & CWX) { - /* don't allow clients to move shaded windows (fvwm does this) - */ if (!client->shaded) x = e->xconfigurerequest.x; move = TRUE; } if (e->xconfigurerequest.value_mask & CWY) { - /* don't allow clients to move shaded windows (fvwm does this) - */ if (!client->shaded) y = e->xconfigurerequest.y; move = TRUE; @@ -1199,7 +1214,7 @@ static void event_handle_client(ObClient *client, XEvent *e) } { - gint lw,lh; + gint lw, lh; client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE); @@ -1208,8 +1223,7 @@ static void event_handle_client(ObClient *client, XEvent *e) 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 */ + /* same for y */ if ((e->xconfigurerequest.value_mask & CWHeight && !(e->xconfigurerequest.value_mask & CWY))) client_gravity_resize_h(client, &y, client->area.height,h); @@ -1272,32 +1286,10 @@ static void event_handle_client(ObClient *client, XEvent *e) msgtype = e->xclient.message_type; if (msgtype == prop_atoms.wm_change_state) { - /* compress changes into a single change */ - 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 (ce.xclient.message_type != msgtype) { - XPutBackEvent(ob_display, &ce); - break; - } - e->xclient = ce.xclient; - } + compress_client_message_event(e, &ce, client->window, msgtype); 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, 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 (ce.xclient.message_type != msgtype) { - XPutBackEvent(ob_display, &ce); - break; - } - e->xclient = ce.xclient; - } + compress_client_message_event(e, &ce, client->window, msgtype); if ((unsigned)e->xclient.data.l[0] < screen_num_desktops || (unsigned)e->xclient.data.l[0] == DESKTOP_ALL) client_set_desktop(client, (unsigned)e->xclient.data.l[0], @@ -1342,7 +1334,7 @@ static void event_handle_client(ObClient *client, XEvent *e) } else ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_ACTIVE_WINDOW message for window %s is " - "missing source indication\n"); + "missing source indication\n", client->title); client_activate(client, TRUE, TRUE, TRUE, (e->xclient.data.l[0] == 0 || e->xclient.data.l[0] == 2)); @@ -1412,8 +1404,7 @@ static void event_handle_client(ObClient *client, XEvent *e) if (e->xclient.data.l[0] & 1 << 11) { h = e->xclient.data.l[4]; - /* if y was not given, then use gravity to figure out the new - y. the reference point should not be moved */ + /* same for y */ if (!(e->xclient.data.l[0] & 1 << 9)) client_gravity_resize_h(client, &y, client->area.height,h); } @@ -1543,10 +1534,8 @@ static void event_handle_client(ObClient *client, XEvent *e) client_update_protocols(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) { + else if (msgtype == prop_atoms.net_wm_strut || + msgtype == prop_atoms.net_wm_strut_partial) { client_update_strut(client); } else if (msgtype == prop_atoms.net_wm_icon) { @@ -1578,9 +1567,22 @@ static void event_handle_client(ObClient *client, XEvent *e) default: ; #ifdef SHAPE - if (extensions_shape && e->type == extensions_shape_event_basep) { - client->shaped = ((XShapeEvent*)e)->shaped; - frame_adjust_shape(client->frame); + { + int kind; + if (extensions_shape && e->type == extensions_shape_event_basep) { + switch (((XShapeEvent*)e)->kind) { + case ShapeBounding: + case ShapeClip: + client->shaped = ((XShapeEvent*)e)->shaped; + kind = ShapeBounding; + break; + case ShapeInput: + client->shaped_input = ((XShapeEvent*)e)->shaped; + kind = ShapeInput; + break; + } + frame_adjust_shape_kind(client->frame, kind); + } } #endif } @@ -1620,8 +1622,6 @@ static void event_handle_dockapp(ObDockApp *app, XEvent *e) dock_remove(app, TRUE); break; case DestroyNotify: - dock_remove(app, FALSE); - break; case ReparentNotify: dock_remove(app, FALSE); break; @@ -1696,7 +1696,8 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) else if (keycode == ob_keycode(OB_KEY_LEFT)) { /* Left goes to the parent menu */ - menu_frame_select(frame, NULL, TRUE); + if (frame->parent) + menu_frame_select(frame, NULL, TRUE); ret = TRUE; } @@ -2011,7 +2012,7 @@ void event_cancel_all_key_grabs(void) XSync(ob_display, FALSE); } -gboolean event_time_after(Time t1, Time t2) +gboolean event_time_after(guint32 t1, guint32 t2) { g_assert(t1 != CurrentTime); g_assert(t2 != CurrentTime); @@ -2024,8 +2025,10 @@ gboolean event_time_after(Time t1, Time t2) - http://tronche.com/gui/x/xlib/input/pointer-grabbing.html */ - /* TIME_HALF is half of the number space of a Time type variable */ -#define TIME_HALF (Time)(1 << (sizeof(Time)*8-1)) + /* TIME_HALF is not half of the number space of a Time type variable. + * Rather, it is half the number space of a timestamp value, which is + * always 32 bits. */ +#define TIME_HALF (guint32)(1 << 31) if (t2 >= TIME_HALF) /* t2 is in the second half so t1 might wrap around and be smaller than