hot_corners

This commit is contained in:
BZ 2021-03-20 19:03:22 +01:00
parent 0539aae6aa
commit f769617c1b
2 changed files with 148 additions and 7 deletions

View File

@ -8,6 +8,7 @@ smart_borders for awesomewm
Features:
------------
- Full titlebar functionality without sacrificing space
- Hot corners
- Improved mouse controls
- Custom client menu
- Anti-aliased rounded corners
@ -97,8 +98,12 @@ Customization:
| `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) |
| `hot_corners` | {} | hot_corners definitions (see hot corners section)|
| `hot_corners_color` | "#00000000" | color of hot_corners |
| `hot_corners_width` | dpi(1) | width of hot_corners |
| `hot_corners_height` | dpi(1) | height of hot_corners |
Snapping:
Snapping:
------------
When `useless_gaps` are disabled it is very easy and fast to control clients by using the mouse since you only have to move your mouse to the edge of the screen to hit the client border.
However, when `useless_gaps` are enabled it can be frustrating to hit the border.
@ -125,7 +130,57 @@ awful.mouse.append_global_mousebindings({
```
Custom Menues:
Hot Corners:
------------
<p align="center">
<img src="https://s4.gifyu.com/images/hot_corner.gif">
</p>
Execute custom functions at the corners of your screen (e.g. appmenu, volume control, etc.).
```
hot_corners = {
["top_right"] = {
left_click = function()
require("naughty").notify({text = "left_click"})
end,
right_click = function()
require("naughty").notify({text = "right_click"})
end,
middle_click = function()
require("naughty").notify({text = "middle_click"})
end,
forward_click = function()
require("naughty").notify({text = "forward_click"})
end,
back_click = function()
require("naughty").notify({text = "back_click"})
end,
wheel_up = function()
require("naughty").notify({text = "wheel_up"})
end,
wheel_down = function()
require("naughty").notify({text = "wheel_down"})
end,
enter = function()
require("naughty").notify({text = "enter"})
end,
leave = function()
require("naughty").notify({text = "leave"})
end
}
}
```
Possible positions are "top_left", "top_right", "bottom_left", "bottom_right" or any `awful.placement` defintion (e.g. "centered").
Execution can also be scriped:
```
echo "awesome.emit_signal('hot_corners::top_right::left_click')" | awesome-client
```
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.
@ -168,13 +223,12 @@ custom_menu_entries = {
```
Custom Buttons:
Custom Buttons:
------------
Add a custom button to `buttons` (`marked` in this example):
```
buttons = { "minimize", "maximize", "close", "marked" }
```
Define the button:
@ -187,7 +241,7 @@ color_marked_normal = "#ffff00",
color_marked_hover = "#ff0000",
```
Integration / Signals:
Integration / Signals:
------------
It is possible to use `smart_borders` features in other modules by emitting signals.
@ -209,8 +263,7 @@ s.mytasklist = awful.widget.tasklist {
}
```
Example Configuration (as shown on top gif):
Example Configuration (as shown on top gif):
------------
```
require("smart_borders") {

View File

@ -217,6 +217,76 @@ local rounded_corner_shape = function(radius, position)
return nil
end
local add_hot_corner = function(args)
args = args or {}
local position = args.position or ""
local placement = awful.placement[position]
if not placement then
return
end
local actions = args.buttons or {}
local s = args.screen or awful.screen.focused()
local width = args.width
local height = args.height
local color = args.color
local corner = awful.popup({
screen = s,
placement = placement,
ontop = true,
border_width = 0,
minimum_height = height,
maximum_height = height,
minimum_width = width,
maximum_width = width,
bg = color,
widget = wibox.widget.background
})
-- this will run for every screen, so we have to make sure to only add one signal handler for every assigned signal
local must_connect_signal = (s.index == 1)
local function signal_name(pos, action)
return "hot_corners::" .. pos .. "::" .. action
end
local defs = {
{name = "left_click", button = 1},
{name = "middle_click", button = 2},
{name = "right_click", button = 3},
{name = "wheel_up", button = 4},
{name = "wheel_down", button = 5},
{name = "back_click", button = 8},
{name = "forward_click", button = 9}
}
local buttons = {}
for _, btn in ipairs(defs) do
if actions[btn.name] then
local signal = signal_name(position, btn.name)
table.insert(buttons, awful.button({}, btn.button, function()
awesome.emit_signal(signal)
end))
if must_connect_signal then
awesome.connect_signal(signal, actions[btn.name])
end
end
end
corner:buttons(buttons)
for _, action in pairs({"enter", "leave"}) do
if actions[action] then
local signal = signal_name(position, action)
corner:connect_signal("mouse::" .. action, function()
awesome.emit_signal(signal)
end)
if must_connect_signal then
awesome.connect_signal(signal, actions[action])
end
end
end
end
local function new(config)
local cfg = config or {}
local positions = cfg.positions or {"left", "right", "top", "bottom"}
@ -268,6 +338,11 @@ local function new(config)
local snapping_center_mouse = cfg.snapping_center_mouse or false
local snapping_max_distance = cfg.snapping_max_distance or nil
local hot_corners = cfg.hot_corners or {}
local hot_corners_color = cfg.hot_corners_color or "#00000000"
local hot_corners_width = cfg.hot_corners_width or dpi(1)
local hot_corners_height = cfg.hot_corners_height or dpi(1)
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!
@ -434,6 +509,19 @@ local function new(config)
end
}
for s in screen do
for pos, buttons in pairs(hot_corners) do
add_hot_corner({
buttons = buttons,
screen = s,
position = pos,
color = hot_corners_color,
width = hot_corners_width,
height = hot_corners_height
})
end
end
if layout ~= "fixed" and layout ~= "ratio" then
layout = "fixed"
end