diff --git a/calendar/README.md b/calendar/README.md new file mode 100644 index 0000000..906c71d --- /dev/null +++ b/calendar/README.md @@ -0,0 +1,47 @@ +## awesome-calendar + +Small calendar popup for awesome window manager. + +![Screenshot](/screenshot.png?raw=true "Screenshot") + +This is a polished up and improved module based on the `calendar2.lua` module +by Bernd Zeimetz and Marc Dequènes. + +### Installation + +Drop the script into your awesome config folder. Suggestion: + +```bash +cd ~/.config/awesome +git clone https://github.com/deficient/calendar.git +``` + + +### Usage + +In your `rc.lua`: + +```lua +-- load the widget code +local calendar = require("calendar") + +-- attach it as popup to your text clock widget: +calendar({}):attach(mytextclock) +``` + +You can also add some options to customize the widget's display. For instance: + +``` +local calendar = require("calendar") +calendar_widget = calendar({ + fdow = 7, -- Set Sunday as first day of the week (default is + -- 1 = Monday) + position = "bottom_right", -- Useful if you prefer your wibox at the bottomn + -- of the screen +}) +calendar_widget:attach(mytextclock) +``` + +### Requirements + +* [awesome 4.0](http://awesome.naquadah.org/). May work on 3.5 with minor changes. diff --git a/calendar/UNLICENSE b/calendar/UNLICENSE new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/calendar/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/calendar/calendar.lua b/calendar/calendar.lua new file mode 100644 index 0000000..0a3e3e9 --- /dev/null +++ b/calendar/calendar.lua @@ -0,0 +1,175 @@ +-- original code made by Bzed and published on http://awesome.naquadah.org/wiki/Calendar_widget +-- modified by Marc Dequènes (Duck) (2009-12-29), under the same licence, +-- and with the following changes: +-- + transformed to module +-- + the current day formating is customizable +-- also modified by tforgione for it to work in french + +-- captures +local os = os +local capi = { + mouse = mouse, + screen = screen, +} +local awful = require("awful") +local naughty = require("naughty") + +local version_major, version_minor = awesome.version:match("(%d+)%.(%d+)") +version_major = tonumber(version_major) +version_minor = tonumber(version_minor) +local can_update_size = version_major and version_minor and version_major >= 4 and version_minor >= 2 + +------------------------------------------ +-- utility functions +------------------------------------------ + +local function format_date(format, date) + return os.date(format, os.time(date)) +end + + +------------------------------------------ +-- calendar popup widget +------------------------------------------ + +local calendar = {} + +function calendar:new(args) + return setmetatable({}, {__index = self}):init(args) +end + +function calendar:init(args) + self.num_lines = 0 + self.today_color = args.today_color or "#00ff00" + -- first day of week: monday=1, …, sunday=7 + self.fdow = args.fdow or 1 + -- notification area: + self.html = args.html or '\n%s' + -- highlight current date: + self.today = args.today or '%2i' + self.anyday = args.anyday or '%2i' + self.page_title = args.page_title or '%B %Y' -- month year + self.col_title = args.col_title or '%a ' -- weekday + -- Date equality check is based on day_id. We deliberately ignore the year + -- to highlight the same day in different years: + self.day_id = args.day_id or '%m-%d' + self.empty_sep = args.empty_sep or " -" + self.week_col = args.week_col or " %V" + self.days_style = args.days_style or {} + self.position = args.position or naughty.config.defaults.position + return self +end + +function calendar:day_style(day_of_week) + return self.days_style[day_of_week] or '%s' +end + +function calendar:page(month, year) + + local today = format_date(self.day_id) + + -- 2001 started with a monday: + local d0 = format_date("*t", {year=2001, month=1, day=self.fdow }) + local dA = format_date("*t", {year=year, month=month, day=1 }) + local dB = format_date("*t", {year=year, month=month+1, day=0 }) + local tA = {year=year, month=month, day=1 } + local colA = (dA.wday - d0.wday) % 7 + + local page_title = format_date(self.page_title, tA) + + -- print column titles (weekday) + local page = " " + for d = 0, 6 do + page = page .. self:day_style(d+1):format(format_date(self.col_title, { + year = d0.year, + month = d0.month, + day = d0.day + d, + })) + end + + -- print empty space before first day + page = page .. "\n" .. format_date(self.week_col, tA) + for column = 1, colA do + page = page .. self.empty_sep + end + + -- iterate all days of the month + local nLines = 1 + local column = colA + for day = 1, dB.day do + if column == 7 then + column = 0 + nLines = nLines + 1 + page = page .. "\n" .. format_date(self.week_col, {year=year, month=month, day=day}) + end + if today == format_date(self.day_id, {day=day, month=month, year=year}) then + page = page .. " " .. self.today:format(day) + else + page = page .. " " .. self:day_style(column+1):format(self.anyday:format(day)) + end + column = column + 1 + end + + for column = column, 6 do + page = page .. self.empty_sep + end + + return page_title, self.html:format(page) +end + +function calendar:switch(months) + self:show(self.year, self.month+months) +end + +function calendar:show(year, month) + local today = os.time() + self.month = month or os.date('%m', today) + self.year = year or os.date('%Y', today) + local title, text = self:page(self.month, self.year) + + -- NOTE: `naughty.replace_text` does not update bounds and can therefore + -- not be used when the size increases (before #1756 was merged): + local num_lines = select(2, text:gsub('\n', '')) + local will_fit = can_update_size or num_lines <= self.num_lines + if naughty.replace_text and self.notification and will_fit then + naughty.replace_text(self.notification, title, text) + else + self:hide() + self.notification = naughty.notify({ + title = title, + text = text, + timeout = 0, + hover_timeout = 0.5, + screen = capi.mouse.screen, + position = self.position, + }) + self.num_lines = num_lines + end +end + +function calendar:hide() + if self.notification then + naughty.destroy(self.notification) + self.notification = nil + self.num_lines = 0 + end +end + +function calendar:attach(widget) + widget:connect_signal('mouse::enter', function() self:show() end) + widget:connect_signal('mouse::leave', function() self:hide() end) + widget:buttons(awful.util.table.join( + awful.button({ }, 1, function() self:switch( -1) end), + awful.button({ }, 3, function() self:switch( 1) end), + awful.button({ }, 4, function() self:switch( -1) end), + awful.button({ }, 5, function() self:switch( 1) end), + awful.button({ 'Shift' }, 1, function() self:switch(-12) end), + awful.button({ 'Shift' }, 3, function() self:switch( 12) end), + awful.button({ 'Shift' }, 4, function() self:switch(-12) end), + awful.button({ 'Shift' }, 5, function() self:switch( 12) end) + )) +end + +return setmetatable(calendar, { + __call = calendar.new, +}) diff --git a/calendar/init.lua b/calendar/init.lua new file mode 120000 index 0000000..27082e6 --- /dev/null +++ b/calendar/init.lua @@ -0,0 +1 @@ +calendar.lua \ No newline at end of file diff --git a/calendar/screenshot.png b/calendar/screenshot.png new file mode 100644 index 0000000..bac0c9d Binary files /dev/null and b/calendar/screenshot.png differ