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);
|
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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue