]> git.madduck.net Git - etc/awesome.git/blob - widgets/calendar.lua

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

0d29bdd109d7b1b3f143f5d6748952ceb4ae9921
[etc/awesome.git] / widgets / calendar.lua
1
2 --[[
3                                                   
4      Licensed under GNU General Public License v2 
5       * (c) 2013, Luke Bonham                     
6                                                   
7 --]]
8
9 local icons_dir    = require("lain.helpers").icons_dir
10
11 local awful        = require("awful")
12 local beautiful    = require("beautiful")
13 local naughty      = require("naughty")
14
15 local io           = { popen = io.popen }
16 local os           = { date = os.date }
17 local mouse        = mouse
18 local string       = { format = string.format,
19                        sub    = string.sub,
20                        gsub   = string.gsub }
21 local tonumber     = tonumber
22
23 local setmetatable = setmetatable
24
25 -- Calendar notification
26 -- lain.widgets.calendar
27 local calendar = {}
28 local cal_notification = nil
29
30 function calendar:hide()
31     if cal_notification ~= nil then
32         naughty.destroy(cal_notification)
33         cal_notification = nil
34     end
35 end
36
37 function calendar:show(t_out, inc_offset, scr)
38     calendar:hide()
39
40     local f, c_text
41     local offs  = inc_offset or 0
42     local tims  = t_out or 0
43     local today = tonumber(os.date('%d'))
44
45     calendar.offset = calendar.offset + offs
46
47     if offs == 0 or calendar.offset == 0
48     then -- current month showing, today highlighted
49         calendar.offset = 0
50         calendar.notify_icon = calendar.icons .. today .. ".png"
51
52         -- bg and fg inverted to highlight today
53         f = io.popen(string.format("%s | sed -r -e 's/_\\x08//g' -e '0,/(^| )%d($| )/ s/(^| )%d($| )/\\1<b><span foreground=\"%s\" background=\"%s\">%d<\\/span><\\/b>\\2/'",
54                      calendar.cal, today, today, calendar.bg, calendar.fg, today))
55
56     else -- no current month showing, no day to highlight
57        local month = tonumber(os.date('%m'))
58        local year = tonumber(os.date('%Y'))
59
60        month = month + calendar.offset
61
62        if month > 12 then
63            month = month % 12
64            year = year + 1
65            if month <= 0 then
66                month = 12
67            end
68        elseif month < 1 then
69            month = month + 12
70            year = year - 1
71            if month <= 0 then
72                month = 1
73            end
74        end
75
76        calendar.notify_icon = nil
77        f = io.popen(string.format('%s %s %s', calendar.cal, month, year))
78     end
79
80     c_text = "<tt><span font='" .. calendar.font .. " "
81              .. calendar.font_size .. "'><b>"
82              .. f:read() .. "</b>\n\n"
83              .. f:read() .. "\n"
84              .. f:read("*all"):gsub("\n*$", "")
85              .. "</span></tt>"
86     f:close()
87
88     if calendar.followmouse then
89         scrp = mouse.screen
90     else
91         scrp = scr or calendar.scr_pos
92     end
93
94     cal_notification = naughty.notify({
95         text = c_text,
96         icon = calendar.notify_icon,
97         position = calendar.position,
98         fg = calendar.fg,
99         bg = calendar.bg,
100         timeout = tims,
101         screen = scrp
102     })
103 end
104
105 function calendar:attach(widget, args)
106     local args = args or {}
107
108     calendar.cal         = args.cal or "/usr/bin/cal"
109     calendar.icons       = args.icons or icons_dir .. "cal/white/"
110     calendar.font        = args.font or beautiful.font:gsub(" %d.*", "")
111     calendar.font_size   = tonumber(args.font_size) or 11
112     calendar.fg          = args.fg or beautiful.fg_normal or "#FFFFFF"
113     calendar.bg          = args.bg or beautiful.bg_normal or "#000000"
114     calendar.position    = args.position or "top_right"
115     calendar.scr_pos     = args.scr_pos or 1
116     calendar.followmouse = args.followmouse or false
117
118     calendar.fg = string.sub(calendar.fg, 1, 7)
119     calendar.bg = string.sub(calendar.bg, 1, 7)
120
121     calendar.offset      = 0
122     calendar.notify_icon = nil
123
124     widget:connect_signal("mouse::enter", function () calendar:show(0, 0, calendar.scr_pos) end)
125     widget:connect_signal("mouse::leave", function () calendar:hide() end)
126     widget:buttons(awful.util.table.join(awful.button({ }, 1, function ()
127                                              calendar:show(0, -1, calendar.scr_pos) end),
128                                          awful.button({ }, 3, function ()
129                                              calendar:show(0, 1, calendar.scr_pos) end),
130                                          awful.button({ }, 4, function ()
131                                              calendar:show(0, -1, calendar.scr_pos) end),
132                                          awful.button({ }, 5, function ()
133                                              calendar:show(0, 1, calendar.scr_pos) end)))
134 end
135
136 return setmetatable(calendar, { __call = function(_, ...) return create(...) end })