From 6d1c05decca2fffe87863fceaa163a077360f21d Mon Sep 17 00:00:00 2001 From: Shubham Pawar Date: Tue, 22 Mar 2022 21:43:05 +0530 Subject: [PATCH] Simplified get_brightness_cmd and using gears.filesystem - `brightnessctl` already has (g)et option that will get current brightness value without any decoration - Using `gfs.get_configuration_dir()` will return the awesomewm config directory. [Reference](https://awesomewm.org/doc/api/libraries/gears.filesystem.html#get_configuration_dir) --- brightness-widget/brightness.lua | 314 ++++++++++++++++--------------- 1 file changed, 161 insertions(+), 153 deletions(-) diff --git a/brightness-widget/brightness.lua b/brightness-widget/brightness.lua index b0d98cf..c069b61 100644 --- a/brightness-widget/brightness.lua +++ b/brightness-widget/brightness.lua @@ -12,9 +12,10 @@ local awful = require("awful") local wibox = require("wibox") local watch = require("awful.widget.watch") local spawn = require("awful.spawn") +local gfs = require("gears.filesystem") local naughty = require("naughty") -local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/brightness-widget/' +local ICON_DIR = gfs.get_configuration_dir() .. "awesome-wm-widgets/brightness-widget/" local get_brightness_cmd local set_brightness_cmd local inc_brightness_cmd @@ -23,169 +24,176 @@ local dec_brightness_cmd local brightness_widget = {} local function show_warning(message) - naughty.notify{ - preset = naughty.config.presets.critical, - title = 'Brightness Widget', - text = message} + naughty.notify({ + preset = naughty.config.presets.critical, + title = "Brightness Widget", + text = message, + }) end local function worker(user_args) + local args = user_args or {} - local args = user_args or {} + local type = args.type or "arc" -- arc or icon_and_text + local path_to_icon = args.path_to_icon or ICON_DIR .. "brightness.svg" + local font = args.font or "Play 9" + local timeout = args.timeout or 100 - local type = args.type or 'arc' -- arc or icon_and_text - local path_to_icon = args.path_to_icon or ICON_DIR .. 'brightness.svg' - local font = args.font or 'Play 9' - local timeout = args.timeout or 100 + local program = args.program or "light" + local step = args.step or 5 + local base = args.base or 20 + local current_level = 0 -- current brightness value + local tooltip = args.tooltip or false + local percentage = args.percentage or false + if program == "light" then + get_brightness_cmd = "light -G" + set_brightness_cmd = "light -S %d" -- + inc_brightness_cmd = "light -A " .. step + dec_brightness_cmd = "light -U " .. step + elseif program == "xbacklight" then + get_brightness_cmd = "xbacklight -get" + set_brightness_cmd = "xbacklight -set %d" -- + inc_brightness_cmd = "xbacklight -inc " .. step + dec_brightness_cmd = "xbacklight -dec " .. step + elseif program == "brightnessctl" then + get_brightness_cmd = "brightnessctl get" + set_brightness_cmd = "brightnessctl set %d%%" -- + inc_brightness_cmd = "brightnessctl set +" .. step .. "%" + dec_brightness_cmd = "brightnessctl set " .. step .. "-%" + else + show_warning(program .. " command is not supported by the widget") + return + end - local program = args.program or 'light' - local step = args.step or 5 - local base = args.base or 20 - local current_level = 0 -- current brightness value - local tooltip = args.tooltip or false - local percentage = args.percentage or false - if program == 'light' then - get_brightness_cmd = 'light -G' - set_brightness_cmd = 'light -S %d' -- - inc_brightness_cmd = 'light -A ' .. step - dec_brightness_cmd = 'light -U ' .. step - elseif program == 'xbacklight' then - get_brightness_cmd = 'xbacklight -get' - set_brightness_cmd = 'xbacklight -set %d' -- - inc_brightness_cmd = 'xbacklight -inc ' .. step - dec_brightness_cmd = 'xbacklight -dec ' .. step - elseif program == 'brightnessctl' then - get_brightness_cmd = 'bash -c "brightnessctl -m | cut -d, -f4 | tr -d %"' - set_brightness_cmd = 'brightnessctl set %d%%' -- - inc_brightness_cmd = 'brightnessctl set +' .. step .. '%' - dec_brightness_cmd = 'brightnessctl set ' .. step .. '-%' - else - show_warning(program .. " command is not supported by the widget") - return - end + if type == "icon_and_text" then + brightness_widget.widget = wibox.widget({ + { + { + image = path_to_icon, + resize = false, + widget = wibox.widget.imagebox, + }, + valign = "center", + layout = wibox.container.place, + }, + { + id = "txt", + font = font, + widget = wibox.widget.textbox, + }, + spacing = 4, + layout = wibox.layout.fixed.horizontal, + set_value = function(self, level) + local display_level = level + if percentage then + display_level = display_level .. "%" + end + self:get_children_by_id("txt")[1]:set_text(display_level) + end, + }) + elseif type == "arc" then + brightness_widget.widget = wibox.widget({ + { + { + image = path_to_icon, + resize = true, + widget = wibox.widget.imagebox, + }, + valign = "center", + layout = wibox.container.place, + }, + max_value = 100, + thickness = 2, + start_angle = 4.71238898, -- 2pi*3/4 + forced_height = 18, + forced_width = 18, + paddings = 2, + widget = wibox.container.arcchart, + set_value = function(self, level) + self:set_value(level) + end, + }) + else + show_warning(type .. " type is not supported by the widget") + return + end - if type == 'icon_and_text' then - brightness_widget.widget = wibox.widget { - { - { - image = path_to_icon, - resize = false, - widget = wibox.widget.imagebox, - }, - valign = 'center', - layout = wibox.container.place - }, - { - id = 'txt', - font = font, - widget = wibox.widget.textbox - }, - spacing = 4, - layout = wibox.layout.fixed.horizontal, - set_value = function(self, level) - local display_level = level - if percentage then - display_level = display_level .. '%' - end - self:get_children_by_id('txt')[1]:set_text(display_level) - end - } - elseif type == 'arc' then - brightness_widget.widget = wibox.widget { - { - { - image = path_to_icon, - resize = true, - widget = wibox.widget.imagebox, - }, - valign = 'center', - layout = wibox.container.place - }, - max_value = 100, - thickness = 2, - start_angle = 4.71238898, -- 2pi*3/4 - forced_height = 18, - forced_width = 18, - paddings = 2, - widget = wibox.container.arcchart, - set_value = function(self, level) - self:set_value(level) - end - } - else - show_warning(type .. " type is not supported by the widget") - return + local update_widget = function(widget, stdout, _, _, _) + local brightness_level = tonumber(string.format("%.0f", stdout)) + current_level = brightness_level + widget:set_value(brightness_level) + end - end + function brightness_widget:set(value) + current_level = value + spawn.easy_async(string.format(set_brightness_cmd, value), function() + spawn.easy_async(get_brightness_cmd, function(out) + update_widget(brightness_widget.widget, out) + end) + end) + end + local old_level = 0 + function brightness_widget:toggle() + if old_level < 0.1 then + -- avoid toggling between '0' and 'almost 0' + old_level = 1 + end + if current_level < 0.1 then + -- restore previous level + current_level = old_level + else + -- save current brightness for later + old_level = current_level + current_level = 0 + end + brightness_widget:set(current_level) + end + function brightness_widget:inc() + spawn.easy_async(inc_brightness_cmd, function() + spawn.easy_async(get_brightness_cmd, function(out) + update_widget(brightness_widget.widget, out) + end) + end) + end + function brightness_widget:dec() + spawn.easy_async(dec_brightness_cmd, function() + spawn.easy_async(get_brightness_cmd, function(out) + update_widget(brightness_widget.widget, out) + end) + end) + end - local update_widget = function(widget, stdout, _, _, _) - local brightness_level = tonumber(string.format("%.0f", stdout)) - current_level = brightness_level - widget:set_value(brightness_level) - end + brightness_widget.widget:buttons(awful.util.table.join( + awful.button({}, 1, function() + brightness_widget:set(base) + end), + awful.button({}, 3, function() + brightness_widget:toggle() + end), + awful.button({}, 4, function() + brightness_widget:inc() + end), + awful.button({}, 5, function() + brightness_widget:dec() + end) + )) - function brightness_widget:set(value) - current_level = value - spawn.easy_async(string.format(set_brightness_cmd, value), function() - spawn.easy_async(get_brightness_cmd, function(out) - update_widget(brightness_widget.widget, out) - end) - end) - end - local old_level = 0 - function brightness_widget:toggle() - if old_level < 0.1 then - -- avoid toggling between '0' and 'almost 0' - old_level = 1 - end - if current_level < 0.1 then - -- restore previous level - current_level = old_level - else - -- save current brightness for later - old_level = current_level - current_level = 0 - end - brightness_widget:set(current_level) - end - function brightness_widget:inc() - spawn.easy_async(inc_brightness_cmd, function() - spawn.easy_async(get_brightness_cmd, function(out) - update_widget(brightness_widget.widget, out) - end) - end) - end - function brightness_widget:dec() - spawn.easy_async(dec_brightness_cmd, function() - spawn.easy_async(get_brightness_cmd, function(out) - update_widget(brightness_widget.widget, out) - end) - end) - end + watch(get_brightness_cmd, timeout, update_widget, brightness_widget.widget) - brightness_widget.widget:buttons( - awful.util.table.join( - awful.button({}, 1, function() brightness_widget:set(base) end), - awful.button({}, 3, function() brightness_widget:toggle() end), - awful.button({}, 4, function() brightness_widget:inc() end), - awful.button({}, 5, function() brightness_widget:dec() end) - ) - ) + if tooltip then + awful.tooltip({ + objects = { brightness_widget.widget }, + timer_function = function() + return current_level .. " %" + end, + }) + end - watch(get_brightness_cmd, timeout, update_widget, brightness_widget.widget) - - if tooltip then - awful.tooltip { - objects = { brightness_widget.widget }, - timer_function = function() - return current_level .. " %" - end, - } - end - - return brightness_widget.widget + return brightness_widget.widget end -return setmetatable(brightness_widget, { __call = function(_, ...) - return worker(...) -end }) +return setmetatable(brightness_widget, { + __call = function(_, ...) + return worker(...) + end, +})