From 9cffa9b6eb594983b3f4fab4bceca42091a531e5 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Sun, 24 Sep 2023 10:07:04 -0400 Subject: add calendar widget to awesome --- programs/dotfiles/awesome/calendar.lua | 115 +++++++++++++++++++++++++++++++++ programs/dotfiles/awesome/rc.lua | 98 +++++++++++++++++----------- 2 files changed, 174 insertions(+), 39 deletions(-) create mode 100644 programs/dotfiles/awesome/calendar.lua (limited to 'programs/dotfiles') diff --git a/programs/dotfiles/awesome/calendar.lua b/programs/dotfiles/awesome/calendar.lua new file mode 100644 index 0000000..6e791b3 --- /dev/null +++ b/programs/dotfiles/awesome/calendar.lua @@ -0,0 +1,115 @@ +local awful = require("awful") +local beautiful = require("beautiful") +local wibox = require("wibox") +local gears = require("gears") + +local calendar_widget = {} + +local function worker(user_args) + local args = user_args or {} + + local style = {} + + style.month = { + padding = 4, + bg_color = beautiful.bg_normal, + border_width = 0 + } + + style.normal = { + markup = function(t) return t end, + shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, 4) end, + } + + style.focused = { + bg_color = beautiful.bg_focus, + fg_color = beautiful.fg_focus, + markup = function(t) return '' .. t .. '' end, + shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, 4) end, + } + + style.header = { + bg_color = beautiful.bg_focus, + fg_color = beautiful.fg_focus, + markup = function(t) return ''..t..'' end, + } + + style.weekday = { + bg_color = beautiful.bg_focus, + fg_color = beautiful.fg_focus, + markup = function(t) return ''..t..'' end, + } + + local function decorate(widget, flag, date) + if flag == 'monthheader' then flag = 'header' end + if flag == 'focus' then + local today = os.date('*t') + if not today.month == date.month and today.year == date.year then + flag = 'normal' + end + end + local properties = style[flag] or {} + if properties.markup and widget.get_text and widget.set_markup then + widget:set_markup(properties.markup(widget:get_text())) + end + local thisdate = { year = date.year, month = (date.month or 1), day = (date.day or 1) } + local weekday = tonumber(os.date('%w', os.time(d))) + local default_bg = (weekday == 0 or weekday == 6) + and beautiful.bg_focused + or beautiful.bg_normal + return wibox.widget { + { + { + widget, + halign = 'center', + widget = wibox.container.place + }, + margins = (properties.padding or 2) + (properties.border_width or 0), + widget = wibox.container.margin + }, + shape = properties.shape, + shape_border_color = properties.border_color or '#00000000', + shape_border_width = properties.border_width or 0, + fg = properties.fg_color or beautiful.fg_normal, + bg = properties.bg_color or beautiful.bg_normal, + widget = wibox.container.background + } + end + + local cal = wibox.widget { + date = os.date('*t'), + font = beautiful.get_font(), + fn_embed = decorate, + long_weekdays = true, + start_sunday = true, + widget = wibox.widget.calendar.month + } + + local popup = awful.popup { + ontop = true, + visible = false, + shape = gears.shape.rounded_rect, + offset = { y = 5 }, + border_width = 2, + border_color = beautiful.fg_minimize, + widget = cal + } + + function calendar_widget.toggle() + if popup.visible then + cal:set_date(nil) + cal:set_date(os.date('*t')) + popup:set_widget(nil) + popup:set_widget(cal) + popup.visible = not popup.visible + else + awful.placement.top_right(popup, { margins = { top = 30, right = 10 }, parent = awful.screen.focused() }) + popup.visible = true + end + end + return calendar_widget +end + +return setmetatable(calendar_widget, { __call = function(_, ...) + return worker(...) +end}) diff --git a/programs/dotfiles/awesome/rc.lua b/programs/dotfiles/awesome/rc.lua index ccd1d1a..065eda3 100644 --- a/programs/dotfiles/awesome/rc.lua +++ b/programs/dotfiles/awesome/rc.lua @@ -127,14 +127,23 @@ menubar.utils.terminal = terminal -- Set the terminal for applications that requ -- {{{ Wibar -- Create a textclock widget -toptextclock = wibox.widget { - { - widget = wibox.widget.textclock - }, - bg = beautiful.bg_normal, - widget = wibox.container.background, - shape = gears.shape.rounded_rect -} +toptextclock = wibox.widget.textclock() +--toptextclock = wibox.widget { +-- { +-- widget = wibox.widget.textclock +-- }, +-- bg = beautiful.bg_normal, +-- widget = wibox.container.background, +-- shape = gears.shape.rounded_rect +--} + +local calendar_widget = require("calendar") +local topcalendar = calendar_widget() + +toptextclock:connect_signal("button::press", +function(_, _, _, button) + if button == 1 then topcalendar.toggle() end +end) -- Create a wibox for each screen and add it local taglist_buttons = gears.table.join( @@ -227,6 +236,8 @@ awful.screen.connect_for_each_screen(function(s) }, id = "shape_role", bg = beautiful.bg_normal, + shape_border_width = 2, + shape_border_color = beautiful.fg_minimize, shape = gears.shape.circle, widget = wibox.container.background, }, @@ -274,40 +285,31 @@ awful.screen.connect_for_each_screen(function(s) spacing = 4, layout = wibox.layout.flex.horizontal }, - widget_template = { + widget_template = + { + layout = wibox.layout.fixed.vertical, + { + wibox.widget.base.make_widget(), + id = 'background_role', + forced_height = 4, + widget = wibox.container.background + }, { - { - wibox.widget.base.make_widget(), - id = 'background_role', - forced_height = 4, - widget = wibox.container.background, - }, { { - { - { - id = 'icon_role', - widget = wibox.widget.imagebox, - }, - margins = 2, - widget = wibox.container.margin, - }, - { - id = 'text_role', - widget = wibox.widget.textbox - }, - layout = wibox.layout.fixed.horizontal + id = 'icon_role', + widget = wibox.widget.imagebox, }, - left = 4, - right = 4, - bottom = 4, + margins = 2, widget = wibox.container.margin, }, - layout = wibox.layout.fixed.vertical + { + id = 'text_role', + widget = wibox.widget.textbox + }, + layout = wibox.layout.fixed.horizontal }, - nil, - widget = wibox.container.background, - }, + } } -- Create the wibox @@ -327,10 +329,28 @@ awful.screen.connect_for_each_screen(function(s) }, s.mytasklist, -- Middle widget { -- Right widgets - layout = wibox.layout.fixed.horizontal, - wibox.container.margin(s.systray, 0, 0, 4, 4), - toptextclock, - s.mylayoutbox, + { + { + layout = wibox.layout.fixed.horizontal, + { + { + widget = s.systray, + }, + widget = wibox.container.margin, + left = 8, + top = 4, + bottom = 4 + }, + toptextclock, + wibox.container.margin(s.mylayoutbox, 4, 4, 4, 4), + }, + widget = wibox.container.background, + shape = gears.shape.rounded_rect, + shape_border_width = 1, + shape_border_color = beautiful.fg_minimize, + bg = beautiful.bg_normal, + }, + layout = wibox.layout.fixed.horizontal }, } end) -- cgit v1.2.1