From 0060372b9a7f93b60c5076b18f2d0d51a2ffaf75 Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Sat, 3 Apr 2021 13:26:28 +0200 Subject: [PATCH] Add calendar, no submodules --- calendar/README.md | 47 +++++++++++ calendar/UNLICENSE | 24 ++++++ calendar/calendar.lua | 175 ++++++++++++++++++++++++++++++++++++++++ calendar/init.lua | 1 + calendar/screenshot.png | Bin 0 -> 12673 bytes 5 files changed, 247 insertions(+) create mode 100644 calendar/README.md create mode 100644 calendar/UNLICENSE create mode 100644 calendar/calendar.lua create mode 120000 calendar/init.lua create mode 100644 calendar/screenshot.png 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 0000000000000000000000000000000000000000..bac0c9d198229b407a5263a630d97ae4ae33bec4 GIT binary patch literal 12673 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 literal 0 HcmV?d00001