vincentbernat.i3wm-configur.../rc/signals.lua
Vincent Bernat ad9f9852b3 signals: mouse follows focus except when focus followed mouse
We generalize "mouse follows focus" by keeping the mouse in the top
left corner of any focused window except when the window has been
focused because of sloppy focus.
2012-07-23 22:05:33 +02:00

56 lines
1.7 KiB
Lua

local icons = loadrc("icons", "vbe/icons")
-- Did we get the focus because of sloppy focus?
local focus_from_mouse = false
-- 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 ((awful.layout.get(c.screen) ~= awful.layout.suit.magnifier or awful.client.getmaster(c.screen) == c)
and awful.client.focus.filter(c)) then
focus_from_mouse = true
client.focus = c
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
end
end)
client.add_signal("focus", function(c)
c.border_color = beautiful.border_focus
c.opacity = 1
-- Move the mouse to the top left corner
local margin = 10
if c.screen == mouse.screen and not focus_from_mouse then
local cc = c:geometry()
local _, x, y = awful.mouse.client.corner(nil, "top_left")
if x and y and cc.width > margin * 2 and cc.height > margin * 2 then
mouse.coords({ x = x + margin , y = y + margin }, true)
end
end
focus_from_mouse = false
end)
client.add_signal("unfocus", function(c)
c.border_color = beautiful.border_normal
c.opacity = 0.85
end)