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:
parent
f070c4e060
commit
50982fc082
|
@ -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();
|
lua_State *L = globalconf_get_lua_State();
|
||||||
bool send_notice = force_notice;
|
bool send_notice = force_notice;
|
||||||
bool hide_titlebars = c->fullscreen;
|
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)
|
if (honor_hints)
|
||||||
geometry = client_apply_size_hints(c, geometry);
|
geometry = client_apply_size_hints(c, geometry);
|
||||||
|
|
|
@ -285,8 +285,7 @@ screen_scan(void)
|
||||||
screen_scan_x11();
|
screen_scan_x11();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return the Xinerama screen number where the coordinates belongs to.
|
/** Return the first screen number where the coordinates belong to.
|
||||||
* \param screen The logical screen number.
|
|
||||||
* \param x X coordinate
|
* \param x X coordinate
|
||||||
* \param y Y coordinate
|
* \param y Y coordinate
|
||||||
* \return Screen pointer or screen param if no match or no multi-head.
|
* \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)
|
screen_getbycoord(int x, int y)
|
||||||
{
|
{
|
||||||
foreach(s, globalconf.screens)
|
foreach(s, globalconf.screens)
|
||||||
if((x < 0 || (x >= (*s)->geometry.x && x < (*s)->geometry.x + (*s)->geometry.width))
|
if(screen_coord_in_screen(*s, x, y))
|
||||||
&& (y < 0 || (y >= (*s)->geometry.y && y < (*s)->geometry.y + (*s)->geometry.height)))
|
|
||||||
return *s;
|
return *s;
|
||||||
|
|
||||||
/* No screen found, let's be creative. */
|
/* No screen found, let's be creative. */
|
||||||
return globalconf.screens.tab[0];
|
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.
|
/** Get screens info.
|
||||||
* \param screen Screen.
|
* \param screen Screen.
|
||||||
* \param strut Honor windows strut.
|
* \param strut Honor windows strut.
|
||||||
|
|
|
@ -43,6 +43,7 @@ ARRAY_FUNCS(screen_t *, screen, DO_NOTHING)
|
||||||
void screen_class_setup(lua_State *L);
|
void screen_class_setup(lua_State *L);
|
||||||
void screen_scan(void);
|
void screen_scan(void);
|
||||||
screen_t *screen_getbycoord(int, int);
|
screen_t *screen_getbycoord(int, int);
|
||||||
|
bool screen_coord_in_screen(screen_t *, int, int);
|
||||||
int screen_get_index(screen_t *);
|
int screen_get_index(screen_t *);
|
||||||
area_t display_area_get(void);
|
area_t display_area_get(void);
|
||||||
void screen_client_moveto(client_t *, screen_t *, bool);
|
void screen_client_moveto(client_t *, screen_t *, bool);
|
||||||
|
|
Loading…
Reference in New Issue