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.
This commit is contained in:
Dana Jansens 2007-05-05 19:17:46 +00:00
parent 97ffe20f7e
commit 68a9a4c4fc
4 changed files with 57 additions and 35 deletions

View file

@ -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);

View file

@ -27,6 +27,7 @@ void ob_debug(const gchar *a, ...);
typedef enum {
OB_DEBUG_FOCUS,
OB_DEBUG_APP_BUGS,
OB_DEBUG_TYPE_NUM
} ObDebugType;

View file

@ -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));

View file

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