awesomewm/modalbind.lua

150 lines
3.4 KiB
Lua
Raw Normal View History

local M = {}
local inited = false
local modewidget = {}
local modewibox = { screen = -1 }
--local functions
local ensure_init, set_default, update_settings, show_box, hide_box
M.grab = function(keymap, stay_in_mode)
if keymap.name then show_box(mouse.screen, keymap) end
keygrabber.run(function(mod, key, event)
if key == "Escape" then
keygrabber.stop()
hide_box();
return true
end
if event == "release" then return true end
if keymap[key] then
keygrabber.stop()
if stay_in_mode then
2012-12-03 09:03:34 +00:00
keymap[key](key)
M.grab(keymap, true)
else
hide_box()
2012-12-03 09:03:34 +00:00
keymap[key](key)
return true
end
end
return true
end)
end
-- Partially adapted from Obvious Widget Library module "popup_run_prompt" --
-- Original Author: Andrei "Garoth" Thorp --
-- Copyright 2009 Andrei "Garoth" Thorp --
local defaults = {}
-- Default is 1 for people without compositing
defaults.opacity = 1.0
defaults.height = 22
defaults.border_width = 1
defaults.x_offset = 18
defaults.show_options = true
-- Clone the defaults for the used settings
local settings = {}
for key, value in pairs(defaults) do
settings[key] = value
end
M.set_opacity = function (amount)
settings.opacity = amount or defaults.opacity
update_settings()
end
M.set_height = function (amount)
settings.height = amount or defaults.height
update_settings()
end
M.set_border_width = function (amount)
settings.border_width = amount or defaults.border_width
update_settings()
end
M.set_x_offset = function (amount)
settings.x_offset = amount or defaults.x_offset
update_settings()
end
M.set_show_options = function (bool)
settings.show_options = bool
end
ensure_init = function ()
if inited then
return
end
inited = true
for s = 1, screen.count() do
modewidget[s] = widget({
type = "textbox",
name = "modewidget" .. s,
align = "center"
})
modewibox[s] = wibox({
fg = beautiful.fg_normal,
bg = beautiful.bg_normal,
border_width = settings.border_width,
border_color = beautiful.bg_focus,
})
set_default(s)
modewibox[s].visible = false
modewibox[s].screen = s
modewibox[s].ontop = true
-- Widgets for prompt wibox
modewibox[s].widgets = {
modewidget[s],
layout = awful.widget.layout.vertical.center
}
end
end
set_default = function (s)
modewibox[s]:geometry({
width = modewidget[s].extents(modewidget[s]).width,
height = settings.height,
x = settings.x_offset < 0 and
screen[s].geometry.x - width + settings.x_offset or
settings.x_offset,
y = screen[s].geometry.y + screen[s].geometry.height - settings.height
})
end
update_settings = function ()
for s, value in ipairs(modewibox) do
value.border_width = settings.border_width
set_default(s)
value.opacity = settings.opacity
end
end
show_box = function (s, map)
ensure_init()
modewibox.screen = s
local label = " -- " .. map.name .. " -- "
if settings.show_options then
for key in pairs(map) do
if key ~= "name" then label = label .. " " .. key end
end
end
modewidget[s].text = label
set_default(s)
modewibox[s].visible = true
end
hide_box = function ()
local s = modewibox.screen
if s ~= -1 then modewibox[s].visible = false end
end
return M