summaryrefslogtreecommitdiff
path: root/awesome/lib/awful/layout/suit/magnifier.lua
diff options
context:
space:
mode:
Diffstat (limited to 'awesome/lib/awful/layout/suit/magnifier.lua')
-rw-r--r--awesome/lib/awful/layout/suit/magnifier.lua147
1 files changed, 147 insertions, 0 deletions
diff --git a/awesome/lib/awful/layout/suit/magnifier.lua b/awesome/lib/awful/layout/suit/magnifier.lua
new file mode 100644
index 0000000..f30d7ee
--- /dev/null
+++ b/awesome/lib/awful/layout/suit/magnifier.lua
@@ -0,0 +1,147 @@
+---------------------------------------------------------------------------
+--- Magnifier layout module for awful
+--
+-- @author Julien Danjou <julien@danjou.info>
+-- @copyright 2008 Julien Danjou
+-- @module awful.layout
+---------------------------------------------------------------------------
+
+-- Grab environment we need
+local ipairs = ipairs
+local math = math
+local capi =
+{
+ client = client,
+ screen = screen,
+ mouse = mouse,
+ mousegrabber = mousegrabber
+}
+
+--- The magnifier layout layoutbox icon.
+-- @beautiful beautiful.layout_magnifier
+-- @param surface
+-- @see gears.surface
+
+local magnifier = {}
+
+function magnifier.mouse_resize_handler(c, corner, x, y)
+ capi.mouse.coords({ x = x, y = y })
+
+ local wa = c.screen.workarea
+ local center_x = wa.x + wa.width / 2
+ local center_y = wa.y + wa.height / 2
+ local maxdist_pow = (wa.width^2 + wa.height^2) / 4
+
+ local prev_coords = {}
+ capi.mousegrabber.run(function (_mouse)
+ if not c.valid then return false end
+
+ for _, v in ipairs(_mouse.buttons) do
+ if v then
+ prev_coords = { x =_mouse.x, y = _mouse.y }
+ local dx = center_x - _mouse.x
+ local dy = center_y - _mouse.y
+ local dist = dx^2 + dy^2
+
+ -- New master width factor
+ local mwfact = dist / maxdist_pow
+ c.screen.selected_tag.master_width_factor
+ = math.min(math.max(0.01, mwfact), 0.99)
+ return true
+ end
+ end
+ return prev_coords.x == _mouse.x and prev_coords.y == _mouse.y
+ end, corner .. "_corner")
+end
+
+function magnifier.arrange(p)
+ -- Fullscreen?
+ local area = p.workarea
+ local cls = p.clients
+ local focus = p.focus or capi.client.focus
+ local t = p.tag or capi.screen[p.screen].selected_tag
+ local mwfact = t.master_width_factor
+ local fidx
+
+ -- Check that the focused window is on the right screen
+ if focus and focus.screen ~= p.screen then focus = nil end
+
+ -- If no window is focused or focused window is not tiled, take the first tiled one.
+ if (not focus or focus.floating) and #cls > 0 then
+ focus = cls[1]
+ fidx = 1
+ end
+
+ -- Abort if no clients are present
+ if not focus then return end
+
+ local geometry = {}
+ if #cls > 1 then
+ geometry.width = area.width * math.sqrt(mwfact)
+ geometry.height = area.height * math.sqrt(mwfact)
+ geometry.x = area.x + (area.width - geometry.width) / 2
+ geometry.y = area.y + (area.height - geometry.height) /2
+ else
+ geometry.x = area.x
+ geometry.y = area.y
+ geometry.width = area.width
+ geometry.height = area.height
+ end
+
+ local g = {
+ x = geometry.x,
+ y = geometry.y,
+ width = geometry.width,
+ height = geometry.height
+ }
+ p.geometries[focus] = g
+
+ if #cls > 1 then
+ geometry.x = area.x
+ geometry.y = area.y
+ geometry.height = area.height / (#cls - 1)
+ geometry.width = area.width
+
+ -- We don't know the focus window index. Try to find it.
+ if not fidx then
+ for k, c in ipairs(cls) do
+ if c == focus then
+ fidx = k
+ break
+ end
+ end
+ end
+
+ -- First move clients that are before focused client.
+ for k = fidx + 1, #cls do
+ p.geometries[cls[k]] = {
+ x = geometry.x,
+ y = geometry.y,
+ width = geometry.width,
+ height = geometry.height
+ }
+ geometry.y = geometry.y + geometry.height
+ end
+
+ -- Then move clients that are after focused client.
+ -- So the next focused window will be the one at the top of the screen.
+ for k = 1, fidx - 1 do
+ p.geometries[cls[k]] = {
+ x = geometry.x,
+ y = geometry.y,
+ width = geometry.width,
+ height = geometry.height
+ }
+ geometry.y = geometry.y + geometry.height
+ end
+ end
+end
+
+--- The magnifier layout.
+-- @clientlayout awful.layout.suit.magnifier
+
+magnifier.name = "magnifier"
+
+return magnifier
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80