X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/2836fff52e31eccd159133f7ea8dc207e86c2754..c0deea25035a845907210f2a913099343a16162e:/widgets/contrib/redshift.lua?ds=inline diff --git a/widgets/contrib/redshift.lua b/widgets/contrib/redshift.lua index 38f1d83..fdda61f 100644 --- a/widgets/contrib/redshift.lua +++ b/widgets/contrib/redshift.lua @@ -1,79 +1,54 @@ --[[ - - Licensed under GNU General Public License v2 - * (c) 2014, blueluke - + + Licensed under GNU General Public License v2 + * (c) 2014, blueluke + --]] -local os = os -local awful = require("awful") -local spawn = awful.util.spawn_with_shell +local async = require("lain.helpers").async +local awful = require("awful") +local execute = os.execute +local type = type -local setmetatable = setmetatable - --- redshift +-- Redshift -- lain.widgets.contrib.redshift -local redshift = {} - -local attached = false -- true if attached to a widget -local active = false -- true if redshift is active -local running = false -- true if redshift was initialized -local update_fnct = function() end -- function that is run each time redshift is toggled. See redshift:attach(). - - -local function init() - -- As there is no way to determine if redshift was previously - -- toggled off (i.e Awesome on-the-fly restart), kill redshift to make sure - os.execute("pkill redshift") - -- Remove existing color adjustment - spawn("redshift -x") - -- (Re)start redshift - spawn("redshift") - running = true - active = true -end - -function redshift:toggle() - if running then - -- Sending -USR1 toggles redshift (See project website) - os.execute("pkill -USR1 redshift") - active = not active - else - init() +local redshift = { active = false, pid = nil } + +function redshift:start() + execute("pkill redshift") + awful.spawn.with_shell("redshift -x") -- clear adjustments + redshift.pid = awful.spawn.with_shell("redshift") + redshift.active = true + if type(redshift.update_fun) == "function" then + redshift.update_fun(redshift.active) end - update_fnct() end -function redshift:off() - if running and active then - redshift:toggle() - end -end - -function redshift:on() - if not active then - redshift:toggle() - end -end - -function redshift:is_active() - return active +function redshift:toggle() + async(string.format("%s -c 'ps -p %d -o pid='", awful.util.shell, redshift.pid), function(f) + if f and #f > 0 then -- redshift is running + -- Sending -USR1 toggles redshift (See project website) + execute("pkill -USR1 redshift") + redshift.active = not redshift.active + else -- not started or killed, (re)start it + redshift:start() + end + redshift.update_fun(redshift.active) + end) end -- Attach to a widget -- Provides a button which toggles redshift on/off on click --- @ param widget: widget to attach to --- @ param fnct: function to be run each time redshift is toggled (optional). --- Use it to update widget text or icons on status change. -function redshift:attach(widget, fnct) - update_fnct = fnct or function() end - if not attached then - init() - attached = true - update_fnct() +-- @param widget: Widget to attach to. +-- @param fun: Function to be run each time redshift is toggled (optional). +-- Use it to update widget text or icons on status change. +function redshift:attach(widget, fun) + redshift.update_fun = fun or function() end + if not redshift.pid then redshift:start() end + if widget then + widget:buttons(awful.util.table.join(awful.button({}, 1, function () redshift:toggle() end))) end - widget:buttons(awful.util.table.join( awful.button({}, 1, function () redshift:toggle() end) )) end -return setmetatable(redshift, { _call = function(_, ...) return create(...) end }) +return redshift