-- Dismal - not your average run prompt local awmtk2 = require("awmtk2") local wibox = require("wibox") local gears = require("gears") local awful = require("awful") local xdg_search = function(name,rlimit) local results = {} for k,v in pairs(xdg.apps) do if v.name:lower():find(name,nil,true) then table.insert(results,v) end if rlimit <= #results then break end end return results end return function(args) local style = awmtk2.create_style("dismal",awmtk2.default,args.style) local templates = awmtk2.create_template_lib("dismal",awmtk2.templates,args.templates) local t = awmtk2.build_templates(templates,style) local launchpad = awful.popup(t.popup({ t.container { t.textbox({ text = "", id = "inputbox" }), layout = wibox.layout.fixed.vertical, }, t.container({ id = "resultbox", layout = wibox.layout.fixed.vertical, spacing = style.container.spacing },{ bg = style.container.bg_highlight, forced_width = style.button.width or 180 }), t.textbox({ markup = "Enter - Run;\nCtrl+Enter - run in terminal" }), spacing = style.container.spacing, layout = wibox.layout.fixed.vertical })) local button_cache = gears.cache(function(name,exec,description,icon) -- beacause apparently cache doesn't allow nil values if icon == "" then icon = nil end local widget = wibox.widget(t.button(t.article({ icon = icon, resize = true, title = name, description = description, icon_size = (style.button.height and (style.button.height-style.container.margins)) or 30-style.container.margins }),{ forced_height = style.button.height or 30 })) local exec = exec:gsub("%%%w","") widget:buttons( gears.table.join( awful.button({},1,function() awful.spawn(exec) launchpad.visible = false -- i know it's deprecated, you literally give me no option awful.keygrabber.stop() end), awful.button({"Control"},1,function() awful.spawn({global.terminal,"-e",exec}) launchpad.visible = false awful.keygrabber.stop() end), awful.button({},3,function() awful.spawn(exec) end), awful.button({"Control"},3,function() awful.spawn({global.terminal,"-e",exec}) end) ) ) return widget end) local modifiers = {} local results_list = launchpad.widget:get_children_by_id("resultbox")[1] local input_field = launchpad.widget:get_children_by_id("inputbox")[1] root.keys(gears.table.join( root.keys(), awful.key({ global.modkey }, "r", function() launchpad.visible = true if launchpad.visible then awful.prompt.run { prompt = "Run: ", textbox = input_field, hooks = { { { "Control" }, "Return", function(cmd) awful.spawn({global.terminal, "-e", cmd}) end}, { { }, "Return", function(cmd) awful.spawn.with_shell(cmd) end}, { {}, 'Escape', function(cmd) input_field.markup = "" end}, }, done_callback = function() launchpad.visible = false end, changed_callback = function(command) local results = xdg_search(command,args.result_limit or 5) results_list:reset() for k,v in pairs(results) do results_list:insert(1,button_cache:get( v.name, v.exec, v.description or "", v.icon or "" )) end end, completion_callback = function(before,after,ncomp) return awful.completion.shell(before,after,ncomp,global.shell) end, history_path = "/tmp/.dismal_history", history_max = 50 } end end) )) return launchpad end