make configurerequest activate but net_restack_windows just restack.

fix bottomif, topif, opposite.
fix debug output in event printing when there was no problem
This commit is contained in:
Dana Jansens 2007-05-10 04:39:06 +00:00
parent aa40be2297
commit 220015e56e
3 changed files with 98 additions and 36 deletions

View file

@ -1030,8 +1030,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
sibling = WINDOW_AS_CLIENT(win); sibling = WINDOW_AS_CLIENT(win);
} }
/* activate it rather than just focus it */
stacking_restack_request(client, sibling, stacking_restack_request(client, sibling,
e->xconfigurerequest.detail); e->xconfigurerequest.detail, TRUE);
} }
break; break;
case UnmapNotify: case UnmapNotify:
@ -1236,12 +1237,14 @@ static void event_handle_client(ObClient *client, XEvent *e)
e->xclient.data.l[2] == TopIf || e->xclient.data.l[2] == TopIf ||
e->xclient.data.l[2] == Opposite) e->xclient.data.l[2] == Opposite)
{ {
/* just raise, don't activate */
stacking_restack_request(client, sibling, stacking_restack_request(client, sibling,
e->xclient.data.l[2]); e->xclient.data.l[2], FALSE);
} } else
ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_RESTACK_WINDOW sent " ob_debug_type(OB_DEBUG_APP_BUGS,
"for window %s with invalid detail 0d\n", "_NET_RESTACK_WINDOW sent for window %s "
client->title, e->xclient.data.l[2]); "with invalid detail %d\n",
client->title, e->xclient.data.l[2]);
} }
} }
break; break;

View file

