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

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