awesome/lib/awful/mouse/finder.lua

171 lines
5.3 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-------------------------------------------------------------------------
--- Mouse finder for awful
--
-- Find the mouse pointer on the screen.
-- Mouse finder highlights the mouse cursor on the screen
-- To enable this feature, a `awful.mouse.finder` object needs to be bound to a
-- key:
--
-- mymousefinder = awful.mouse.finder()
--
-- Then bind the `find` function a key binding.
--
-- Some configuration variable can be set in the theme:
--
-- The mouse_finder display duration
--
-- theme.mouse_finder_timeout = 3
--
-- The animation speed
--
-- theme.mouse_finder_animate_timeout = 0.05
--
-- The mouse_finder radius
--
-- theme.mouse_finder_radius = 20
--
-- The growth factor
--
-- theme.mouse_finder_factor = 2
--
-- The mouse_finder color
--
-- theme.mouse_finder_color = "#ff0000"
--
-- @author Sébastien Gross <seb•ɱɩɲʋʃ•awesome•ɑƬ•chezwam•ɖɵʈ•org&gt
-- @copyright 2009 Sébastien Gross
-- @release @AWESOME_VERSION@
-- @module awful.mouse.finder
-------------------------------------------------------------------------
local mouse = mouse
local screen = screen
local timer = require("gears.timer")
local wibox = require("wibox")
local a_placement = require("awful.placement")
local a_wibox = require("awful.wibox")
local beautiful = require("beautiful")
local setmetatable = setmetatable
local finder = { mt = {} }
--- Mouse finder private data.
-- @table data
-- @field color Background color.
-- @field hide The hide() function.
-- @field show The show() function.
-- @field timer Timer to hide the mouse finder.
-- @field animate_timer Timer to animate the mouse finder.
-- @field wibox The mouse finder wibox show on the screen.
local data = setmetatable({}, { __mode = 'k' })
--- Place a mouse finder on the screen.
-- @param self A mouse finder object.
local function place(self)
a_placement.under_mouse(data[self].wibox)
a_placement.no_offscreen(data[self].wibox)
end
--- Animate a mouse finder.
-- @param self A mouse finder object.
local function animate(self)
local r = data[self].wibox:geometry().width
-- Check if the object should be grown or shrinked
-- the minimum radius is -data[self].factor because:
-- 1. factor is alway negative when shrinking
-- 2. geometry() does not handle negative values
if data[self].factor > 0 and r >= data[self].radius
or data[self].factor < 0 and r <= -data[self].factor then
data[self].factor = -data[self].factor
end
data[self].wibox:geometry({width = r + data[self].factor,
height = r + data[self].factor })
-- need -1 to the radius to draw a full circle
-- FIXME: The rounded_corners() API was removed
-- a_wibox.rounded_corners(data[self].wibox, (r + data[self].factor)/2 -1)
-- make sure the mouse finder follows the pointer. Uh!
place(self)
end
--- Show a mouse finder.
-- @param self The mouse finder to show.
local function show(self)
-- do nothing if the mouse finder is already shown
if data[self].wibox.visible then return end
if not data[self].timer.started then
data[self].wibox:geometry({width = data[self].radius, height = data[self].radius })
-- FIXME: The rounded_corners() API was removed
-- a_wibox.rounded_corners(data[self].wibox, data[self].radius/2 -1)
data[self].timer:start()
data[self].animate_timer:start()
end
place(self)
data[self].wibox.visible = true
end
--- Hide a mouse finder.
-- @param self The mouse finder to hide.
local function hide(self)
-- do nothing if the mouse finder is already hidden
if not data[self].wibox.visible then return end
if data[self].timer.started then
data[self].timer:stop()
data[self].animate_timer:stop()
end
data[self].wibox.visible = false
end
--- Load Default values.
-- @param self A mouse finder object.
local function set_defaults(self)
data[self].wibox.border_width = 0
data[self].wibox.opacity = beautiful.mouse_finder_opacity or 1
data[self].wibox:set_bg(beautiful.mouse_finder_color or beautiful.bg_focus or "#ff0000")
data[self].timeout = beautiful.mouse_finder_timeout or 3
data[self].animate_timeout = beautiful.mouse_finder_animate_timeout or 0.05
data[self].radius = beautiful.mouse_finder_radius or 20
data[self].factor = beautiful.mouse_finder_factor or 2
end
--- Find the mouse on the screen
-- @param self A mouse finder object.
function finder.find(self)
show(self)
end
--- Create a new mouse finder.
local function new()
local self = { }
-- private data
data[self] = {
wibox = wibox({ }),
show = function() show(self) end,
hide = function() hide(self) end,
animate = function() animate(self) end,
}
-- export functions
self.find = find
set_defaults(self)
-- setup the timer action only if needed
data[self].timer = timer { timeout = data[self].timeout }
data[self].animate_timer = timer { timeout = data[self].animate_timeout }
data[self].timer:connect_signal("timeout", data[self].hide)
data[self].animate_timer:connect_signal("timeout", data[self].animate)
data[self].wibox.ontop = true
data[self].wibox.visible = false
return self
end
function finder.mt:__call(...)
return new(...)
end
return setmetatable(finder, finder.mt)
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80