From ce2d31cbdefdfa9a39e6faf1662521a6dff5e9f9 Mon Sep 17 00:00:00 2001 From: Emmanuel Lepage Vallee Date: Mon, 13 Oct 2014 17:14:33 -0400 Subject: [PATCH] prompt: Add the ability to add new shortcuts to awful.prompt Example: awful.prompt.run({ prompt = "Run: ", hooks = { {{ },"Return",function(command) local result = awful.util.spawn(command) mypromptbox[mouse.screen].widget:set_text(type(result) == "string" and result or "") return true end}, {{"Mod1" },"Return",function(command) local result = awful.util.spawn(command,{sticky=true}) mypromptbox[mouse.screen].widget:set_text(type(result) == "string" and result or "") return true end}, {{"Shift" },"Return",function(command) local result = awful.util.spawn(command,{ontop=true,floating=true}) mypromptbox[mouse.screen].widget:set_text(type(result) == "string" and result or "") return true end} } },...) --- lib/awful/prompt.lua | 67 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/lib/awful/prompt.lua b/lib/awful/prompt.lua index a542be439..413f3820f 100644 --- a/lib/awful/prompt.lua +++ b/lib/awful/prompt.lua @@ -224,7 +224,26 @@ end -- user editing. -- -- @tparam table args A table with optional arguments: `fg_cursor`, `bg_cursor`, --- `ul_cursor`, `prompt`, `text`, `selectall`, `font`, `autoexec`. +-- `ul_cursor`, `prompt`, `text`, `selectall`, `font`, `autoexec`, `hooks`. +-- @tparam[opt] table args.hooks The "hooks" argument uses a syntax similar to +-- `awful.key`. It will call a function for the matching modifiers + key. +-- It receives the command (widget text/input) as an argument. +-- hooks = { +-- -- Apply startup notification properties with Shift-Return. +-- {{"Shift" }, "Return", function(command) +-- mypromptbox[awful.screen.focused()]:spawn_and_handle_error( +-- command, {floating=true}) +-- end}, +-- -- Override default behavior of "Return": launch commands prefixed +-- -- with ":" in a terminal. +-- {{}, "Return", function(command) +-- if command:sub(1,1) == ":" then +-- command = terminal .. ' -e ' .. command:sub(2) +-- end +-- mypromptbox[awful.screen.focused()]:spawn_and_handle_error( +-- command) +-- end} +-- } -- @param textbox The textbox to use for the prompt. -- @param exe_callback The callback function to call with command as argument -- when finished. @@ -238,7 +257,8 @@ end -- @param[opt] changed_callback The callback function to call -- with command as argument when a command was changed. -- @param[opt] keypressed_callback The callback function to call --- with mod table, key and command as arguments when a key was pressed. +-- with mod table, key and command as arguments when a key was pressed. + function prompt.run(args, textbox, exe_callback, completion_callback, history_path, history_max, done_callback, changed_callback, keypressed_callback) local grabber local theme = beautiful.get() @@ -253,6 +273,7 @@ function prompt.run(args, textbox, exe_callback, completion_callback, history_pa local text = args.text or "" local font = args.font or theme.font local selectall = args.selectall + local hooks = {} search_term=nil @@ -262,20 +283,36 @@ function prompt.run(args, textbox, exe_callback, completion_callback, history_pa local cur_pos = (selectall and 1) or text:wlen() + 1 -- The completion element to use on completion request. local ncomp = 1 - if not textbox or not exe_callback then + if not textbox or not (exe_callback or args.hooks) then return end + + -- Build the hook map + for k,v in ipairs(args.hooks or {}) do + if #v == 3 then + local mods,key,callback = unpack(v) + if type(callback) == "function" then + hooks[key] = hooks[key] or {} + hooks[key][#hooks[key]+1] = v + else + assert("The hook's 3rd parameter has to be a function.") + end + else + assert("The hook has to have 3 parameters.") + end + end + textbox:set_font(font) textbox:set_markup(prompt_text_with_cursor{ text = text, text_color = inv_col, cursor_color = cur_col, cursor_pos = cur_pos, cursor_ul = cur_ul, selectall = selectall, prompt = prettyprompt }) - local exec = function() + local function exec(cb) textbox:set_markup("") history_add(history_path, command) keygrabber.stop(grabber) - exe_callback(command) + cb(command) if done_callback then done_callback() end end @@ -319,6 +356,22 @@ function prompt.run(args, textbox, exe_callback, completion_callback, history_pa end end + -- User defined cases + if hooks[key] then + for k,v in ipairs(hooks[key]) do + if #modifiers == #v[1] then + local match = true + for k2,v2 in ipairs(v[1]) do + match = match and mod[v2] + end + if match or #modifiers == 0 then + exec(v[3]) + return + end + end + end + end + -- Get out cases if (mod.Control and (key == "c" or key == "g")) or (not mod.Control and key == "Escape") then @@ -330,7 +383,7 @@ function prompt.run(args, textbox, exe_callback, completion_callback, history_pa elseif (mod.Control and (key == "j" or key == "m")) or (not mod.Control and key == "Return") or (not mod.Control and key == "KP_Enter") then - exec() + exec(exe_callback) -- We already unregistered ourselves so we don't want to return -- true, otherwise we may unregister someone else. return @@ -497,7 +550,7 @@ function prompt.run(args, textbox, exe_callback, completion_callback, history_pa key = "" -- execute if only one match found and autoexec flag set if matches and #matches == 1 and args.autoexec then - exec() + exec(exe_callback) return end else