forked from awailly/awesome
-
Notifications
You must be signed in to change notification settings - Fork 0
/
osk.lua
90 lines (81 loc) · 2.92 KB
/
osk.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
----------------------------------------------------
-- On Screen Keyboard for the awesome window manager
----------------------------------------------------
-- Coded by: Farhaven <[email protected]>
-- Hacked by: Adrian C. <[email protected]>
-- Licensed under the WTFPL version 2
-- * http://sam.zoy.org/wtfpl/COPYING
----------------------------------------------------
-- To use this module add:
-- require("osk")
-- to your rc.lua, and call it from a keybinding:
-- osk(position, screen)
--
-- Parameters:
-- position - optional, "bottom" by default
-- screen - optional, screen.count() by default
----------------------------------------------------
-- Grab environment
local util = require("awful.util")
local wibox = require("awful.wibox")
local button = require("awful.button")
local layout = require("awful.widget.layout")
local table = table
local ipairs = ipairs
local tostring = tostring
local setmetatable = setmetatable
local capi = {
widget = widget,
screen = screen,
fake_input = root.fake_input
}
-- OSK: On Screen Keyboard for the awesome window manager
module("osk")
-- Variable definitions
local kbd = {}
kbd.codes = {
q=24, w=25, e=26, r=27, t=28, z=52, u=30, i=31, o=32, p=33, ["."]=60,
a=38, s=39, d=40, f=41, g=42, h=43, j=44, k=45, l=46,
Caps=66, y=29, x=53, c=54, v=55, b=56, n=57, m=58, Spc=65, Ret=36, Del=22,
}
-- Create a chain of key widgets for an OSK row
local function create_button_row(...)
local widgets = { layout = layout.horizontal.flex }
for _, i in ipairs(arg) do
local w = capi.widget({ type = "textbox" })
w:margin({ top = 10, left = 10, right = 10, bottom = 10 })
w.border_width = 1
w.text_align = "center"
w.border_color = "#1E2320"
w.text = util.escape(tostring(i))
w:buttons(util.table.join(
button({ }, 1, nil, function ()
capi.fake_input("key_press", kbd.codes[i])
capi.fake_input("key_release", kbd.codes[i])
end)
))
table.insert(widgets, w)
end
return widgets
end
-- Create a wibox holding OSK rows and toggle its visibility
setmetatable(_M, { __call = function (_, pos, scr)
if not kbd.init then
kbd.box = wibox({
height = 100,
position = pos or "bottom",
screen = scr or capi.screen.count(),
fg = "#F0DFAF",
bg = "#4F4F4F",
widgets = {
{ create_button_row("q", "w", "e", "r", "t", "z", "u", "i", "o", "p", ".") },
{ create_button_row("a", "s", "d", "f", "g", "h", "j", "k", "l") },
{ create_button_row("Caps", "y", "x", "c", "v", "b", "n", "m", "Spc", "Ret", "Del") },
layout = layout.vertical.flex
}
})
kbd.init = true
kbd.box.visible = false
end
kbd.box.visible = not kbd.box.visible
end })