Awesome WM 3.5 中是否有任何与 awful.prompt 相关的事件?

are there any events related to awful.prompt in Awesome WM 3.5?

我想知道是否可以从 awful.prompt 小部件捕获事件,例如当小部件被激活时的事件:

myprompt:run()

或者当用户按 Enter 来验证他的输入或 Esc 到 leave/quit 这个小部件时。

无法直接在 awful.widget.prompt 上连接信号,但可以在执行命令后向提示小部件指定一些指令:

在 awful/widget/prompt.lua 中 运行 函数启动 awful.prompt.run():

local function run(promptbox)
    return prompt.run({ prompt = promptbox.prompt },
                      promptbox.widget,
                      function (...)
                          local result = util.spawn(...)
                          if type(result) == "string" then
                              promptbox.widget:set_text(result)
                          end
                      end,
                      completion.shell,
                      util.getdir("cache") .. "/history")
end

一些参数是:

  • args A table 带有可选参数:fg_cursor、bg_cursor、ul_cursor、提示、文本、全选、字体、自动执行。
  • textbox 用于提示的文本框。
  • exe_callback 完成后以命令为参数调用的回调函数。
  • completion_callback 调用完成的回调函数。
  • history_path 可选参数:保存历史的文件路径,设置为nil则禁用历史
  • history_max 可选参数:设置历史文件的最大条目数,默认为50
  • done_callback 可选参数:无论提示是否被取消,始终不带参数调用的回调函数。
  • changed_callback可选参数:命令改变时以命令为参数调用的回调函数。
  • keypressed_callback

所以我只需要在提示框中使用 awful.prompt.run 并指定 done_callback

示例:wibox中的提示框。按下Mod4 + r键时显示wibox,执行命令时隐藏wibox:

awful.key({ modkey },            "r",     function () 
--promptlist is a table that contains wibox for each screen
if promptlist[mouse.screen].visible == false then
  promptlist[mouse.screen].visible=true
  awful.prompt.run({
    prompt = promptlist.prompt[mouse.screen].prompt },
    promptlist.prompt[mouse.screen].widget,
    function (...)
      local result = awful.util.spawn(...)
      if type(result) == "string" then
        promptlist.prompt[mouse.screen].widget:set_text(result)
        --promptlist.prompt table that contains prompt widget for each screen
      end
    end,
    awful.completion.shell,
    awful.util.getdir("cache") .. "/history",
    50,
    function()
      promptlist[mouse.screen].visible = false
    end
  )
else
  promptlist[mouse.screen].visible=false
end
end),