You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
6.4 KiB
163 lines
6.4 KiB
-- This file is part of Reno desktop.
|
|
--
|
|
-- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
--
|
|
-- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see <https://www.gnu.org/licenses/>.
|
|
local awful = require("awful")
|
|
local gears = require("gears")
|
|
local ask = require("asckey")
|
|
local fs = gears.filesystem
|
|
|
|
_G.MacroTimer = {}
|
|
_G.MacroActive = {}
|
|
|
|
local mconf = config.macros
|
|
|
|
local macro_loop = false
|
|
local macro_delay = mconf.step or 10
|
|
local macro_base_dir = mconf.base_dir or (root_path.."/macros/")
|
|
|
|
if not fs.dir_readable(root_path.."/macros/") then
|
|
fs.make_directories(root_path.."/macros/")
|
|
end
|
|
|
|
awesome.connect_signal("macro::record",function(filename)
|
|
if not filename then return end
|
|
local timeline = "loop="..tostring(macro_loop).."\n"..
|
|
"delay="..tostring(macro_delay).."\n"
|
|
require("naughty").notify({title =
|
|
"Recording macro "..
|
|
tostring(filename)..
|
|
" (Escape to stop)"
|
|
})
|
|
awful.keygrabber {
|
|
autostart = true,
|
|
stop_key = "Escape",
|
|
keypressed_callback = function(self, mod, key, event)
|
|
if key == " " then
|
|
key = "space"
|
|
end
|
|
timeline = timeline.."+"..key.."\n"
|
|
end,
|
|
keyreleased_callback = function(self, mod, key, event)
|
|
if key == " " then
|
|
key = "space"
|
|
end
|
|
timeline = timeline.."-"..key.."\n"
|
|
end,
|
|
stop_callback = function()
|
|
local macrofile = io.open(filename,"w")
|
|
if macrofile then
|
|
macrofile:write(timeline)
|
|
macrofile:close()
|
|
require("naughty").notify({title="Macro saved as "..tostring(filename)})
|
|
else
|
|
require("naughty").notify({title="Failed to save macro"})
|
|
end
|
|
-- For some reason after keygrabber is done input doesn't work
|
|
gears.timer.delayed_call(function()
|
|
awful.keygrabber:stop()
|
|
end)
|
|
end
|
|
}
|
|
end)
|
|
|
|
awesome.connect_signal("macro::play",function(filename)
|
|
if (not filename) or (not fs.file_readable(filename)) then
|
|
return
|
|
end
|
|
local macrofile = io.open(filename,"r")
|
|
local macrodata = macrofile:read("*a")
|
|
macrofile:close()
|
|
local macro = {}
|
|
local step = 0
|
|
macrodata:gsub("([^\n]+)",function(line)
|
|
table.insert(macro,line)
|
|
end)
|
|
local delay = tonumber(macro[2]:match("delay=(%d+)"))
|
|
_G.MacroActive[filename] = (macro[1]:match("loop=(.+)") == "true")
|
|
table.remove(macro,2)
|
|
table.remove(macro,1)
|
|
local macro_length = #macro
|
|
_G.MacroTimer[filename] = gears.timer.start_new((1/1000)*delay,function()
|
|
step = step + 1
|
|
local instruction = macro[step]
|
|
local event = (instruction:match("^%+") and "key_press") or "key_release"
|
|
root.fake_input(event,instruction:match("^[%+%-](.*)"))
|
|
if (step == macro_length) and (_G.MacroActive[filename]) then
|
|
step = 0
|
|
return true
|
|
elseif (step < macro_length) then
|
|
return true
|
|
else
|
|
_G.MacroTimer[filename] = nil
|
|
_G.MacroActive[filename] = nil
|
|
return false
|
|
end
|
|
end)
|
|
end)
|
|
|
|
|
|
root.keys(gears.table.join(
|
|
root.keys(),
|
|
ask.k(":macro.record_1", function()
|
|
awesome.emit_signal("macro::record",macro_base_dir.."macro1")
|
|
end,{group="macros",description="Record macro 1"}),
|
|
ask.k(":macro.record_2", function()
|
|
awesome.emit_signal("macro::record",macro_base_dir.."macro2")
|
|
end,{group="macros",description="Record macro 2"}),
|
|
ask.k(":macro.record_3", function()
|
|
awesome.emit_signal("macro::record",macro_base_dir.."macro3")
|
|
end,{group="macros",description="Record macro 3"}),
|
|
ask.k(":macro.record_4", function()
|
|
awesome.emit_signal("macro::record",macro_base_dir.."macro4")
|
|
end,{group="macros",description="Record macro 4"}),
|
|
ask.k(":macro.record_5", function()
|
|
awesome.emit_signal("macro::record",macro_base_dir.."macro5")
|
|
end,{group="macros",description="Record macro 5"}),
|
|
ask.k(":macro.play_1", function()
|
|
if not _G.MacroActive[macro_base_dir.."macro1"] then
|
|
awesome.emit_signal("macro::play",macro_base_dir.."macro1")
|
|
else
|
|
_G.MacroActive[macro_base_dir.."macro1"] = false
|
|
end
|
|
end,{group="macros",description="Play macro 1",release_pre=true}),
|
|
ask.k(":macro.play_2", function()
|
|
if not _G.MacroActive[macro_base_dir.."macro2"] then
|
|
awesome.emit_signal("macro::play",macro_base_dir.."macro2")
|
|
else
|
|
_G.MacroActive[macro_base_dir.."macro2"] = false
|
|
end
|
|
end,{group="macros",description="Play macro 2",release_pre=true}),
|
|
ask.k(":macro.play_3", function()
|
|
if not _G.MacroActive[macro_base_dir.."macro3"] then
|
|
awesome.emit_signal("macro::play",macro_base_dir.."macro3")
|
|
else
|
|
_G.MacroActive[macro_base_dir.."macro3"] = false
|
|
end
|
|
end,{group="macros",description="Play macro 3",release_pre=true}),
|
|
ask.k(":macro.play_4", function()
|
|
if not _G.MacroActive[macro_base_dir.."macro4"] then
|
|
awesome.emit_signal("macro::play",macro_base_dir.."macro4")
|
|
else
|
|
_G.MacroActive[macro_base_dir.."macro4"] = false
|
|
end
|
|
end,{group="macros",description="Play macro 4",release_pre=true}),
|
|
ask.k(":macro.play_5", function()
|
|
if not _G.MacroActive[macro_base_dir.."macro5"] then
|
|
awesome.emit_signal("macro::play",macro_base_dir.."macro5")
|
|
else
|
|
_G.MacroActive[macro_base_dir.."macro5"] = false
|
|
end
|
|
end,{group="macros",description="Play macro 5",release_pre=true}),
|
|
ask.k(":macro.loop",function()
|
|
macro_loop = not macro_loop
|
|
if macro_loop then
|
|
require("naughty").notify({title="Macro looping turned on"})
|
|
else
|
|
require("naughty").notify({title="Macro looping turned off"})
|
|
end
|
|
end,{group="macros",description="turn looping on/off"})
|
|
))
|