screen_client_moveto: Make sure client ends up on target screen

This function tried to move the client to its new screen based on
shifting around its current geometry. However, it assumed that the
client was actually visible on its current screen, which is not always
the case.

Fix this by just forcing the client into its new screen if our moving
approach does not work.

This also reverts commit d5e365804c which
is no longer necessary. This commit only hid the issue (partly).

Fixes: https://github.com/awesomeWM/awesome/issues/318
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2017-05-13 12:10:40 +02:00
parent c57208d1a8
commit 1332288f9d
1 changed files with 14 additions and 12 deletions

View File

@ -914,14 +914,17 @@ screen_client_moveto(client_t *c, screen_t *new_screen, bool doresize)
new_geometry.x = to.x + to.width - new_geometry.width; new_geometry.x = to.x + to.width - new_geometry.width;
if(new_geometry.y + new_geometry.height > to.y + to.height) if(new_geometry.y + new_geometry.height > to.y + to.height)
new_geometry.y = to.y + to.height - new_geometry.height; new_geometry.y = to.y + to.height - new_geometry.height;
if(!screen_area_in_screen(new_screen, new_geometry))
{
/* If all else fails, force the client to end up on screen. */
new_geometry.x = to.x;
new_geometry.y = to.y;
}
/* move / resize the client */ /* move / resize the client */
client_resize(c, new_geometry, false); client_resize(c, new_geometry, false);
/* Emit signal, but only in case the call to client_resize had not changed /* emit signal */
* it already. */
if(old_screen != c->screen)
{
luaA_object_push(L, c); luaA_object_push(L, c);
if(old_screen != NULL) if(old_screen != NULL)
luaA_object_push(L, old_screen); luaA_object_push(L, old_screen);
@ -929,7 +932,6 @@ screen_client_moveto(client_t *c, screen_t *new_screen, bool doresize)
lua_pushnil(L); lua_pushnil(L);
luaA_object_emit_signal(L, -2, "property::screen", 1); luaA_object_emit_signal(L, -2, "property::screen", 1);
lua_pop(L, 1); lua_pop(L, 1);
}
if(had_focus) if(had_focus)
client_focus(c); client_focus(c);