X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/8d3868d7ce528cfc075e246c8935bae2724e0868..7d0611cc405616fa42480f84ce431071708acb13:/widget/calendar.lua diff --git a/widget/calendar.lua b/widget/calendar.lua index 4a3d207..2dda890 100644 --- a/widget/calendar.lua +++ b/widget/calendar.lua @@ -1,15 +1,15 @@ - --[[ - - Licensed under GNU General Public License v2 - * (c) 2013, Luke Bonham - + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + --]] local helpers = require("lain.helpers") local markup = require("lain.util.markup") local awful = require("awful") local naughty = require("naughty") +local mouse = mouse local os = { date = os.date } local string = { format = string.format, gsub = string.gsub } @@ -30,14 +30,15 @@ end function calendar.show(t_out, inc_offset, scr) local f, offs = nil, inc_offset or 0 + calendar.notification_preset.screen = scr or (calendar.followtag and awful.screen.focused()) or 1 calendar.offset = calendar.offset + offs local current_month = (offs == 0 or calendar.offset == 0) if current_month then -- today highlighted calendar.offset = 0 - calendar.icon = string.format("%s%s.png", calendar.icons, tonumber(os.date("%d"))) - f = calendar.cal + calendar.icon = calendar.icons:len() > 0 and string.format("%s%s.png", calendar.icons, tonumber(os.date("%d"))) + f = calendar.cal else -- no current month showing, no day to highlight local month = tonumber(os.date("%m")) local year = tonumber(os.date("%Y")) @@ -58,62 +59,53 @@ function calendar.show(t_out, inc_offset, scr) f = string.format("%s %s %s", calendar.cal, month, year) end - if calendar.followtag then - calendar.notification_preset.screen = awful.screen.focused() - else - calendar.notification_preset.screen = src or 1 - end - - if f == calendar then - calendar.update(f, false) - calendar.hide() - calendar.notification = naughty.notify({ - preset = calendar.notification_preset, - icon = calendar.icon, - timeout = t_out or calendar.notification_preset.timeout or 5 - }) - else - calendar.update(f, true, t_out) - end -end - -function calendar.update(f, show, t_out) - local fg, bg = calendar.notification_preset.fg, calendar.notification_preset.bg - helpers.async(f, function(ws) - ws = ws:gsub("%c%[%d+[m]?%s?%d+%c%[%d+[m]?", - markup.bold(markup.color(bg, fg, os.date("%e")))):gsub("\n*$", "") - - if f == calendar.cal then - calendar.notification_preset.text = ws + local fg, bg = calendar.notification_preset.fg, calendar.notification_preset.bg + calendar.notification_preset.text = ws:gsub("%c%[%d+[m]?%s?%d+%c%[%d+[m]?", + markup.bold(markup.color(bg, fg, os.date("%e")))):gsub("\n*$", "") + + local widget_focused = true + + if t_out == 0 and mouse.current_widgets then + widget_focused = false + for i, widget in ipairs(calendar.attach_to) do + for _,v in ipairs(mouse.current_widgets) do + if widget == v then + widget_focused = true + break + end + end + end end - if show then + if widget_focused then calendar.hide() calendar.notification = naughty.notify({ - preset = calendar.notification_preset, - text = ws, - icon = calendar.icon, - timeout = t_out or calendar.notification_preset.timeout or 5 + preset = calendar.notification_preset, + icon = calendar.icon, + timeout = t_out or calendar.notification_preset.timeout or 5 }) end end) end +function calendar.hover_on() calendar.show(0) end +function calendar.hover_off() calendar.hide() end +function calendar.prev() calendar.show(0, -1) end +function calendar.next() calendar.show(0, 1) end + function calendar.attach(widget) - widget:connect_signal("mouse::enter", function () calendar.show(0) end) - widget:connect_signal("mouse::leave", function () calendar.hide() end) - widget:buttons(awful.util.table.join(awful.button({ }, 1, function () - calendar.show(0, -1, calendar.scr_pos) end), - awful.button({ }, 3, function () - calendar.show(0, 1, calendar.scr_pos) end), - awful.button({ }, 4, function () - calendar.show(0, -1, calendar.scr_pos) end), - awful.button({ }, 5, function () - calendar.show(0, 1, calendar.scr_pos) end))) + widget:connect_signal("mouse::enter", calendar.hover_on) + widget:connect_signal("mouse::leave", calendar.hover_off) + widget:buttons(awful.util.table.join( + awful.button({}, 1, calendar.prev), + awful.button({}, 3, calendar.next), + awful.button({}, 2, calendar.hover_on), + awful.button({}, 4, calendar.prev), + awful.button({}, 5, calendar.next))) end -local function worker(args) +local function factory(args) local args = args or {} calendar.cal = args.cal or "/usr/bin/cal" calendar.attach_to = args.attach_to or {} @@ -130,8 +122,6 @@ local function worker(args) end for i, widget in ipairs(calendar.attach_to) do calendar.attach(widget) end - - calendar.update(calendar.cal, false) end -return setmetatable(calendar, { __call = function(_, ...) return worker(...) end }) +return setmetatable(calendar, { __call = function(_, ...) return factory(...) end })