61 lines
1.7 KiB
Lua
Executable File
61 lines
1.7 KiB
Lua
Executable File
local client = client
|
|
local awful = require("awful")
|
|
local util = require("awful.util")
|
|
|
|
local scratch = {}
|
|
local defaultRule = {instance = "scratch"}
|
|
|
|
-- Turn on this scratch window client (add current tag to window's tags,
|
|
-- then set focus to the window)
|
|
local function turn_on(c)
|
|
local current_tag = awful.tag.selected(c.screen)
|
|
ctags = {current_tag}
|
|
for k,tag in pairs(c:tags()) do
|
|
if tag ~= current_tag then table.insert(ctags, tag) end
|
|
end
|
|
c:tags(ctags)
|
|
c:raise()
|
|
client.focus = c
|
|
end
|
|
|
|
-- Turn off this scratch window client (remove current tag from window's tags)
|
|
local function turn_off(c)
|
|
local current_tag = awful.tag.selected(c.screen)
|
|
local ctags = {}
|
|
for k,tag in pairs(c:tags()) do
|
|
if tag ~= current_tag then table.insert(ctags, tag) end
|
|
end
|
|
c:tags(ctags)
|
|
end
|
|
|
|
function scratch.raise(cmd, rule)
|
|
local rule = rule or defaultRule
|
|
local function matcher(c) return awful.rules.match(c, rule) end
|
|
|
|
-- logic mostly copied form awful.client.run_or_raise, except we don't want
|
|
-- to change to or merge with scratchpad tag, just show the window
|
|
local clients = client.get()
|
|
local findex = util.table.hasitem(clients, client.focus) or 1
|
|
local start = util.cycle(#clients, findex + 1)
|
|
|
|
for c in awful.client.iterate(matcher, start) do
|
|
turn_on(c)
|
|
return
|
|
end
|
|
|
|
-- client not found, spawn it
|
|
util.spawn(cmd)
|
|
end
|
|
|
|
function scratch.toggle(cmd, rule, alwaysclose)
|
|
local rule = rule or defaultRule
|
|
|
|
if client.focus and awful.rules.match(client.focus, rule) then
|
|
turn_off(client.focus)
|
|
else
|
|
scratch.raise(cmd, rule)
|
|
end
|
|
end
|
|
|
|
return scratch
|