client_resize_do: prefer client's current screen

In case of an overlapping screen configuration, prefer the client's
current screen.

Without this, clients would be moved to the first matching screen.
This commit is contained in:
Daniel Hahler 2015-07-21 15:16:37 +02:00
parent f070c4e060
commit 50982fc082
3 changed files with 20 additions and 5 deletions

View file

@ -795,7 +795,10 @@ client_resize_do(client_t *c, area_t geometry, bool force_notice, bool honor_hin
lua_State *L = globalconf_get_lua_State();
bool send_notice = force_notice;
bool hide_titlebars = c->fullscreen;
screen_t *new_screen = screen_getbycoord(geometry.x, geometry.y);
screen_t *new_screen = c->screen;
if(!screen_coord_in_screen(new_screen, geometry.x, geometry.y))
new_screen = screen_getbycoord(geometry.x, geometry.y);
if (honor_hints)
geometry = client_apply_size_hints(c, geometry);

View file

@ -285,8 +285,7 @@ screen_scan(void)
screen_scan_x11();
}
/** Return the Xinerama screen number where the coordinates belongs to.
* \param screen The logical screen number.
/** Return the first screen number where the coordinates belong to.
* \param x X coordinate
* \param y Y coordinate
* \return Screen pointer or screen param if no match or no multi-head.
@ -295,14 +294,26 @@ screen_t *
screen_getbycoord(int x, int y)
{
foreach(s, globalconf.screens)
if((x < 0 || (x >= (*s)->geometry.x && x < (*s)->geometry.x + (*s)->geometry.width))
&& (y < 0 || (y >= (*s)->geometry.y && y < (*s)->geometry.y + (*s)->geometry.height)))
if(screen_coord_in_screen(*s, x, y))
return *s;
/* No screen found, let's be creative. */
return globalconf.screens.tab[0];
}
/** Are the given coordinates in a given screen?
* \param screen The logical screen number.
* \param x X coordinate
* \param y Y coordinate
* \return True if the X/Y coordinates are in the given screen.
*/
bool
screen_coord_in_screen(screen_t *s, int x, int y)
{
return (x < 0 || (x >= s->geometry.x && x < s->geometry.x + s->geometry.width))
&& (y < 0 || (y >= s->geometry.y && y < s->geometry.y + s->geometry.height));
}
/** Get screens info.
* \param screen Screen.
* \param strut Honor windows strut.

View file

@ -43,6 +43,7 @@ ARRAY_FUNCS(screen_t *, screen, DO_NOTHING)
void screen_class_setup(lua_State *L);
void screen_scan(void);
screen_t *screen_getbycoord(int, int);
bool screen_coord_in_screen(screen_t *, int, int);
int screen_get_index(screen_t *);
area_t display_area_get(void);
void screen_client_moveto(client_t *, screen_t *, bool);