97 lines
3.0 KiB
Lua
97 lines
3.0 KiB
Lua
|
--[[
|
||
|
|
||
|
Licensed under GNU General Public License v2
|
||
|
* (c) 2017, Luca CPZ
|
||
|
* (c) 2013, romockee
|
||
|
|
||
|
--]]
|
||
|
|
||
|
local gears = require("gears")
|
||
|
local wibox = require("wibox")
|
||
|
local dpi = require("beautiful.xresources").apply_dpi
|
||
|
local date = os.date
|
||
|
local ipairs = ipairs
|
||
|
local math = math
|
||
|
local select = select
|
||
|
local string = string
|
||
|
|
||
|
local binclock = {}
|
||
|
|
||
|
function binclock.dec2bin(num, bits)
|
||
|
local bits, t = bits or select(2, math.frexp(num)), {}
|
||
|
for b = bits, 1, -1 do
|
||
|
t[b] = math.fmod(num, 2)
|
||
|
num = (num - t[b]) / 2
|
||
|
end
|
||
|
return t
|
||
|
end
|
||
|
|
||
|
function binclock.paintdot(cr, val, shift)
|
||
|
local height = 0
|
||
|
for _, bit in ipairs(binclock.dec2bin(val, 4)) do
|
||
|
if bit >= 1 then
|
||
|
cr:set_source(gears.color(binclock.color_active))
|
||
|
else
|
||
|
cr:set_source(gears.color(binclock.color_inactive))
|
||
|
end
|
||
|
cr:rectangle(shift, height, binclock.dotsize, binclock.dotsize)
|
||
|
cr:fill()
|
||
|
height = height + binclock.dotsize + binclock.step
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function factory(args)
|
||
|
local args = args or {}
|
||
|
|
||
|
binclock.width = args.width or dpi(42)
|
||
|
binclock.height = args.height or dpi(18)
|
||
|
binclock.show_seconds = args.show_seconds or false
|
||
|
binclock.color_active = args.color_active or "#CCCCCC"
|
||
|
binclock.color_inactive = args.color_inactive or "#444444"
|
||
|
binclock.dotsize = math.floor(binclock.height / 5)
|
||
|
binclock.step = math.floor(binclock.dotsize / 3)
|
||
|
|
||
|
binclock.widget = wibox.widget {
|
||
|
fit = function(self, context, width, height)
|
||
|
return binclock.width, binclock.height
|
||
|
end,
|
||
|
draw = function(self, context, cr, width, height)
|
||
|
local t = date("*t")
|
||
|
|
||
|
local hour = string.format("%02d", t.hour)
|
||
|
local min = string.format("%02d", t.min)
|
||
|
local sec = string.format("%02d", t.sec)
|
||
|
|
||
|
local col_count = 4
|
||
|
if binclock.show_seconds then
|
||
|
col_count = 6
|
||
|
end
|
||
|
local step = math.floor((binclock.width - col_count * binclock.dotsize) / 8)
|
||
|
|
||
|
binclock.paintdot(cr, string.sub(hour, 1, 1), step, 2)
|
||
|
binclock.paintdot(cr, string.sub(hour, 2, 2), binclock.dotsize + 2 * step)
|
||
|
|
||
|
binclock.paintdot(cr, string.sub(min, 1, 1), binclock.dotsize * 2 + 4 * step)
|
||
|
binclock.paintdot(cr, string.sub(min, 2, 2), binclock.dotsize * 3 + 5 * step)
|
||
|
|
||
|
if binclock.show_seconds then
|
||
|
binclock.paintdot(cr, string.sub(sec, 1, 1), binclock.dotsize * 4 + 7 * step)
|
||
|
binclock.paintdot(cr, string.sub(sec, 2, 2), binclock.dotsize * 5 + 8 * step)
|
||
|
end
|
||
|
end,
|
||
|
layout = wibox.widget.base.make_widget
|
||
|
}
|
||
|
|
||
|
binclock.timer = gears.timer {
|
||
|
autostart = true,
|
||
|
timeout = binclock.show_seconds and 1 or 60,
|
||
|
callback = function()
|
||
|
binclock.widget:emit_signal("widget::redraw_needed")
|
||
|
end
|
||
|
}
|
||
|
|
||
|
return binclock
|
||
|
end
|
||
|
|
||
|
return factory
|