Merge pull request #320 from blueyed/widget-handle-non-int-geom

Drawin: handle non-integer margins / geometry

Closes https://github.com/awesomeWM/awesome/pull/320.
This commit is contained in:
Daniel Hahler 2015-08-12 16:38:33 +02:00
commit f8ad2cd152
6 changed files with 53 additions and 22 deletions

View File

@ -27,6 +27,7 @@ local capi =
awesome = awesome,
mouse = mouse
}
local floor = math.floor
local util = {}
util.table = {}
@ -526,6 +527,13 @@ function util.query_to_pattern(q)
return s
end
--- Round a number to an integer.
-- @tparam number x
-- @treturn integer
function util.round(x)
return floor(x + 0.5)
end
return util
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80

View File

@ -23,6 +23,7 @@ local table = table
local error = error
local wibox = require("wibox")
local beautiful = require("beautiful")
local round = require("awful.util").round
local awfulwibox = { mt = {} }
@ -154,7 +155,7 @@ function awfulwibox.align(wibox, align, screen)
elseif align == "left" then
wibox.y = area.y + area.height - (wibox.height + 2 * wibox.border_width)
elseif align == "center" then
wibox.y = area.y + (area.height - wibox.height) / 2
wibox.y = area.y + round((area.height - wibox.height) / 2)
end
elseif position == "left" then
if align == "right" then
@ -162,7 +163,7 @@ function awfulwibox.align(wibox, align, screen)
elseif align == "left" then
wibox.y = area.y
elseif align == "center" then
wibox.y = area.y + (area.height - wibox.height) / 2
wibox.y = area.y + round((area.height - wibox.height) / 2)
end
elseif position == "bottom" then
if align == "right" then
@ -170,7 +171,7 @@ function awfulwibox.align(wibox, align, screen)
elseif align == "left" then
wibox.x = area.x
elseif align == "center" then
wibox.x = area.x + (area.width - wibox.width) / 2
wibox.x = area.x + round((area.width - wibox.width) / 2)
end
elseif position == "top" then
if align == "right" then
@ -178,7 +179,7 @@ function awfulwibox.align(wibox, align, screen)
elseif align == "left" then
wibox.x = area.x
elseif align == "center" then
wibox.x = area.x + (area.width - wibox.width) / 2
wibox.x = area.x + round((area.width - wibox.width) / 2)
end
end
@ -227,24 +228,24 @@ function awfulwibox.new(arg)
-- Set default size
if position == "left" or position == "right" then
arg.width = arg.width or beautiful.get_font_height(arg.font) * 1.5
arg.width = arg.width or round(beautiful.get_font_height(arg.font) * 1.5)
if arg.height then
has_to_stretch = false
if arg.screen then
local hp = tostring(arg.height):match("(%d+)%%")
if hp then
arg.height = capi.screen[arg.screen].geometry.height * hp / 100
arg.height = round(capi.screen[arg.screen].geometry.height * hp / 100)
end
end
end
else
arg.height = arg.height or beautiful.get_font_height(arg.font) * 1.5
arg.height = arg.height or round(beautiful.get_font_height(arg.font) * 1.5)
if arg.width then
has_to_stretch = false
if arg.screen then
local wp = tostring(arg.width):match("(%d+)%%")
if wp then
arg.width = capi.screen[arg.screen].geometry.width * wp / 100
arg.width = round(capi.screen[arg.screen].geometry.width * wp / 100)
end
end
end

View File

@ -10,7 +10,7 @@
-- Grab environment
local print = print
local awesome = awesome
local floor = math.floor
local round = require("awful.util").round
local xresources = {}
@ -94,7 +94,7 @@ end
-- @tparam[opt] integer s The screen.
-- @treturn integer Resulting size (rounded to integer).
function xresources.apply_dpi(size, s)
return floor(size/96*xresources.get_dpi(s) + 0.5)
return round(size / 96 * xresources.get_dpi(s))
end
return xresources

View File

@ -10,13 +10,10 @@ local widget_base = require("wibox.widget.base")
local table = table
local pairs = pairs
local floor = math.floor
local round = require("awful.util").round
local flex = {}
local function round(x)
return floor(x + 0.5)
end
--- Draw a flex layout. Each widget gets an equal share of the available space.
-- @param wibox The wibox that this widget is drawn to.
-- @param cr The cairo context to use.

25
luaa.h
View File

@ -141,6 +141,31 @@ luaA_getopt_number(lua_State *L, int idx, const char *name, lua_Number def)
return def;
}
static inline int
luaA_checkinteger(lua_State *L, int n)
{
double d = lua_tonumber(L, n);
if (d != (int)d)
luaA_typerror(L, n, "integer");
return d;
}
static inline lua_Integer
luaA_optinteger (lua_State *L, int narg, lua_Integer def)
{
return luaL_opt(L, luaA_checkinteger, narg, def);
}
static inline int
luaA_getopt_integer(lua_State *L, int idx, const char *name, lua_Integer def)
{
lua_getfield(L, idx, name);
if (lua_isnil(L, -1) || lua_isnumber(L, -1))
def = luaA_optinteger(L, -1, def);
lua_pop(L, 1);
return def;
}
/** Push a area type to a table on stack.
* \param L The Lua VM state.
* \param geometry The area geometry to push.

View File

@ -380,10 +380,10 @@ luaA_drawin_geometry(lua_State *L)
area_t wingeom;
luaA_checktable(L, 2);
wingeom.x = luaA_getopt_number(L, 2, "x", drawin->geometry.x);
wingeom.y = luaA_getopt_number(L, 2, "y", drawin->geometry.y);
wingeom.width = luaA_getopt_number(L, 2, "width", drawin->geometry.width);
wingeom.height = luaA_getopt_number(L, 2, "height", drawin->geometry.height);
wingeom.x = luaA_getopt_integer(L, 2, "x", drawin->geometry.x);
wingeom.y = luaA_getopt_integer(L, 2, "y", drawin->geometry.y);
wingeom.width = luaA_getopt_integer(L, 2, "width", drawin->geometry.width);
wingeom.height = luaA_getopt_integer(L, 2, "height", drawin->geometry.height);
if(wingeom.width > 0 && wingeom.height > 0)
drawin_moveresize(L, 1, wingeom);
@ -400,7 +400,7 @@ LUA_OBJECT_EXPORT_PROPERTY(drawin, drawin_t, visible, lua_pushboolean)
static int
luaA_drawin_set_x(lua_State *L, drawin_t *drawin)
{
drawin_moveresize(L, -3, (area_t) { .x = luaL_checknumber(L, -1),
drawin_moveresize(L, -3, (area_t) { .x = luaA_checkinteger(L, -1),
.y = drawin->geometry.y,
.width = drawin->geometry.width,
.height = drawin->geometry.height });
@ -418,7 +418,7 @@ static int
luaA_drawin_set_y(lua_State *L, drawin_t *drawin)
{
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,
.y = luaL_checknumber(L, -1),
.y = luaA_checkinteger(L, -1),
.width = drawin->geometry.width,
.height = drawin->geometry.height });
return 0;
@ -434,7 +434,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 = luaL_checknumber(L, -1);
int width = luaA_checkinteger(L, -1);
if(width <= 0)
luaL_error(L, "invalid width");
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,
@ -454,7 +454,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 = luaL_checknumber(L, -1);
int height = luaA_checkinteger(L, -1);
if(height <= 0)
luaL_error(L, "invalid height");
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,