geometry: Use the relevant rounding functions instead of integers

In the case where one want to put the cursor at the middle of the
workarea, it is logic to do:

   x=screen.workarea.x+screen.workasrea.width/2

However, this can cause floating points. This commit move the
burden back to the C-API so the Lua placement code doesn't have
to add a large number of rounding methods. Given 1 type of rounding
cover a vast majority of use cases for each types of coordinates,
the C-API can take care of it in peace. For the other corner cases,
it is still possible for the Lua code to do the rounding there, but
no longer necessary. The convenstions are:

 'x' and 'y': use round (move to the closest point)

 'width' and 'height': use ceil (to avoid involontary truncating)
This commit is contained in:
Emmanuel Lepage Vallee 2016-04-18 01:15:15 -04:00
parent d46e11f5e1
commit 9991f9ccc8
7 changed files with 34 additions and 26 deletions

View File

@ -98,6 +98,8 @@
#include "systray.h"
#include "xwindow.h"
#include "math.h"
#include <xcb/xcb_atom.h>
#include <xcb/shape.h>
#include <cairo-xcb.h>
@ -2538,7 +2540,7 @@ luaA_client_titlebar_ ## name(lua_State *L) \
if (lua_isnil(L, 2)) \
titlebar_resize(L, 1, c, index, 0); \
else \
titlebar_resize(L, 1, c, index, luaA_checkinteger_range(L, 2, 0, MAX_X11_SIZE)); \
titlebar_resize(L, 1, c, index, ceil(luaA_checknumber_range(L, 2, 0, MAX_X11_SIZE))); \
} \
\
luaA_object_push_item(L, 1, titlebar_get_drawable(L, c, 1, index)); \
@ -2566,8 +2568,8 @@ luaA_client_geometry(lua_State *L)
area_t geometry;
luaA_checktable(L, 2);
geometry.x = luaA_getopt_integer_range(L, 2, "x", c->geometry.x, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
geometry.y = luaA_getopt_integer_range(L, 2, "y", c->geometry.y, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
geometry.x = round(luaA_getopt_number_range(L, 2, "x", c->geometry.x, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
geometry.y = round(luaA_getopt_number_range(L, 2, "y", c->geometry.y, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
if(client_isfixed(c))
{
geometry.width = c->geometry.width;
@ -2575,8 +2577,8 @@ luaA_client_geometry(lua_State *L)
}
else
{
geometry.width = luaA_getopt_integer_range(L, 2, "width", c->geometry.width, MIN_X11_SIZE, MAX_X11_SIZE);
geometry.height = luaA_getopt_integer_range(L, 2, "height", c->geometry.height, MIN_X11_SIZE, MAX_X11_SIZE);
geometry.width = ceil(luaA_getopt_number_range(L, 2, "width", c->geometry.width, MIN_X11_SIZE, MAX_X11_SIZE));
geometry.height = ceil(luaA_getopt_number_range(L, 2, "height", c->geometry.height, MIN_X11_SIZE, MAX_X11_SIZE));
}
client_resize(c, geometry, c->size_hints_honor);
@ -2600,8 +2602,8 @@ luaA_client_apply_size_hints(lua_State *L)
area_t geometry = c->geometry;
if(!client_isfixed(c))
{
geometry.width = luaA_checkinteger_range(L, 2, MIN_X11_SIZE, MAX_X11_SIZE);
geometry.height = luaA_checkinteger_range(L, 3, MIN_X11_SIZE, MAX_X11_SIZE);
geometry.width = ceil(luaA_checknumber_range(L, 2, MIN_X11_SIZE, MAX_X11_SIZE));
geometry.height = ceil(luaA_checknumber_range(L, 3, MIN_X11_SIZE, MAX_X11_SIZE));
}
if (c->size_hints_honor)

View File

@ -42,6 +42,8 @@
#include "systray.h"
#include "xwindow.h"
#include "math.h"
#include <cairo-xcb.h>
#include <xcb/shape.h>
@ -407,10 +409,10 @@ luaA_drawin_geometry(lua_State *L)
area_t wingeom;
luaA_checktable(L, 2);
wingeom.x = luaA_getopt_integer_range(L, 2, "x", drawin->geometry.x, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
wingeom.y = luaA_getopt_integer_range(L, 2, "y", drawin->geometry.y, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
wingeom.width = luaA_getopt_integer_range(L, 2, "width", drawin->geometry.width, MIN_X11_SIZE, MAX_X11_SIZE);
wingeom.height = luaA_getopt_integer_range(L, 2, "height", drawin->geometry.height, MIN_X11_SIZE, MAX_X11_SIZE);
wingeom.x = round(luaA_getopt_number_range(L, 2, "x", drawin->geometry.x, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
wingeom.y = round(luaA_getopt_number_range(L, 2, "y", drawin->geometry.y, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
wingeom.width = ceil(luaA_getopt_number_range(L, 2, "width", drawin->geometry.width, MIN_X11_SIZE, MAX_X11_SIZE));
wingeom.height = ceil(luaA_getopt_number_range(L, 2, "height", drawin->geometry.height, MIN_X11_SIZE, MAX_X11_SIZE));
if(wingeom.width > 0 && wingeom.height > 0)
drawin_moveresize(L, 1, wingeom);
@ -427,7 +429,7 @@ LUA_OBJECT_EXPORT_PROPERTY(drawin, drawin_t, visible, lua_pushboolean)
static int
luaA_drawin_set_x(lua_State *L, drawin_t *drawin)
{
int x = luaA_checkinteger_range(L, -1, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
int x = round(luaA_checknumber_range(L, -1, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
drawin_moveresize(L, -3, (area_t) { .x = x,
.y = drawin->geometry.y,
.width = drawin->geometry.width,
@ -445,7 +447,7 @@ luaA_drawin_get_x(lua_State *L, drawin_t *drawin)
static int
luaA_drawin_set_y(lua_State *L, drawin_t *drawin)
{
int y = luaA_checkinteger_range(L, -1, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
int y = round(luaA_checknumber_range(L, -1, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,
.y = y,
.width = drawin->geometry.width,
@ -463,7 +465,7 @@ luaA_drawin_get_y(lua_State *L, drawin_t *drawin)
static int
luaA_drawin_set_width(lua_State *L, drawin_t *drawin)
{
int width = luaA_checkinteger_range(L, -1, MIN_X11_SIZE, MAX_X11_SIZE);
int width = ceil(luaA_checknumber_range(L, -1, MIN_X11_SIZE, MAX_X11_SIZE));
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,
.y = drawin->geometry.y,
.width = width,
@ -481,7 +483,7 @@ luaA_drawin_get_width(lua_State *L, drawin_t *drawin)
static int
luaA_drawin_set_height(lua_State *L, drawin_t *drawin)
{
int height = luaA_checkinteger_range(L, -1, MIN_X11_SIZE, MAX_X11_SIZE);
int height = ceil(luaA_checknumber_range(L, -1, MIN_X11_SIZE, MAX_X11_SIZE));
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,
.y = drawin->geometry.y,
.width = drawin->geometry.width,

View File

@ -476,7 +476,7 @@ window_translate_type(window_type_t type)
static int
luaA_window_set_border_width(lua_State *L, window_t *c)
{
window_set_border_width(L, -3, luaA_checkinteger_range(L, -1, 0, MAX_X11_SIZE));
window_set_border_width(L, -3, round(luaA_checknumber_range(L, -1, 0, MAX_X11_SIZE)));
return 0;
}

View File

@ -26,6 +26,7 @@
#include "common/luaclass.h"
#include "objects/button.h"
#include "strut.h"
#include "math.h"
/** Windows type */
typedef enum

6
root.c
View File

@ -34,6 +34,8 @@
#include "objects/button.h"
#include "xwindow.h"
#include "math.h"
#include <xcb/xtest.h>
#include <xcb/xcb_aux.h>
#include <cairo-xcb.h>
@ -266,8 +268,8 @@ luaA_root_fake_input(lua_State *L)
{
type = XCB_MOTION_NOTIFY;
detail = luaA_checkboolean(L, 2); /* relative to the current position or not */
x = luaA_checkinteger_range(L, 3, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
y = luaA_checkinteger_range(L, 4, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
x = round(luaA_checknumber_range(L, 3, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
y = round(luaA_checknumber_range(L, 4, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
}
else
return 0;

View File

@ -21,6 +21,7 @@
#include "strut.h"
#include "luaa.h"
#include "math.h"
/** Push a strut type to a table on stack.
* \param L The Lua VM state.
@ -51,10 +52,10 @@ void
luaA_tostrut(lua_State *L, int idx, strut_t *strut)
{
luaA_checktable(L, idx);
strut->left = luaA_getopt_integer_range(L, idx, "left", strut->left, 0, UINT16_MAX);
strut->right = luaA_getopt_integer_range(L, idx, "right", strut->right, 0, UINT16_MAX);
strut->top = luaA_getopt_integer_range(L, idx, "top", strut->top, 0, UINT16_MAX);
strut->bottom = luaA_getopt_integer_range(L, idx, "bottom", strut->bottom, 0, UINT16_MAX);
strut->left = ceil(luaA_getopt_number_range(L, idx, "left", strut->left, 0, UINT16_MAX));
strut->right = ceil(luaA_getopt_number_range(L, idx, "right", strut->right, 0, UINT16_MAX));
strut->top = ceil(luaA_getopt_number_range(L, idx, "top", strut->top, 0, UINT16_MAX));
strut->bottom = ceil(luaA_getopt_number_range(L, idx, "bottom", strut->bottom, 0, UINT16_MAX));
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80

View File

@ -325,13 +325,13 @@ luaA_systray(lua_State *L)
{
size_t bg_len;
drawin_t *w = luaA_checkudata(L, 1, &drawin_class);
int x = luaA_checkinteger_range(L, 2, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
int y = luaA_checkinteger_range(L, 3, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
int base_size = luaA_checkinteger_range(L, 4, MIN_X11_SIZE, MAX_X11_SIZE);
int x = round(luaA_checknumber_range(L, 2, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
int y = round(luaA_checknumber_range(L, 3, MIN_X11_COORDINATE, MAX_X11_COORDINATE));
int base_size = ceil(luaA_checknumber_range(L, 4, MIN_X11_SIZE, MAX_X11_SIZE));
bool horiz = lua_toboolean(L, 5);
const char *bg = luaL_checklstring(L, 6, &bg_len);
bool revers = lua_toboolean(L, 7);
int spacing = luaA_checkinteger_range(L, 8, 0, MAX_X11_COORDINATE);
int spacing = ceil(luaA_checknumber_range(L, 8, 0, MAX_X11_COORDINATE));
color_t bg_color;
bool force_redraw = false;