From: Dana Jansens Date: Sat, 5 May 2007 19:17:46 +0000 (+0000) Subject: some changes to ConfigureRequest, based on what I found in FVWM. X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=68a9a4c4fc2a8d0afd4d2bfc2f207165a209f79f;p=chaz%2Fopenbox some changes to ConfigureRequest, based on what I found in FVWM. fix those stupid applications from moving accross the screen by the size of their decorations. --- diff --git a/openbox/debug.c b/openbox/debug.c index af22c69f..3a765dc5 100644 --- a/openbox/debug.c +++ b/openbox/debug.c @@ -35,6 +35,7 @@ void ob_debug(const gchar *a, ...) va_list vl; if (show) { + fprintf(stderr, "DEBUG: "); va_start(vl, a); vfprintf(stderr, a, vl); va_end(vl); @@ -56,6 +57,17 @@ void ob_debug_type(ObDebugType type, const gchar *a, ...) g_assert(type < OB_DEBUG_TYPE_NUM); if (show && enabled_types[type]) { + switch (type) { + case OB_DEBUG_FOCUS: + fprintf(stderr, "FOCUS: "); + break; + case OB_DEBUG_APP_BUGS: + fprintf(stderr, "APPLICATION BUG: "); + break; + default: + g_assert_not_reached(); + } + va_start(vl, a); vfprintf(stderr, a, vl); va_end(vl); diff --git a/openbox/debug.h b/openbox/debug.h index 2b907ebf..a38ae75b 100644 --- a/openbox/debug.h +++ b/openbox/debug.h @@ -27,6 +27,7 @@ void ob_debug(const gchar *a, ...); typedef enum { OB_DEBUG_FOCUS, + OB_DEBUG_APP_BUGS, OB_DEBUG_TYPE_NUM } ObDebugType; diff --git a/openbox/event.c b/openbox/event.c index 5d5f319f..61aea441 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -564,7 +564,10 @@ static void event_handle_root(XEvent *e) guint d = e->xclient.data.l[0]; if (d < screen_num_desktops) { event_curtime = e->xclient.data.l[1]; - ob_debug("SWITCH DESKTOP TIME: %d\n", event_curtime); + if (event_curtime == 0) + ob_debug_type(OB_DEBUG_APP_BUGS, + "_NET_CURRENT_DESKTOP message is missing " + "a timestamp\n"); screen_set_desktop(d); } } else if (msgtype == prop_atoms.net_number_of_desktops) { @@ -638,7 +641,6 @@ static void event_handle_client(ObClient *client, XEvent *e) { XEvent ce; Atom msgtype; - gint i=0; ObFrameContext con; switch (e->type) { @@ -790,42 +792,20 @@ static void event_handle_client(ObClient *client, XEvent *e) break; } case ConfigureRequest: - /* compress these */ - while (XCheckTypedWindowEvent(ob_display, client->window, - ConfigureRequest, &ce)) { - ++i; - /* XXX if this causes bad things.. we can compress config req's - with the same mask. */ - e->xconfigurerequest.value_mask |= - ce.xconfigurerequest.value_mask; - if (ce.xconfigurerequest.value_mask & CWX) - e->xconfigurerequest.x = ce.xconfigurerequest.x; - if (ce.xconfigurerequest.value_mask & CWY) - e->xconfigurerequest.y = ce.xconfigurerequest.y; - if (ce.xconfigurerequest.value_mask & CWWidth) - e->xconfigurerequest.width = ce.xconfigurerequest.width; - if (ce.xconfigurerequest.value_mask & CWHeight) - e->xconfigurerequest.height = ce.xconfigurerequest.height; - if (ce.xconfigurerequest.value_mask & CWBorderWidth) - e->xconfigurerequest.border_width = - ce.xconfigurerequest.border_width; - if (ce.xconfigurerequest.value_mask & CWStackMode) - e->xconfigurerequest.detail = ce.xconfigurerequest.detail; - } + /* dont compress these unless you're going to watch for property + notifies in between (these can change what the configure would + do to the window). + also you can't compress stacking events + */ ob_debug("ConfigureRequest desktop %d wmstate %d vis %d\n", screen_desktop, client->wmstate, client->frame->visible); - /* If the client is in IconicState then ignore the event. - This used to only ignore iconic or shaded windows, but windows on - other desktops are also in IconicState, so now those can't - send ConfigureRequests either.. - This fixes the bug of KDE apps moving when they try to active them- - selves on another desktop. - It used to say "fvwm does this" but I'm not sure if fvwm does - this for windows on other desktops too. Probably, it makes sense. - */ - if (client->wmstate == IconicState) return; + /* don't allow clients to move shaded windows (fvwm does this) */ + if (client->shaded) { + e->xconfigurerequest.value_mask &= ~CWX; + e->xconfigurerequest.value_mask &= ~CWY; + } /* resize, then move, as specified in the EWMH section 7.7 */ if (e->xconfigurerequest.value_mask & (CWWidth | CWHeight | @@ -849,6 +829,30 @@ static void event_handle_client(ObClient *client, XEvent *e) e->xconfigurerequest.value_mask & CWX, x, e->xconfigurerequest.value_mask & CWY, y); + /* check for broken apps moving to their root position + + XXX remove this some day...that would be nice. right now all + kde apps do this when they try activate themselves on another + desktop. eg. open amarok window on desktop 1, switch to desktop + 2, click amarok tray icon. it will move by its decoration size. + */ + 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)) + { + ob_debug_type(OB_DEBUG_APP_BUGS, + "Application %s is trying to move via " + "ConfigureRequest to it's root window position " + "but it is not using StaticGravity\n", + client->title); + /* don't move it */ + x = client->area.x; + y = client->area.y; + } + client_find_onscreen(client, &x, &y, w, h, FALSE); client_configure_full(client, x, y, w, h, FALSE, TRUE, TRUE); } @@ -971,8 +975,11 @@ static void event_handle_client(ObClient *client, XEvent *e) (e->xclient.data.l[0] == 0 ? "unknown" : (e->xclient.data.l[0] == 1 ? "application" : (e->xclient.data.l[0] == 2 ? "user" : "INVALID")))); - /* XXX make use of data.l[2] ! */ + /* XXX make use of data.l[2] !? */ event_curtime = e->xclient.data.l[1]; + ob_debug_type(OB_DEBUG_APP_BUGS, + "_NET_ACTIVE_WINDOW message for window %s is " + "missing a timestamp\n", client->title); client_activate(client, FALSE, (e->xclient.data.l[0] == 0 || e->xclient.data.l[0] == 2)); diff --git a/openbox/openbox.c b/openbox/openbox.c index 832c2329..2cd8958f 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -441,8 +441,10 @@ static void parse_args(gint argc, gchar **argv) xsync = TRUE; } else if (!strcmp(argv[i], "--debug")) { ob_debug_show_output(TRUE); + ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE); } else if (!strcmp(argv[i], "--debug-focus")) { ob_debug_show_output(TRUE); + ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE); ob_debug_enable(OB_DEBUG_FOCUS, TRUE); } else if (!strcmp(argv[i], "--reconfigure")) { remote_control = 1;