vincentbernat.i3wm-configur.../rc/signals.lua
Vincent Bernat f04a53528f signals: put cursor in the middle left of the focused window
Previously, cursor was put in the upper left corner but there are so
many stuff that may display tooltips at this place...
2015-08-15 10:38:37 +02:00

90 lines
2.9 KiB
Lua

local icons = loadrc("icons", "vbe/icons")
-- Did we get the focus because of sloppy focus?
local focus_from_mouse = false
local function mouse_follow_focus(c)
-- Move the mouse to the top left corner
if c.type ~= "dialog" then
local cc = c:geometry()
local _, x, y = awful.mouse.client.corner(nil, "top_left")
if x and y then
mouse.coords({ x = x + 20 , y = y + cc.height / 2 }, true)
end
end
end
-- Signal function to execute when a new client appears.
client.add_signal("manage",
function (c, startup)
-- Enable sloppy focus
c:add_signal("mouse::enter",
function(c)
-- If magnifier suit, only give sloppy focus to master window
if ((awful.layout.get(c.screen) ~= awful.layout.suit.magnifier or
awful.client.getmaster(c.screen) == c)
-- Don't give focus to a client already having focus
and client.focus ~= c
-- Don't give focus to a window that does not want focus
and awful.client.focus.filter(c)) then
focus_from_mouse = c
client.focus = c
end
end)
-- If a window change its geometry, track it with the mouse
c:add_signal("property::geometry",
function()
-- Check if the current focused client is our
if client.focus ~=c then return end
-- Check that no button is pressed
local buttons = mouse.coords().buttons
for _, state in pairs(buttons) do
if state then return end
end
mouse_follow_focus(c)
end)
-- If this is Spotify and it sets the urgent property, unset it
if c.instance == "spotify" then
c.urgent = false
c:add_signal("property::urgent",
function()
c.urgent = false
end)
end
-- Setup icon if none exists
if not c.icon then
local icon = icons.lookup({ name = { c.class, c.instance },
type = "apps" })
if icon then
c.icon = image(icon)
end
end
if not startup then
-- Put windows in a smart way, only if they does not set an initial position.
if not c.size_hints.user_position and not c.size_hints.program_position then
awful.placement.no_overlap(c)
awful.placement.no_offscreen(c)
end
c:raise()
end
end)
client.add_signal("focus", function(c)
c.border_color = beautiful.border_focus
c.opacity = 1
if focus_from_mouse ~= c then
mouse_follow_focus(c)
c:raise()
end
focus_from_mouse = false
end)
client.add_signal("unfocus", function(c)
c.border_color = beautiful.border_normal
if not c.fullscreen then
c.opacity = 0.85
end
end)