Merge pull request #1780 from psychon/fix-setting-screen
Fix setting screen
This commit is contained in:
commit
260002b632
|
@ -1743,20 +1743,6 @@ client_resize_do(client_t *c, area_t geometry)
|
|||
bool
|
||||
client_resize(client_t *c, area_t geometry, bool honor_hints)
|
||||
{
|
||||
area_t area;
|
||||
|
||||
/* offscreen appearance fixes */
|
||||
area = display_area_get();
|
||||
|
||||
if(geometry.x > area.width)
|
||||
geometry.x = area.width - geometry.width;
|
||||
if(geometry.y > area.height)
|
||||
geometry.y = area.height - geometry.height;
|
||||
if(geometry.x + geometry.width < 0)
|
||||
geometry.x = 0;
|
||||
if(geometry.y + geometry.height < 0)
|
||||
geometry.y = 0;
|
||||
|
||||
if (honor_hints) {
|
||||
/* We could get integer underflows in client_remove_titlebar_geometry()
|
||||
* without these checks here.
|
||||
|
|
|
@ -859,20 +859,6 @@ void screen_update_workarea(screen_t *screen)
|
|||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
/** Get display info.
|
||||
* \return The display area.
|
||||
*/
|
||||
area_t
|
||||
display_area_get(void)
|
||||
{
|
||||
xcb_screen_t *s = globalconf.screen;
|
||||
area_t area = { .x = 0,
|
||||
.y = 0,
|
||||
.width = s->width_in_pixels,
|
||||
.height = s->height_in_pixels };
|
||||
return area;
|
||||
}
|
||||
|
||||
/** Move a client to a virtual screen.
|
||||
* \param c The client to move.
|
||||
* \param new_screen The destination screen.
|
||||
|
@ -928,22 +914,24 @@ screen_client_moveto(client_t *c, screen_t *new_screen, bool doresize)
|
|||
new_geometry.x = to.x + to.width - new_geometry.width;
|
||||
if(new_geometry.y + new_geometry.height > to.y + to.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 */
|
||||
client_resize(c, new_geometry, false);
|
||||
|
||||
/* Emit signal, but only in case the call to client_resize had not changed
|
||||
* it already. */
|
||||
if(old_screen != c->screen)
|
||||
{
|
||||
luaA_object_push(L, c);
|
||||
if(old_screen != NULL)
|
||||
luaA_object_push(L, old_screen);
|
||||
else
|
||||
lua_pushnil(L);
|
||||
luaA_object_emit_signal(L, -2, "property::screen", 1);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
/* emit signal */
|
||||
luaA_object_push(L, c);
|
||||
if(old_screen != NULL)
|
||||
luaA_object_push(L, old_screen);
|
||||
else
|
||||
lua_pushnil(L);
|
||||
luaA_object_emit_signal(L, -2, "property::screen", 1);
|
||||
lua_pop(L, 1);
|
||||
|
||||
if(had_focus)
|
||||
client_focus(c);
|
||||
|
|
|
@ -52,7 +52,6 @@ screen_t *screen_getbycoord(int, int);
|
|||
bool screen_coord_in_screen(screen_t *, int, int);
|
||||
bool screen_area_in_screen(screen_t *, area_t);
|
||||
int screen_get_index(screen_t *);
|
||||
area_t display_area_get(void);
|
||||
void screen_client_moveto(client_t *, screen_t *, bool);
|
||||
void screen_update_primary(void);
|
||||
void screen_update_workarea(screen_t *);
|
||||
|
|
|
@ -248,7 +248,7 @@ local dispositions = {
|
|||
end,
|
||||
},
|
||||
|
||||
-- Corner case 2: Nothing at 0x0.
|
||||
-- Corner case 2a: Nothing at 0x0.
|
||||
-- As some position may fallback to 0x0 this need to be tested often. It
|
||||
-- also caused issues such as #154
|
||||
{
|
||||
|
@ -270,6 +270,13 @@ local dispositions = {
|
|||
end
|
||||
},
|
||||
|
||||
-- Corner case 2b: Still nothing at 0x0
|
||||
{
|
||||
function() return { x = 0, y = 32, width = 32, height = 32, } end,
|
||||
function() return { x = 32, y = 0, width = 32, height = 32, } end,
|
||||
function() return { x = 64, y = 16, width = 32, height = 32, } end,
|
||||
},
|
||||
|
||||
-- Corner case 3: Many very small screens.
|
||||
-- On the embedded side of the compuverse, it is possible
|
||||
-- to buy 32x32 RGB OLED screens. They are usually used to display single
|
||||
|
|
Loading…
Reference in New Issue