local widget_types = { arc = require("classes/backlight/arc_widget") } local P = { name = "backlight" } P.__index = P --- -- Internal methods --- function P:_get_status() awful.spawn.easy_async( "xbacklight -get", function(stdout, stderr, exitreason, exitcode) self._ready = true self.brightness = tonumber(stdout) self:_update_widget() end ) return true end function P:_update_widget() if (not self._ready) then self.widget:set_state("error") self.widget:set_value(self.max_value); self.widget:set_tooltip("Backlight error"); return end self.widget:set_value(self.brightness); self.widget:set_tooltip("Backlight " .. math.floor(self.brightness) .. "%"); self.widget:set_state("ready") end --- -- Simple actions --- function P:backlight_up() if (not self._ready) or (self.brightness >= self.max_value) then return end awful.spawn("xbacklight -inc 5", false) self.brightness = self.brightness + 5 if self.brightness > self.max_value then self.brightness = self.max_value end self:_update_widget() end function P:backlight_down() if (not self._ready) or (self.brightness <= self.min_value) then return end awful.spawn("xbacklight -dec 5", false) self.brightness = self.brightness - 5 if self.brightness < self.min_value then self.brightness = self.min_value end self:_update_widget() end function P:backlight_set(value) if (not self._ready) then return end if (value < self.min_value) then value = self.min_value end if (value > self.max_value) then value = self.max_value end awful.spawn("xbacklight -set " .. value, false) self.brightness = value self:_update_widget() end --- -- Create new --- function P:new(args) -- Arguments local b = { update_interval = args.update_interal or 5, min_value = args.min_value or 1, max_value = args.max_value or 100, widget_type = args.widget_type or "arc", _ready = false, -- is all the information in this class up-to-date? -- if this is false, ui will show an error and most methods will -- do nothing. Updated in _get_status() } setmetatable(b, self) b.widget = widget_types[b.widget_type]:new() b.widget.widget:connect_signal("button::press", function(_, _, _, button, mods) if (button == 4) then -- Scroll up b:backlight_up() elseif (button == 5) then -- Scroll down b:backlight_down() end end ) -- This timer keeps mute and volume status up-to-date. b.timer = gears.timer { timeout = b.update_interval, call_now = true, autostart = true, callback = function() b:_get_status() end } return b end return P