X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/8d3868d7ce528cfc075e246c8935bae2724e0868..1542a800fdee1e009bb19f45d3bcaf9591958b92:/widget/calendar.lua diff --git a/widget/calendar.lua b/widget/calendar.lua index 4a3d207..99e8817 100644 --- a/widget/calendar.lua +++ b/widget/calendar.lua @@ -10,6 +10,7 @@ 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,6 +31,7 @@ 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) @@ -58,62 +60,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 +123,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 })