local awful = require("awful") local beautiful = require("beautiful") local wibox = require("wibox") local gears = require("gears") local calendar_widget = {} local function worker(user_args) local args = user_args or {} local style = {} style.month = { padding = 4, bg_color = beautiful.bg_normal, border_width = 0 } style.normal = { markup = function(t) return t end, shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, 4) end, } style.focused = { bg_color = beautiful.bg_focus, fg_color = beautiful.fg_focus, markup = function(t) return '' .. t .. '' end, shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, 4) end, } style.header = { bg_color = beautiful.bg_focus, fg_color = beautiful.fg_focus, markup = function(t) return ''..t..'' end, } style.weekday = { bg_color = beautiful.bg_focus, fg_color = beautiful.fg_focus, markup = function(t) return ''..t..'' end, } local function decorate(widget, flag, date) if flag == 'monthheader' then flag = 'header' end if flag == 'focus' then local today = os.date('*t') if not today.month == date.month and today.year == date.year then flag = 'normal' end end local properties = style[flag] or {} if properties.markup and widget.get_text and widget.set_markup then widget:set_markup(properties.markup(widget:get_text())) end local thisdate = { year = date.year, month = (date.month or 1), day = (date.day or 1) } local weekday = tonumber(os.date('%w', os.time(d))) local default_bg = (weekday == 0 or weekday == 6) and beautiful.bg_focused or beautiful.bg_normal return wibox.widget { { { widget, halign = 'center', widget = wibox.container.place }, margins = (properties.padding or 2) + (properties.border_width or 0), widget = wibox.container.margin }, shape = properties.shape, shape_border_color = properties.border_color or '#00000000', shape_border_width = properties.border_width or 0, fg = properties.fg_color or beautiful.fg_normal, bg = properties.bg_color or beautiful.bg_normal, widget = wibox.container.background } end local cal = wibox.widget { date = os.date('*t'), font = beautiful.get_font(), fn_embed = decorate, long_weekdays = true, start_sunday = true, widget = wibox.widget.calendar.month } local popup = awful.popup { ontop = true, visible = false, shape = gears.shape.rounded_rect, offset = { y = 5 }, border_width = 2, border_color = beautiful.fg_minimize, widget = cal } function calendar_widget.toggle() if popup.visible then cal:set_date(nil) cal:set_date(os.date('*t')) popup:set_widget(nil) popup:set_widget(cal) popup.visible = not popup.visible else awful.placement.top_right(popup, { margins = { top = 30, right = 10 }, parent = awful.screen.focused() }) popup.visible = true end end return calendar_widget end return setmetatable(calendar_widget, { __call = function(_, ...) return worker(...) end})