From 4d1ca7bc18064fdefc6cbe99afff6eb10a3443ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gross?= Date: Thu, 10 Sep 2009 12:30:11 +0200 Subject: [PATCH] awful: Add a mouse finder capability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sébastien Gross Signed-off-by: Julien Danjou --- lib/awful/mouse/finder.lua.in | 150 ++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 lib/awful/mouse/finder.lua.in diff --git a/lib/awful/mouse/finder.lua.in b/lib/awful/mouse/finder.lua.in new file mode 100644 index 000000000..c72b45bd3 --- /dev/null +++ b/lib/awful/mouse/finder.lua.in @@ -0,0 +1,150 @@ +------------------------------------------------------------------------- +-- @author Sébastien Gross <seb•ɱɩɲʋʃ•awesome•ɑƬ•chezwam•ɖɵʈ•org> +-- @copyright 2009 Sébastien Gross +-- @release @AWESOME_VERSION@ +------------------------------------------------------------------------- + +local mouse = mouse +local wibox = wibox +local screen = screen +local timer = timer +local a_placement = require("awful.placement") +local a_wibox = require("awful.wibox") +local beautiful = require("beautiful") +local setmetatable = setmetatable + +--- 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"
+--

+module("awful.mouse.finder") + +-- Mouse finder private data. +-- @name 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 hande 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 + 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 + -- make sure the mouse finder is on the same screen as the mouse + data[self].wibox.screen = mouse.screen + data[self].wibox:geometry({width = data[self].radius, height = data[self].radius }) + 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.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 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:add_signal("timeout", data[self].hide) + data[self].animate_timer:add_signal("timeout", data[self].animate) + data[self].wibox.ontop = true + data[self].wibox.visible = false + + return self +end + +setmetatable(_M, { __call = function(_, ...) return new(...) end }) + +-- vim: ft=lua:et:sw=4:ts=4:sts=4:enc=utf-8:tw=78