all repos — openbox @ 68a9a4c4fc2a8d0afd4d2bfc2f207165a209f79f

openbox fork - make it a bit more like ryudo

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.
Dana Jansens danakj@orodu.net
commit

68a9a4c4fc2a8d0afd4d2bfc2f207165a209f79f

parent

97ffe20f7e3f1031df0853ed9488104a66e2852e

4 files changed, 57 insertions(+), 35 deletions(-)

jump to
M openbox/debug.copenbox/debug.c

@@ -35,6 +35,7 @@ {

va_list vl; if (show) { + fprintf(stderr, "DEBUG: "); va_start(vl, a); vfprintf(stderr, a, vl); va_end(vl);

@@ -56,6 +57,17 @@

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);
M openbox/debug.hopenbox/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;
M openbox/event.copenbox/event.c

@@ -564,7 +564,10 @@ if (msgtype == prop_atoms.net_current_desktop) {

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 @@ }

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 |

@@ -848,6 +828,30 @@

ob_debug("ConfigureRequest x %d %d y %d %d\n", 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 @@ client->window,

(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));
M openbox/openbox.copenbox/openbox.c

@@ -441,8 +441,10 @@ } else if (!strcmp(argv[i], "--sync")) {

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;