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:
parent
aa40be2297
commit
220015e56e
3 changed files with 98 additions and 36 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue