-
Notifications
You must be signed in to change notification settings - Fork 0
/
cal.lua
142 lines (121 loc) · 4.14 KB
/
cal.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
-- original code made by Bzed and published on http://awesome.naquadah.org/wiki/Calendar_widget
-- modified by Marc Dequènes (Duck) <[email protected]> (2009-12-29), under the same licence,
-- and with the following changes:
-- + transformed to module
-- + the current day formating is customizable
-- modified by Jörg Thalheim (Mic92) <[email protected]> (2011), under the same licence,
-- and with the following changes:
-- + use tooltip instead of naughty.notify
-- + rename it to cal
-- + lua52 compliant module
--
-- 1. require it in your rc.lua
-- require("cal")
-- 2. attach the calendar to a widget of your choice (ex mytextclock)
-- cal.register(mytextclock)
-- If you don't like the default current day formating you can change it as following
-- cal.register(mytextclock, "<b>%s</b>") -- now the current day is bold instead of underlined
--
-- # How to Use #
-- Just hover with your mouse over the widget, you register and the calendar popup.
-- On clicking or by using the mouse wheel the displayed month changes.
-- Pressing Shift + Mouse click change the year.
local string = {format = string.format}
local os = {date = os.date, time = os.time}
local awful = require("awful")
local cal = {}
local tooltip
local state = {}
local current_day_format = "<u>%s</u>"
function displayMonth(month,year,weekStart)
local t,wkSt=os.time{year=year, month=month+1, day=0},weekStart or 1
local d=os.date("*t",t)
local mthDays,stDay=d.day,(d.wday-d.day-wkSt+1)%7
local lines = " "
for x=0,6 do
lines = lines .. os.date("%a ",os.time{year=2006,month=1,day=x+wkSt})
end
lines = lines .. "\n" .. os.date(" %V",os.time{year=year,month=month,day=1})
local writeLine = 1
while writeLine < (stDay + 1) do
lines = lines .. " "
writeLine = writeLine + 1
end
for d=1,mthDays do
local x = d
local t = os.time{year=year,month=month,day=d}
if writeLine == 8 then
writeLine = 1
lines = lines .. "\n" .. os.date(" %V",t)
end
if os.date("%Y-%m-%d") == os.date("%Y-%m-%d", t) then
x = string.format(current_day_format, d)
end
if d < 10 then
x = " " .. x
end
lines = lines .. " " .. x
writeLine = writeLine + 1
end
if stDay + mthDays < 36 then
lines = lines .. "\n"
end
if stDay + mthDays < 29 then
lines = lines .. "\n"
end
local header = os.date("%B %Y\n",os.time{year=year,month=month,day=1})
return header .. "\n" .. lines
end
function cal.register(mywidget, custom_current_day_format)
if custom_current_day_format then current_day_format = custom_current_day_format end
if not tooltip then
tooltip = awful.tooltip({})
function tooltip:update()
local month, year = os.date('%m'), os.date('%Y')
state = {month, year}
tooltip:set_markup(string.format('<span font_desc="monospace">%s</span>', displayMonth(month, year, 2)))
end
tooltip:update()
end
tooltip:add_to_object(mywidget)
mywidget:connect_signal("mouse::enter",tooltip.update)
mywidget:buttons(awful.util.table.join(
awful.button({ }, 1, function()
switchMonth(-1)
end),
awful.button({ }, 2, function()
goToToday()
end),
awful.button({ }, 3, function()
switchMonth(1)
end),
awful.button({ }, 4, function()
switchMonth(-1)
end),
awful.button({ }, 5, function()
switchMonth(1)
end),
awful.button({ 'Shift' }, 1, function()
switchMonth(-12)
end),
awful.button({ 'Shift' }, 3, function()
switchMonth(12)
end),
awful.button({ 'Shift' }, 4, function()
switchMonth(-12)
end),
awful.button({ 'Shift' }, 5, function()
switchMonth(12)
end)))
end
function switchMonth(delta)
state[1] = state[1] + delta
local text = string.format('<span font_desc="monospace">%s</span>', displayMonth(state[1], state[2], 2))
tooltip:set_markup(text)
end
function goToToday()
state[1] = os.date('%m')
state[2] = os.date('%Y')
switchMonth(0)
end
return cal