summaryrefslogtreecommitdiffstats
path: root/.config/awesome/ext.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/ext.lua')
-rw-r--r--.config/awesome/ext.lua81
1 files changed, 81 insertions, 0 deletions
diff --git a/.config/awesome/ext.lua b/.config/awesome/ext.lua
new file mode 100644
index 0000000..e7bdf00
--- /dev/null
+++ b/.config/awesome/ext.lua
@@ -0,0 +1,81 @@
+local client=client
+local awful=awful
+local pairs=pairs
+local table=table
+
+module("ext")
+
+-- Returns true if all pairs in table1 are present in table2
+function match(table1, table2)
+ for k, v in pairs(table1) do
+ if table[k] ~= v and not table2[k]:find(v) then
+ return false
+ end
+ end
+
+ return true
+end
+
+--- Spawns cmd if no client can be found matching properties
+-- If such a client can be found, pop to first tag where it is
+-- visible, and give it focus
+function run_or_raise(cmd, properties)
+ local clients = client.get()
+ local focused = awful.client.next(0)
+ local findex = 0
+ local matched_clients = { }
+ local n = 0
+
+ for i, c in pairs(clients) do
+ -- make an array of matched clients
+ if match(properties, c) then
+ n = n + 1
+ matched_clients[n] = c
+
+ if n == focused then
+ findex = n
+ end
+ end
+ end
+
+ if n > 0 then
+ local c = matched_clients[1]
+
+ -- if the focused window matched switch focus to next in list
+ if 0 < findex and findex < n then
+ c = matched_clients[findex + 1]
+ end
+
+ local ctags = c:tags()
+
+ if table.getn(ctags) == 0 then
+ -- ctags is empty, show client on current tag
+ local curtag = awful.tag.selected()
+ awful.client.movetotag(curtag, c)
+ else
+ -- Otherwise, pop to first tag client is visible on
+ awful.tag.viewonly(ctags[1])
+ end
+
+ -- And then focus the client
+ client.focus = c
+ c:raise()
+ awful.screen.focus(c.screen)
+ return
+ end
+ awful.util.spawn(cmd)
+end
+
+function prev_client()
+ awful.client.focus.history.previous()
+ if client.focus then
+ client.focus:raise()
+ end
+end
+
+function next_client()
+ awful.client.focus.byidx(1)
+ if client.focus then
+ client.focus:raise()
+ end
+end