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);
}
/* activate it rather than just focus it */
stacking_restack_request(client, sibling,
e->xconfigurerequest.detail);
e->xconfigurerequest.detail, TRUE);
}
break;
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] == Opposite)
{
/* just raise, don't activate */
stacking_restack_request(client, sibling,
e->xclient.data.l[2]);
}
ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_RESTACK_WINDOW sent "
"for window %s with invalid detail 0d\n",
client->title, e->xclient.data.l[2]);
e->xclient.data.l[2], FALSE);
} else
ob_debug_type(OB_DEBUG_APP_BUGS,
"_NET_RESTACK_WINDOW sent for window %s "
"with invalid detail %d\n",
client->title, e->xclient.data.l[2]);
}
}
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;
gboolean obscured = FALSE;
gboolean occluded = FALSE;
gboolean found = FALSE;
/* no need for any looping in this case */
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))
if (WINDOW_IS_CLIENT(it->data)) {
ObClient *c = it->data;
if (found) {
if (sibling != NULL) {
if (c == sibling) {
obscured = TRUE;
if (RECT_INTERSECTS_RECT(c->frame->area, client->frame->area))
{
if (sibling != NULL) {
if (c == sibling) {
occludes = TRUE;
break;
}
}
else if (c->layer == client->layer) {
occludes = TRUE;
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)
found = TRUE;
}
return obscured;
return occludes;
}
void stacking_restack_request(ObClient *client, ObClient *sibling,
gint detail)
gint detail, gboolean activate)
{
switch (detail) {
case Below:
@ -510,29 +556,45 @@ void stacking_restack_request(ObClient *client, ObClient *sibling,
client->title, sibling ? sibling->title : "(all)");
/* if this client occludes sibling (or anything if NULL), then
lower it to the bottom */
if (stacking_occluded(sibling, client))
if (stacking_occludes(client, sibling))
stacking_lower(CLIENT_AS_WINDOW(client));
break;
case Above:
ob_debug("Restack request Above for client %s sibling %s\n",
client->title, sibling ? sibling->title : "(all)");
/* activate it rather than just focus it */
client_activate(client, FALSE, FALSE);
if (activate)
/* 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 TopIf:
ob_debug("Restack request TopIf for client %s sibling %s\n",
client->title, sibling ? sibling->title : "(all)");
if (stacking_occluded(client, sibling))
/* activate it rather than just focus it */
client_activate(client, FALSE, FALSE);
if (stacking_occluded(client, sibling)) {
if (activate)
/* 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:
ob_debug("Restack request Opposite for client %s sibling "
"%s\n",
client->title, sibling ? sibling->title : "(all)");
if (stacking_occluded(client, sibling))
/* activate it rather than just focus it */
client_activate(client, FALSE, FALSE);
else if (stacking_occluded(sibling, client))
if (stacking_occluded(client, sibling)) {
if (activate)
/* 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));
}
else if (stacking_occludes(client, sibling))
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);
/*! 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.
@param client The client to be restacked
@param sibling Another client to compare to, or NULL to compare to all
windows
@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
how each detail works with and without a sibling.
*/
void stacking_restack_request(struct _ObClient *client,
struct _ObClient *sibling,
gint detail);
gint detail, gboolean);
#endif