diff --git a/awesome/.config/awesome/rc.lua b/awesome/.config/awesome/rc.lua index db2363c..31a5e3c 100644 --- a/awesome/.config/awesome/rc.lua +++ b/awesome/.config/awesome/rc.lua @@ -13,7 +13,9 @@ local xrandr = require("xrandr") -- Notification library local naughty = require("naughty") local menubar = require("menubar") - +--load revelation plugin +local revelation=require("revelation") +--load hotkey_popup local hotkeys_popup = require("awful.hotkeys_popup").widget -- Enable hotkeys help widget for VIM and other apps -- when client with a matching name is opened: @@ -48,6 +50,10 @@ end -- Themes define colours, icons, font and wallpapers. beautiful.init(awful.util.getdir("config") .. "/themes/default/theme.lua") beautiful.useless_gap = 5 + +-- revelation init +revelation.init() +-- -- This is used later as the default terminal and editor to run. local terminal = "termite" @@ -336,6 +342,8 @@ globalkeys = gears.table.join( end,{description="toble wibox",group="awesome"}), awful.key({ modkey, }, "s", hotkeys_popup.show_help, {description="show help", group="awesome"}), + awful.key({ modkey, }, "e", revelation, + {descriotion="revelation shortcut",group="awesome"}), awful.key({ modkey, }, "Left", awful.tag.viewprev, {description = "view previous", group = "tag"}), awful.key({ modkey, }, "Right", awful.tag.viewnext, diff --git a/awesome/.config/awesome/revelation/LICENSE b/awesome/.config/awesome/revelation/LICENSE new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/awesome/.config/awesome/revelation/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/awesome/.config/awesome/revelation/README.md b/awesome/.config/awesome/revelation/README.md new file mode 100644 index 0000000..df3c259 --- /dev/null +++ b/awesome/.config/awesome/revelation/README.md @@ -0,0 +1,169 @@ +# revelation.lua + +Provides Mac OSX like 'Expose' view of all clients. + +This is a fork from [revelation](https://github.com/bioe007/awesome-revelation) +It is modified from the original revelation.lua for incorporating with awesome 3.5 or later. +It also have some features. + + +**Now master branch works for both master and stable awesome WM** + +## Changes since 2015-09-26 +When all clients are exposing, you can zoom (__Modkey + Shift + hintbox charater__ or __right button__ of the mouse) +or kill a client (__middle button__ of the mouse) and the position of hintboxes will be updated accordingly. + +## Changes since 2014-02-19 +* Now the revlation is able to handle the special clients(float, fullscreen or maximized etc.) +* When you select an minimized client, the revelation will un-minimized it and then focuse on it. +* Added an option to change character ordering + +## Changes after 2013-12-30 +* Now it is possible, in revelation.init({...}), to change the default settings of + revelation module. + +* Function `revelation(...)` now accept the parameter as a table `{rule={...}, is_excluded=..., +curr_tag_only=...}`. + +1. To add specify rules `revelation({rule={...},...})`. +2. To exclude the clients matched by the rules instead of including `revelation({rule={...}, +is_excluded=true})`. +3. `{...,curr_tag_only=true}` make the revelation only collect the client from current + tags. + + +## Changes from the original revelation +* Support awesome 3.5 or later + +* Add the support of multiple screens. Now multiple 'Expose' views will be shown + on the multiple screens at the same time. + +* The way of selecting and focusing the client was changed. The old way that is + navigating clients by pressing the keys "j, h, k, l" and then selecting the + client by pressing key "Enter" was deprecated. Now each client in the 'Expose' + views come with a letter surrounding by a hint box, you can select the client + by pressing the corresponding letter in the hint box. The idea and codes of this method + was copied from the module [hint](https://github.com/zackpete/hints). + +* Add zoom mode. Add the function of zooming the client by pressing the right + button of the mouse. + +* The unwanted clients can be excluded by the parameter`{rule={...}....}`. + +## Screenshot + +![screenshot](./screenshot.png) + + +## Usage + +### Installation + (From user's awesome configuration directory, usually ~/.config/awesome) + + 1. Clone the repository: + + git clone https://github.com/guotsuan/awesome-revelation revelation + + 2. Include it at the top of your rc.lua file: + `local revelation=require("revelation")` + + 3. **Important: Add `revelation.init()` after `beautiful.init()`** + + 3. Define a global keybinding (e. g. `ModKey + e`) for revelation in your rc.lua: + + globalkeys = awful.util.table.join( + awful.key({ modkey, }, "Left", awful.tag.viewprev ), + awful.key({ modkey, }, "Right", awful.tag.viewnext ), + awful.key({ modkey, }, "Escape", awful.tag.history.restore), + awful.key({ modkey, }, "e", revelation), + awful.key({ modkey, }, "j", + function () + awful.client.focus.byidx( 1) + if client.focus then client.focus:raise() end + end), + + **NOTE:** Always double check the key binding syntax against the version of + Awesome which you are using. + + 4. Restart Awesome (usually __Modkey + Control + r__) and try the keybinding __Modkey + e__. + + It should bring up all clients from the current tags on all screens and set the layout to fair. + You can focus clients with the __cursor__ keys, and then press the __left__ button to select, + or you can directly focus a client by pressing the corresponding key shown in the hint box. + Press the right mouse button to zoom the client or __Escape__ to abort. + +### Configuration + Revelation's configuration is done through the init() function + + There are three basic settings, shown with default values: + + -- The name of the tag created for the 'exposed' view + revelation.tag_name = 'Revelation' + + -- A table of matcher functions (used in client filtering) + revelation.exact = awful.rules.match + revelation.any = awful.rules.match_any + + -- Character order for selecting clients + revelation.charorder = "jkluiopyhnmfdsatgvcewqzx1234567890", + + The rule matching functions must conform to `awful.rules.match` prototypes. + + For client matching rules, we follow the same syntax as awful.rules expects. + If `rule.any == true`, then we call the `config.match.any` function. + +to change the settings, use: + + revelation.init({tag_name = ..., match = {...}, charorder = ...}) + + +### Examples + All clients: + + awful.key({modkey}, "e", revelation) + + To match all urxvt terminals: + + awful.key({modkey}, "e", function() + revelation({rule={class="URxvt"}}) + end) + To match clients with class 'foo' or 'bar': + + awful.key({modkey}, "e", function() + revelation({ + rule{class={"foo", "bar"}, + any=true} + }) + end) + + To exclude the clients, we set: + + awful.key({modkey}, "e", function() + revelation({rule={class="conky"}, is_excluded=true}) + end) + + To set only collect clients from current tag + + awful.key({modkey}, "e", function() + revelation({rule={class="conky"}, is_excluded=true, + curr_tag_only=true}) + end) + +## Credits + +### Maintenance + * Quan Guo + * Perry Hargrave + +### Contributions, many thanks! + * Daniel Hahler + * Yauhen Kirylau + * Nikola Petrov + +### Original authors + * Espen Wiborg + * Julien Danjou + + (c) 20013-2014 Quan Guo + (c) 2009-12 Perry Hargrave + (c) 2008 Espen Wiborg, Julien Danjou diff --git a/awesome/.config/awesome/revelation/init.lua b/awesome/.config/awesome/revelation/init.lua new file mode 100644 index 0000000..066bfe4 --- /dev/null +++ b/awesome/.config/awesome/revelation/init.lua @@ -0,0 +1,508 @@ +-- revelation.lua +-- +-- Library that implements Expose like behavior. +-- +-- @author Perry Hargrave resixian@gmail.com +-- @author Espen Wiborg espenhw@grumblesmurf.org +-- @author Julien Danjou julien@danjou.info +-- @auther Quan Guo guotsuan@gmail.com +-- +-- @copyright 2008 Espen Wiborg, Julien Danjou +-- @copyright 2015 Quan Guo +-- + + +local beautiful = require("beautiful") +local wibox = require("wibox") +local awful = require('awful') +local aw_rules = require('awful.rules') +local pairs = pairs +local setmetatable = setmetatable +local naughty = require("naughty") +local table = table +local clock = os.clock +local tostring = tostring +local capi = { + awesome = awesome, + tag = tag, + client = client, + keygrabber = keygrabber, + mousegrabber = mousegrabber, + mouse = mouse, + screen = screen +} + +-- disable for now. +-- It seems there is not way to pass err handling function into the delayed_call() + +local function debuginfo(message) + message = message or "No information available" + nid = naughty.notify({ text = tostring(message), timeout = 10 }) +end + +local delayed_call = (type(timer) ~= 'table' and require("gears.timer").delayed_call) + +local view_only_func +local toggle_tag_func +local jump_to_func + + +if type(awful.client.object) == 'table' then + view_only_func = function (tag) tag:view_only() end + toggle_tag_func = function (t, c) c:toggle_tag(t) end + jump_to_func = function(c) c:jump_to() end +else + view_only_func = function (tag) awful.tag.viewonly(tag) end + toggle_tag_func = function (t, c) awful.client.toggletag(t, c) end + jump_to_func = function(c) awful.client.jumpto(c) end +end + + +local hintbox = {} -- Table of letter wiboxes with characters as the keys +local hintindex = {} -- Table of visible clients with the hint letter as the keys + +local clients = {} --Table of clients to be exposed after fitlering +local clientData = {} -- table that holds the positions and sizes of floating clients + +local revelation = { + -- Name of expose tag. + tag_name = "Revelation", + + charorder = "jkluiopyhnmfdsatgvcewqzx1234567890", + + -- Match function can be defined by user. + -- Must accept a `rule` and `client` and return `boolean`. + -- The rule forms follow `awful.rules` syntax except we also check the + -- special `rule.any` key. If its true, then we use the `match.any` function + -- for comparison. + match = { + exact = aw_rules.match, + any = aw_rules.match_any + }, + property_to_watch={ + minimized = false, + fullscreen = false, + maximized_horizontal = false, + maximized_vertical = false, + sticky = false, + ontop = false, + above = false, + below = false, + }, + tags_status = {}, + is_excluded = false, + curr_tag_only = false, + font = "monospace 20", + fg = beautiful.fg_normal or "#DCDCCC", + bg = beautiful.bg_normal or "#000000", + border_color=beautiful.border_focus or "#DCDCCC", + border_width=beautiful.border_width or 2, + hintsize = (type(beautiful.xresources) == 'table' and beautiful.xresources.apply_dpi(50) or 60) +} + + + +-- Executed when user selects a client from expose view. +-- +-- @param restore Function to reset the current tags view. +local function selectfn(_, t, zt) + return function(c) + revelation.restore(t, zt) + -- Focus and raise + -- + if type(delayed_call) == 'function' then + capi.awesome.emit_signal("refresh") + end + + if awful.util.table.hasitem(hintindex, c) then + if c.minimized then + c.minimized = false + end + + jump_to_func(c) + end + end +end + +-- Tags all matching clients with tag t +-- @param rule The rule. Conforms to awful.rules syntax. +-- @param clients A table of clients to check. +-- @param t The tag to give matching clients. +local function match_clients(rule, _clients, t, is_excluded) + + local mfc = rule.any and revelation.match.any or revelation.match.exact + local mf = is_excluded and function(c,_rule) return not mfc(c,_rule) end or mfc + local flt + + for _, c in pairs(_clients) do + if mf(c, rule) then + -- Store geometry before setting their tags + clientData[c] = {} + clientData[c]["geometry"] = c:geometry() + flt = awful.client.property.get(c, "floating") + if flt ~= nil then + clientData[c]["floating"] = flt + awful.client.property.set(c, "floating", false) + end + + + for k,v in pairs(revelation.property_to_watch) do + clientData[c][k] = c[k] + c[k] = v + + end + toggle_tag_func(t, c) + if c:isvisible() then + table.insert(clients, c) + end + end + end + +end + + +-- Implement Exposé (ala Mac OS X). +-- +-- @param rule A table with key and value to match. [{class=""}] +function revelation.expose(args) + args = args or {} + local rule = args.rule or {} + local is_excluded = args.is_excluded or revelation.is_excluded + local curr_tag_only = args.curr_tag_only or revelation.curr_tag_only + + local t={} + local zt={} + + clients = {} + clientData = {} + + for scr=1,capi.screen.count() do + t[scr] = awful.tag.new({revelation.tag_name}, + scr, awful.layout.suit.fair)[1] + zt[scr] = awful.tag.new({revelation.tag_name.."_zoom"}, + scr, awful.layout.suit.fair)[1] + + if curr_tag_only then + match_clients(rule, awful.client.visible(scr), t[scr], is_excluded) + else + match_clients(rule, capi.client.get(scr), t[scr], is_excluded) + end + + view_only_func(t[scr]) + end + + if type(delayed_call) == 'function' then + capi.awesome.emit_signal("refresh") + end + -- No need for awesome WM 3.5.6: capi.awesome.emit_signal("refresh") + -- + local status, err=pcall(revelation.expose_callback, t, zt, clients) + + --revelation.expose_callback(t, zt) + if not status then + debuginfo('Oops!, something is wrong in revelation.expose_callback!') + + if err.msg then + debuginfo(err.msg) + end + + if err.code then + debuginfo('error code is '.. tostring(err.code)) + end + + revelation.restore(t, zt) + + end +end + + +function revelation.restore(t, zt) + for scr=1, capi.screen.count() do + awful.tag.history.restore(scr) + t[scr].screen = nil + end + + capi.keygrabber.stop() + capi.mousegrabber.stop() + + for _, c in pairs(clients) do + if clientData[c] then + for k,v in pairs(clientData[c]) do + if v ~= nil then + if k== "geometry" then + c:geometry(v) + elseif k == "floating" then + awful.client.property.set(c, "floating", v) + else + c[k]=v + end + end + end + end + end + + for scr=1, capi.screen.count() do + t[scr].activated = false + zt[scr].activated = false + end + + for i,j in pairs(hintindex) do + hintbox[i].visible = false + end +end + +local function hintbox_display_toggle(c, show) + for char, thisclient in pairs(hintindex) do + if char and char ~= c then + hintindex[char] = thisclient + if show then + hintbox[char].visible = true + else + hintbox[char].visible = false + end + + end + end +end + +local function hintbox_pos(char) + local client = hintindex[char] + local geom = client:geometry() + hintbox[char].x = math.floor(geom.x + geom.width/2 - revelation.hintsize/2) + hintbox[char].y = math.floor(geom.y + geom.height/2 - revelation.hintsize/2) +end + + +function revelation.expose_callback(t, zt, clientlist) + + hintindex = {} + for i,thisclient in pairs(clientlist) do + -- Move wiboxes to center of visible windows and populate hintindex + local char = revelation.charorder:sub(i,i) + if char and char ~= '' then + hintindex[char] = thisclient + hintbox_pos(char) + hintbox[char].visible = true + hintbox[char].screen = thisclient.screen + end + end + + local zoomed = false + local zoomedClient = nil + local key_char_zoomed = nil + + capi.keygrabber.run(function (mod, key, event) + local c + if event == "release" then return true end + + if awful.util.table.hasitem(mod, "Shift") then + key_char = string.lower(key) + c = hintindex[key_char] + if not zoomed and c ~= nil then + --debuginfo(c.screen) + view_only_func(zt[c.screen.index or c.screen]) + toggle_tag_func(zt[c.screen.index or c.screen], c) + zoomedClient = c + key_char_zoomed = key_char + zoomed = true + -- update the position of this hintbox, since it is zoomed + if type(delayed_call) == 'function' then + capi.awesome.emit_signal("refresh") + end + hintbox_pos(key_char) + hintbox_display_toggle(key_char, false) + + + elseif zoomedClient ~= nil then + awful.tag.history.restore(zoomedClient.screen.index or zoomedClient.screen) + toggle_tag_func(zt[zoomedClient.screen.index or zoomedClient.screen], zoomedClient) + hintbox_display_toggle(key_char_zoomed, true) + if type(delayed_call) == 'function' then + capi.awesome.emit_signal("refresh") + end + hintbox_pos(key_char_zoomed) + + zoomedClient = nil + zoomed = false + key_char_zoomed = nil + end + end + + if hintindex[key] then + --client.focus = hintindex[key] + --hintindex[key]:raise() + + selectfn(restore,t, zt)(hintindex[key]) + + for i,j in pairs(hintindex) do + hintbox[i].visible = false + end + + return false + end + + if key == "Escape" then + if zoomedClient ~= nil then + awful.tag.history.restore(zoomedClient.screen) + toggle_tag_func(zt[zoomedClient.screen.index or zoomedClient.screen], zoomedClient) + hintbox_display_toggle(string.lower(key), true) + if type(delayed_call) == 'function' then + capi.awesome.emit_signal("refresh") + end + hintbox_pos(key_char_zoomed) + + zoomedClient = nil + zoomed = false + else + for i,j in pairs(hintindex) do + hintbox[i].visible = false + end + revelation.restore(t, zt) + return false + end + end + + return true + end) + + local pressedMiddle = false + + local lastClient = nil + capi.mousegrabber.run(function(mouse) + local c + + if type(awful.client.object) == 'table' then + c = capi.mouse.current_client + else + c = awful.mouse.client_under_pointer() + end + if c then + lastClient = c + else + local current_wibox = capi.mouse.current_wibox + if current_wibox then + for i = 1, #revelation.charorder do + local char = revelation.charorder:sub(i,i) + if hintbox[char] == current_wibox then + c = lastClient + break + end + end + end + end + local key_char = awful.util.table.hasitem(hintindex, c) + if mouse.buttons[1] == true then + if c ~= nil then + selectfn(restore, t, zt)(c) + + for i,j in pairs(hintindex) do + hintbox[i].visible = false + end + return false + else + return true + end + elseif mouse.buttons[2] == true and pressedMiddle == false and c ~= nil then + -- is true whenever the button is down. + pressedMiddle = true + -- extra variable needed to prevent script from spam-closing windows + -- + if zoomed == true and zoomedClient ~=nil then + awful.tag.history.restore(zoomedClient.screen.index or zoomedClient.screen) + toggle_tag_func(zt[zoomedClient.screen.index or zoomedClient.screen], zoomedClient) + end + c:kill() + hintbox[key_char].visible = false + hintindex[key_char] = nil + local pos = awful.util.table.hasitem(clients, c) + table.remove(clients, pos) + + + if zoomed == true and zoomedClient ~=nil then + hintbox_display_toggle(key_char_zoomed, true) + zoomedClient = nil + zoomed = false + key_char_zoomed = nil + end + + return true + + elseif mouse.buttons[2] == false and pressedMiddle == true then + pressedMiddle = false + for key, _ in pairs(hintindex) do + hintbox_pos(key) + end + elseif mouse.buttons[3] == true then + if not zoomed and c ~= nil then + view_only_func(zt[c.screen.index or c.screen]) + toggle_tag_func(zt[c.screen.index or c.screen], c) + if key_char ~= nil then + hintbox_display_toggle(key_char, false) + if type(delayed_call) == 'function' then + capi.awesome.emit_signal("refresh") + end + hintbox_pos(key_char) + end + zoomedClient = c + zoomed = true + key_char_zoomed = key_char + elseif zoomedClient ~= nil then + awful.tag.history.restore(zoomedClient.screen.index or zoomedClient.screen) + toggle_tag_func(zt[zoomedClient.screen.index or zoomedClient.screen], zoomedClient) + hintbox_display_toggle(key_char_zoomed, true) + if type(delayed_call) == 'function' then + capi.awesome.emit_signal("refresh") + end + hintbox_pos(key_char_zoomed) + + zoomedClient = nil + zoomed = false + key_char_zoomed = nil + end + end + + return true + --Strange but on my machine only fleur worked as a string. + --stole it from + --https://github.com/Elv13/awesome-configs/blob/master/widgets/layout/desktopLayout.lua#L175 + end,"fleur") + +end + +-- Create the wiboxes, but don't show them +-- +function revelation.init(args) + local letterbox = {} + + args = args or {} + + revelation.tag_name = args.tag_name or revelation.tag_name + if args.match then + revelation.match.exact = args.match.exact or revelation.match.exact + revelation.match.any = args.match.any or revelation.match.any + end + + revelation.charorder = args.charorder or revelation.charorder + + for i = 1, #revelation.charorder do + local char = revelation.charorder:sub(i,i) + hintbox[char] = wibox({ + fg=revelation.fg, + bg=revelation.bg, + border_color=revelation.border_color, + border_width=revelation.border_width + }) + hintbox[char].ontop = true + hintbox[char].width = revelation.hintsize + hintbox[char].height = revelation.hintsize + letterbox[char] = wibox.widget.textbox() + letterbox[char]:set_markup(char.upper(char)) + letterbox[char]:set_font(revelation.font) + letterbox[char]:set_align("center") + hintbox[char]:set_widget(letterbox[char]) + end +end + +setmetatable(revelation, { __call = function(_, ...) return revelation.expose(...) end }) + +return revelation diff --git a/awesome/.config/awesome/revelation/screenshot.png b/awesome/.config/awesome/revelation/screenshot.png new file mode 100644 index 0000000..9cd759e Binary files /dev/null and b/awesome/.config/awesome/revelation/screenshot.png differ