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:
parent
97ffe20f7e
commit
68a9a4c4fc
4 changed files with 57 additions and 35 deletions
|
@ -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);
|
||||
|
|
|
@ -27,6 +27,7 @@ void ob_debug(const gchar *a, ...);
|
|||
|
||||
typedef enum {
|
||||
OB_DEBUG_FOCUS,
|
||||
OB_DEBUG_APP_BUGS,
|
||||
OB_DEBUG_TYPE_NUM
|
||||
} ObDebugType;
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue