From b771ae1e53421c71fee45aca031a3eb56df63fee Mon Sep 17 00:00:00 2001 From: BZ Date: Sun, 11 Oct 2020 12:57:15 +0200 Subject: [PATCH] custom menu entries --- README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ init.lua | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 546a9f7..584c9fd 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Customization: | `snapping` | false | enable snapping mode (see snapping section) | | `snapping_max_distance` | nil | maximum snapping distance (mouse to client border) | | `snapping_center_mouse` | false | center mouse on client when snapping | +| `custom_menu_entries` | {} | list of custom menu entries (see custom menues section) | Snapping: ------------ @@ -124,6 +125,48 @@ awful.mouse.append_global_mousebindings({ ``` +Custom Menues: +------------ +It is possible to add your own menu entries. Entries can be added globally or only for certain classes based on regex matching. + +``` +custom_menu_entries = { + ["Chromium"] = { + { + text = "toggle tabbar", + func = function(c) + keygrabber.stop() + root.fake_input("key_press", "F11") + awful.spawn.easy_async_with_shell("sleep 0.15", function() + c.fullscreen = false + end) + root.fake_input("key_release", "F11") + end + } + }, + -- for every client: + [".*"] = { + { + text = "toggle top overlay", + func = function(c) + if c.floating and c.ontop and c.sticky then + c.floating = false + c.ontop = false + c.sticky = false + else + c.floating = true + c.width = 640 + c.height = 360 + c.ontop = true + c.sticky = true + awful.placement.top_right(c) + end + end + } + } +} +``` + Custom Buttons: ------------ diff --git a/init.lua b/init.lua index 2244ff2..a4082e0 100644 --- a/init.lua +++ b/init.lua @@ -3,7 +3,6 @@ local gears = require("gears") local awful = require("awful") local theme = require("beautiful") local naughty = require("naughty") - local dpi = theme.xresources.apply_dpi local module = {} @@ -25,6 +24,14 @@ local function list2map(list) return set end +local function len(T) + local count = 0 + for _ in pairs(T) do + count = count + 1 + end + return count +end + local function doubleclicked(obj) if obj.doubleclick_timer then obj.doubleclick_timer:stop() @@ -84,7 +91,7 @@ local menu_move2screen = function(c) return nil end -function module.menu_client(c) +function module.menu_client(custom_menu, c) local list = {} local list_tags = menu_move2tag(c) @@ -160,6 +167,39 @@ function module.menu_client(c) end }) + if custom_menu and len(custom_menu) > 0 then + local function generate_menu_entry(e) + if e and type(e) == 'table' and e.text then + local text = "" + if type(e.text) == 'string' then + text = e.text + end + if type(e.text) == 'function' then + text = e.text(c) + end + return { + text, + function() + if e.func then + e.func(c) + end + end + } + end + end + + for regex, entries in pairs(custom_menu) do + if string.find(c.class, regex) then + for _, e in ipairs(entries) do + local menu_entry = generate_menu_entry(e) + if menu_entry then + table.insert(list, menu_entry) + end + end + end + end + end + return list end @@ -229,6 +269,8 @@ local function new(config) local show_button_tooltips = cfg.show_button_tooltips or false -- tooltip might intercept mouseclicks; not recommended! local show_title_tooltip = cfg.show_title_tooltip or false -- might fuck up sloppy mouse focus; not recommended! + + local custom_menu_entries = cfg.custom_menu_entries or {} menu_selection_symbol = cfg.menu_selection_symbol or " ✔" local layout = cfg.layout or "fixed" -- "fixed" | "ratio" @@ -256,7 +298,7 @@ local function new(config) if c.client_menu then c.client_menu:hide() end - c.client_menu = awful.menu(module.menu_client(c)) + c.client_menu = awful.menu(module.menu_client(custom_menu_entries, c)) c.client_menu:toggle() end @@ -377,7 +419,7 @@ local function new(config) color_hover = color_top_hover, button_size = button_top_size, action = function(cl) - cl.top = not cl.top + cl.ontop = not cl.ontop end }