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

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