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, awesome = awesome,
mouse = mouse mouse = mouse
} }
local floor = math.floor
local util = {} local util = {}
util.table = {} util.table = {}
@ -526,6 +527,13 @@ function util.query_to_pattern(q)
return s return s
end end
--- Round a number to an integer.
-- @tparam number x
-- @treturn integer
function util.round(x)
return floor(x + 0.5)
end
return util return util
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 -- 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 error = error
local wibox = require("wibox") local wibox = require("wibox")
local beautiful = require("beautiful") local beautiful = require("beautiful")
local round = require("awful.util").round
local awfulwibox = { mt = {} } local awfulwibox = { mt = {} }
@ -154,7 +155,7 @@ function awfulwibox.align(wibox, align, screen)
elseif align == "left" then elseif align == "left" then
wibox.y = area.y + area.height - (wibox.height + 2 * wibox.border_width) wibox.y = area.y + area.height - (wibox.height + 2 * wibox.border_width)
elseif align == "center" then elseif align == "center" then
wibox.y = area.y + (area.height - wibox.height) / 2 wibox.y = area.y + round((area.height - wibox.height) / 2)
end end
elseif position == "left" then elseif position == "left" then
if align == "right" then if align == "right" then
@ -162,7 +163,7 @@ function awfulwibox.align(wibox, align, screen)
elseif align == "left" then elseif align == "left" then
wibox.y = area.y wibox.y = area.y
elseif align == "center" then elseif align == "center" then
wibox.y = area.y + (area.height - wibox.height) / 2 wibox.y = area.y + round((area.height - wibox.height) / 2)
end end
elseif position == "bottom" then elseif position == "bottom" then
if align == "right" then if align == "right" then
@ -170,7 +171,7 @@ function awfulwibox.align(wibox, align, screen)
elseif align == "left" then elseif align == "left" then
wibox.x = area.x wibox.x = area.x
elseif align == "center" then 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
elseif position == "top" then elseif position == "top" then
if align == "right" then if align == "right" then
@ -178,7 +179,7 @@ function awfulwibox.align(wibox, align, screen)
elseif align == "left" then elseif align == "left" then
wibox.x = area.x wibox.x = area.x
elseif align == "center" then 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
end end
@ -227,24 +228,24 @@ function awfulwibox.new(arg)
-- Set default size -- Set default size
if position == "left" or position == "right" then 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 if arg.height then
has_to_stretch = false has_to_stretch = false
if arg.screen then if arg.screen then
local hp = tostring(arg.height):match("(%d+)%%") local hp = tostring(arg.height):match("(%d+)%%")
if hp then 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 end
end end
else 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 if arg.width then
has_to_stretch = false has_to_stretch = false
if arg.screen then if arg.screen then
local wp = tostring(arg.width):match("(%d+)%%") local wp = tostring(arg.width):match("(%d+)%%")
if wp then 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 end
end end

View File

@ -10,7 +10,7 @@
-- Grab environment -- Grab environment
local print = print local print = print
local awesome = awesome local awesome = awesome
local floor = math.floor local round = require("awful.util").round
local xresources = {} local xresources = {}
@ -94,7 +94,7 @@ end
-- @tparam[opt] integer s The screen. -- @tparam[opt] integer s The screen.
-- @treturn integer Resulting size (rounded to integer). -- @treturn integer Resulting size (rounded to integer).
function xresources.apply_dpi(size, s) 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 end
return xresources return xresources

View File

@ -10,13 +10,10 @@ local widget_base = require("wibox.widget.base")
local table = table local table = table
local pairs = pairs local pairs = pairs
local floor = math.floor local floor = math.floor
local round = require("awful.util").round
local flex = {} 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. --- 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 wibox The wibox that this widget is drawn to.
-- @param cr The cairo context to use. -- @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; 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. /** Push a area type to a table on stack.
* \param L The Lua VM state. * \param L The Lua VM state.
* \param geometry The area geometry to push. * \param geometry The area geometry to push.

View File

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