@ -461,41 +461,87 @@ void stacking_add_nonintrusive(ObWindow *win)
} }
} }
gboolean stacking_occluded(ObClient *client, ObClient *sibling) /*! Returns TRUE if client is occluded by the sibling. If sibling is NULL it
tries against all other clients.
*/
static gboolean stacking_occluded(ObClient *client, ObClient *sibling)
{ {
GList *it; GList *it;
gboolean obscured = FALSE; gboolean occluded = FALSE;
gboolean found = FALSE; gboolean found = FALSE;
/* no need for any looping in this case */ /* no need for any looping in this case */
if (sibling && client->layer != sibling->layer) if (sibling && client->layer != sibling->layer)
return obscured; return occluded;
for (it = stacking_list; it;
it = (found ? g_list_previous(it) :g_list_next(it)))
if (WINDOW_IS_CLIENT(it->data)) {
ObClient *c = it->data;
if (found) {
if (RECT_INTERSECTS_RECT(c->frame->area, client->frame->area))
{
if (sibling != NULL) {
if (c == sibling) {
occluded = TRUE;
break;
}
}
else if (c->layer == client->layer) {
occluded = TRUE;
break;
}
else if (c->layer > client->layer)
break; /* we past its layer */
}
}
else if (c == client)
found = TRUE;
}
return occluded;
}
/*! Returns TRUE if client is occludes the sibling. If sibling is NULL it tries
against all other clients.
*/
static gboolean stacking_occludes(ObClient *client, ObClient *sibling)
{
GList *it;
gboolean occludes = FALSE;
gboolean found = FALSE;
/* no need for any looping in this case */
if (sibling && client->layer != sibling->layer)
return occludes;
for (it = stacking_list; it; it = g_list_next(it)) for (it = stacking_list; it; it = g_list_next(it))
if (WINDOW_IS_CLIENT(it->data)) { if (WINDOW_IS_CLIENT(it->data)) {
ObClient *c = it->data; ObClient *c = it->data;
if (found) { if (found) {
if (sibling != NULL) { if (RECT_INTERSECTS_RECT(c->frame->area, client->frame->area))
if (c == sibling) { {
obscured = TRUE; if (sibling != NULL) {
if (c == sibling) {
occludes = TRUE;
break;
}
}
else if (c->layer == client->layer) {
occludes = TRUE;
break; break;
} }
else if (c->layer > client->layer)
break; /* we past its layer */
} }
else if (c->layer == client->layer) {
obscured = TRUE;
break;
}
else if (c->layer > client->layer)
break; /* we past its layer */
} }
else if (c == client) else if (c == client)
found = TRUE; found = TRUE;
} }
return obscured; return occludes;
} }
void stacking_restack_request(ObClient *client, ObClient *sibling, void stacking_restack_request(ObClient *client, ObClient *sibling,
gint detail) gint detail, gboolean activate)
{ {
switch (detail) { switch (detail) {
case Below: case Below:
@ -510,29 +556,45 @@ void stacking_restack_request(ObClient *client, ObClient *sibling,
client->title, sibling ? sibling->title : "(all)"); client->title, sibling ? sibling->title : "(all)");
/* if this client occludes sibling (or anything if NULL), then /* if this client occludes sibling (or anything if NULL), then
lower it to the bottom */ lower it to the bottom */
if (stacking_occluded(sibling, client)) if (stacking_occludes(client, sibling))
stacking_lower(CLIENT_AS_WINDOW(client)); stacking_lower(CLIENT_AS_WINDOW(client));
break; break;
case Above: case Above:
ob_debug("Restack request Above for client %s sibling %s\n", ob_debug("Restack request Above for client %s sibling %s\n",
client->title, sibling ? sibling->title : "(all)"); client->title, sibling ? sibling->title : "(all)");
/* activate it rather than just focus it */ if (activate)
client_activate(client, FALSE, FALSE); /* use user=TRUE because it is impossible to get a timestamp
for this */
client_activate(client, FALSE, TRUE);
else
stacking_raise(CLIENT_AS_WINDOW(client));
break; break;
case TopIf: case TopIf:
ob_debug("Restack request TopIf for client %s sibling %s\n", ob_debug("Restack request TopIf for client %s sibling %s\n",
client->title, sibling ? sibling->title : "(all)"); client->title, sibling ? sibling->title : "(all)");
if (stacking_occluded(client, sibling)) if (stacking_occluded(client, sibling)) {
/* activate it rather than just focus it */ if (activate)
client_activate(client, FALSE, FALSE); /* use user=TRUE because it is impossible to get a timestamp
for this */
client_activate(client, FALSE, TRUE);
else
stacking_raise(CLIENT_AS_WINDOW(client));
}
break;
case Opposite: case Opposite:
ob_debug("Restack request Opposite for client %s sibling " ob_debug("Restack request Opposite for client %s sibling "
"%s\n", "%s\n",
client->title, sibling ? sibling->title : "(all)"); client->title, sibling ? sibling->title : "(all)");
if (stacking_occluded(client, sibling)) if (stacking_occluded(client, sibling)) {
/* activate it rather than just focus it */ if (activate)
client_activate(client, FALSE, FALSE); /* use user=TRUE because it is impossible to get a timestamp
else if (stacking_occluded(sibling, client)) for this */
client_activate(client, FALSE, TRUE);
else
stacking_raise(CLIENT_AS_WINDOW(client));
}
else if (stacking_occludes(client, sibling))
stacking_lower(CLIENT_AS_WINDOW(client)); stacking_lower(CLIENT_AS_WINDOW(client));
break;
} }
} }

View file

@ -59,21 +59,18 @@ void stacking_lower(ObWindow *window);
*/ */
void stacking_below(ObWindow *window, ObWindow *below); void stacking_below(ObWindow *window, ObWindow *below);
/*! Returns TRUE if client is occluded by sibling. If sibling is NULL it tries
against all other clients. Otherwise, it returns FALSE.
*/
gboolean stacking_occluded(struct _ObClient *client,struct _ObClient *sibling);
/*! Restack a window based upon a sibling (or all windows) in various ways. /*! Restack a window based upon a sibling (or all windows) in various ways.
@param client The client to be restacked @param client The client to be restacked
@param sibling Another client to compare to, or NULL to compare to all @param sibling Another client to compare to, or NULL to compare to all
windows windows
@param detail One of Above, Below, TopIf, BottomIf, Opposite @param detail One of Above, Below, TopIf, BottomIf, Opposite
@param activate If TRUE, and if the window is going to be raised, it will
be activated instead
See http://tronche.com/gui/x/xlib/window/configure.html for details on See http://tronche.com/gui/x/xlib/window/configure.html for details on
how each detail works with and without a sibling. how each detail works with and without a sibling.
*/ */
void stacking_restack_request(struct _ObClient *client, void stacking_restack_request(struct _ObClient *client,
struct _ObClient *sibling, struct _ObClient *sibling,
gint detail); gint detail, gboolean);
#endif #endif