]> git.madduck.net Git - etc/awesome.git/blobdiff - widgets/contrib/redshift.lua

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

calendar: fix async hanging notifications; closes #289
[etc/awesome.git] / widgets / contrib / redshift.lua
index 38f1d83f48b26a91952072871b3e82c0fee18734..73cc100773197f17089116c2bdd5aac78c7fcefb 100644 (file)
@@ -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