X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/ac6e3cf942eab4b09487da96ce9e162a09f2190b..a00417d8011690d977cbdab1f1378ec369e5f355:/widgets/contrib/redshift.lua?ds=sidebyside

diff --git a/widgets/contrib/redshift.lua b/widgets/contrib/redshift.lua
index 38f1d83..73cc100 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 <http://github.com/blueluke>
-                                                   
+                                                        
+     Licensed under GNU General Public License v2       
+      * (c) 2014, blueluke <http://github.com/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({ awful.util.shell, "-c", string.format("ps -p %d -o pid=", 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