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