X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/8d3868d7ce528cfc075e246c8935bae2724e0868..1542a800fdee1e009bb19f45d3bcaf9591958b92:/widget/calendar.lua?ds=sidebyside

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 })