aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/quarrel/persistent.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/quarrel/persistent.lua')
-rw-r--r--.config/awesome/quarrel/persistent.lua62
1 files changed, 62 insertions, 0 deletions
diff --git a/.config/awesome/quarrel/persistent.lua b/.config/awesome/quarrel/persistent.lua
new file mode 100644
index 0000000..2b15c89
--- /dev/null
+++ b/.config/awesome/quarrel/persistent.lua
@@ -0,0 +1,62 @@
+local gdebug = require "gears.debug"
+local qfs = require "quarrel.fs"
+local qjson = require "quarrel.json"
+
+awesome.register_xproperty("is_restart", "boolean")
+
+---@alias QPersistentValue string|number|table|nil|boolean
+
+---@class QuarrelPersistent
+local qpersistent = {}
+
+---@type table<string, QPersistentValue>
+local inner = {}
+
+--- Store a key-value pair in a persistent store
+---@param key string
+---@param value QPersistentValue
+function qpersistent.store(key, value)
+ inner[key] = value
+end
+
+--- Get a key-value pair in a persistent store
+---@param key string
+---@return QPersistentValue
+function qpersistent.get(key)
+ return inner[key]
+end
+
+--- Check if there was a restart
+---@return boolean
+function qpersistent.is_restart()
+ return awesome.get_xproperty "is_restart" ~= nil
+end
+
+do
+ local ok, content = pcall(qfs.read, "/tmp/qpersistent-store")
+
+ if not ok and not qpersistent.is_restart() then
+ gdebug.print_error "failed to read persistent store"
+ inner = {}
+ else
+ inner = qjson.decode(content)
+ end
+end
+
+awesome.connect_signal("exit", function(restart)
+ if not restart then
+ return
+ end -- we probably errored
+
+ local ok = pcall(qfs.write, qjson.encode(inner), "/tmp/qpersistent-store")
+ if not ok then
+ gdebug.print_error "failed to open persistent store"
+ return
+ end
+
+ if not qpersistent.is_restart() then
+ awesome.set_xproperty("is_restart", true)
+ end
+end)
+
+return qpersistent