summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/debug.c12
-rw-r--r--openbox/debug.h1
-rw-r--r--openbox/event.c77
-rw-r--r--openbox/openbox.c2
4 files changed, 57 insertions, 35 deletions
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;