X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=bcf887f6ffbaf9d61b11f7bbeef2df705ae021a5;hb=171e476ba3faaa3dbd95e9e95f4121fae2db6564;hp=c4af7b232753df61f332c3b09772af24454aafcd;hpb=64adc0eeba598cb1469b2140777fba30e3053f0e;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index c4af7b23..bcf887f6 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -139,6 +139,10 @@ void event_startup(gboolean reconfig) #endif client_add_destroy_notify(focus_delay_client_dest, NULL); + + /* get an initial time for event_curtime (mapping the initial windows needs + a timestamp) */ + event_curtime = event_get_server_time(); } void event_shutdown(gboolean reconfig) @@ -207,7 +211,7 @@ static Window event_get_window(XEvent *e) return window; } -static void event_set_curtime(XEvent *e) +static inline Time event_time(const XEvent *e) { Time t = CurrentTime; @@ -238,7 +242,7 @@ static void event_set_curtime(XEvent *e) if (obt_display_extension_sync && e->type == obt_display_extension_sync_basep + XSyncAlarmNotify) { - t = ((XSyncAlarmNotifyEvent*)e)->time; + t = ((const XSyncAlarmNotifyEvent*)e)->time; } #endif /* if more event types are anticipated, get their timestamp @@ -246,6 +250,20 @@ static void event_set_curtime(XEvent *e) break; } + return t; +} + +static void event_set_curtime(XEvent *e) +{ + Time t = event_time(e); + + if (t == CurrentTime) { + /* Some events don't come with timestamps :( + ...but we want the time anyways. */ + if (e->type == MapRequest) + t = event_get_server_time(); + } + /* watch that if we get an event earlier than the last specified user_time, which can happen if the clock goes backwards, we erase the last specified user_time */ @@ -1253,8 +1271,9 @@ static void event_handle_client(ObClient *client, XEvent *e) XXX remove this some day...that would be nice. but really unexpected from Sun Microsystems. */ - g_print("x %d y %d grav %d %d\n", x, y, client->gravity, NorthWestGravity); - if (x == 0 && y == 0 && client->gravity == NorthWestGravity) { + if (x == 0 && y == 0 && client->gravity == NorthWestGravity && + client_normal(client)) + { const Rect to = { x, y, w, h }; /* oldschool fullscreen windows are allowed */ @@ -1621,8 +1640,11 @@ static void event_handle_client(ObClient *client, XEvent *e) } else if (msgtype == XA_WM_HINTS) { client_update_wmhints(client); } else if (msgtype == XA_WM_TRANSIENT_FOR) { - client_update_transient_for(client); + /* get the transient-ness first, as this affects if the client + decides to be transient for the group or not in + client_update_transient_for() */ client_get_type_and_transientness(client); + client_update_transient_for(client); /* type may have changed, so update the layer */ client_calc_layer(client); client_setup_decor_and_functions(client, TRUE); @@ -1881,7 +1903,7 @@ static gboolean event_handle_menu_input(XEvent *ev) ret = TRUE; } - else if (sym == XK_Return) { + else if (sym == XK_Return || sym == XK_KP_Enter) { frame->press_doexec = TRUE; ret = TRUE; } @@ -2202,14 +2224,24 @@ gboolean event_time_after(guint32 t1, guint32 t2) return t1 >= t2 && t1 < (t2 + TIME_HALF); } +Bool find_timestamp(Display *d, XEvent *e, XPointer a) +{ + const Time t = event_time(e); + return t != CurrentTime; +} + Time event_get_server_time(void) { - /* Generate a timestamp */ XEvent event; + /* Generate a timestamp so there is guaranteed at least one in the queue + eventually */ XChangeProperty(obt_display, screen_support_win, OBT_PROP_ATOM(WM_CLASS), OBT_PROP_ATOM(STRING), 8, PropModeAppend, NULL, 0); - XWindowEvent(obt_display, screen_support_win, PropertyChangeMask, &event); + + /* Grab the first timestamp available */ + XPeekIfEvent(obt_display, &event, find_timestamp, NULL); + return event.xproperty.time; }