]> 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:

Merge pull request #233 from aajjbb/luarocks-file
[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(calendar.cal_format(today))
54     else -- no current month showing, no day to highlight
55        local month = tonumber(os.date('%m'))
56        local year = tonumber(os.date('%Y'))
57
58        month = month + calendar.offset
59
60        while month > 12 do
61            month = month - 12
62            year = year + 1
63        end
64
65        while month < 1 do
66            month = month + 12
67            year = year - 1
68        end
69
70        calendar.notify_icon = nil
71        f = io.popen(string.format('%s %s %s', calendar.cal, month, year))
72     end
73
74     c_text = "<tt><span font='" .. calendar.font .. " "
75              .. calendar.font_size .. "'><b>"
76              .. f:read() .. "</b>\n\n"
77              .. f:read() .. "\n"
78              .. f:read("*all"):gsub("\n*$", "")
79              .. "</span></tt>"
80     f:close()
81
82     if calendar.followmouse then
83         scrp = mouse.screen
84     else
85         scrp = scr or calendar.scr_pos
86     end
87
88     cal_notification = naughty.notify({
89         text = c_text,
90         icon = calendar.notify_icon,
91         position = calendar.position,
92         fg = calendar.fg,
93         bg = calendar.bg,
94         timeout = tims,
95         screen = scrp
96     })
97 end
98
99 function calendar:attach(widget, args)
100     local args = args or {}
101
102     calendar.cal         = args.cal or "/usr/bin/cal"
103     calendar.cal_format  = args.cal_format or function(today)
104         return 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/'",
105                              calendar.cal, today, today, calendar.bg, calendar.fg, today)
106     end
107     calendar.icons       = args.icons or icons_dir .. "cal/white/"
108     calendar.font        = args.font or beautiful.font:gsub(" %d.*", "")
109     calendar.font_size   = tonumber(args.font_size) or 11
110     calendar.fg          = args.fg or beautiful.fg_normal or "#FFFFFF"
111     calendar.bg          = args.bg or beautiful.bg_normal or "#000000"
112     calendar.position    = args.position or "top_right"
113     calendar.scr_pos     = args.scr_pos or 1
114     calendar.followmouse = args.followmouse or false
115
116     calendar.offset      = 0
117     calendar.notify_icon = nil
118
119     widget:connect_signal("mouse::enter", function () calendar:show(0, 0, calendar.scr_pos) end)
120     widget:connect_signal("mouse::leave", function () calendar:hide() end)
121     widget:buttons(awful.util.table.join(awful.button({ }, 1, function ()
122                                              calendar:show(0, -1, calendar.scr_pos) end),
123                                          awful.button({ }, 3, function ()
124                                              calendar:show(0, 1, calendar.scr_pos) end),
125                                          awful.button({ }, 4, function ()
126                                              calendar:show(0, -1, calendar.scr_pos) end),
127                                          awful.button({ }, 5, function ()
128                                              calendar:show(0, 1, calendar.scr_pos) end)))
129 end
130
131 return setmetatable(calendar, { __call = function(_, ...) return create(...) end })