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

new submodule: lain.util.separators
[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 tonumber     = tonumber
18
19 local setmetatable = setmetatable
20
21 -- Calendar notification
22 -- lain.widgets.calendar
23 local calendar = {}
24 local cal_notification = nil
25
26 function calendar:hide()
27     if cal_notification ~= nil then
28         naughty.destroy(cal_notification)
29         cal_notification = nil
30     end
31 end
32
33 function calendar:show(t_out, inc_offset, scr)
34     calendar:hide()
35
36     local offs = inc_offset or 0
37     local tims = t_out or 0
38     local f, c_text
39     local today = tonumber(os.date('%d'))
40     local init_t = calendar.cal .. ' | sed -r -e "s/(^| )( '
41
42     calendar.offset = calendar.offset + offs
43
44     if offs == 0 or calendar.offset == 0
45     then -- current month showing, today highlighted
46         if today >= 10
47         then
48            init_t = calendar.cal .. ' | sed -r -e "s/_\\x08//g" | sed -r -e "s/(^| )('
49         end
50
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( init_t .. today ..
56                       ')($| )/\\1<b><span foreground=\\"'
57                       .. calendar.bg ..
58                       '\\" background=\\"'
59                       .. calendar.fg ..
60                       '\\">\\2<\\/span><\\/b>\\3/"' )
61
62     else -- no current month showing, no day to highlight
63        local month = tonumber(os.date('%m'))
64        local year = tonumber(os.date('%Y'))
65
66        month = month + calendar.offset
67
68        if month > 12 then
69            month = month % 12
70            year = year + 1
71            if month <= 0 then
72                month = 12
73            end
74        elseif month < 1 then
75            month = month + 12
76            year = year - 1
77            if month <= 0 then
78                month = 1
79            end
80        end
81
82        calendar.notify_icon = nil
83
84        f = io.popen(calendar.cal .. ' ' .. month .. ' ' .. year)
85     end
86
87     c_text = "<tt><span font='" .. calendar.font .. " "
88              .. calendar.font_size .. "'><b>"
89              .. f:read() .. "</b>\n\n"
90              .. f:read() .. "\n"
91              .. f:read("*a"):gsub("\n*$", "")
92              .. "</span></tt>"
93     f:close()
94
95     cal_notification = naughty.notify({
96         text = c_text,
97         icon = calendar.notify_icon,
98         position = calendar.position,
99         fg = calendar.fg,
100         bg = calendar.bg,
101         timeout = tims,
102         screen = scr or 1
103     })
104 end
105
106 function calendar:attach(widget, args)
107     local args = args or {}
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:sub(beautiful.font:find(""),
111                          beautiful.font:find(" "))
112     calendar.font_size = tonumber(args.font_size) or 11
113     calendar.fg        = args.fg or beautiful.fg_normal or "#FFFFFF"
114     calendar.bg        = args.bg or beautiful.bg_normal or "#FFFFFF"
115     calendar.position  = args.position or "top_right"
116     calendar.scr_pos   = args.scr_pos or 1
117
118     calendar.offset = 0
119     calendar.notify_icon = nil
120
121     widget:connect_signal("mouse::enter", function () calendar:show(0, 0, scr_pos) end)
122     widget:connect_signal("mouse::leave", function () calendar:hide() end)
123     widget:buttons(awful.util.table.join( awful.button({ }, 1, function ()
124                                               calendar:show(0, -1, scr_pos) end),
125                                           awful.button({ }, 3, function ()
126                                               calendar:show(0, 1, scr_pos) end),
127                                           awful.button({ }, 4, function ()
128                                               calendar:show(0, -1, scr_pos) end),
129                                           awful.button({ }, 5, function ()
130                                               calendar:show(0, 1, scr_pos) end)))
131 end
132
133 return setmetatable(calendar, { __call = function(_, ...) return create(...) end })