summaryrefslogtreecommitdiff
path: root/osk.lua
blob: e4c608d1d13fa6d2db950c7a22705b928ee4f442 (plain)
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  <gbe@ring0.de>
-- Hacked by: Adrian C. <anrxc@sysphere.org>
-- 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 })