2016-03-19 09:57:37 +01:00
|
|
|
local gears_obj = require("gears.object")
|
|
|
|
|
2016-04-05 05:35:03 +02:00
|
|
|
local screen, meta = awesome._shim_fake_class()
|
2018-07-24 23:12:04 +02:00
|
|
|
screen._count = 0
|
2016-03-19 09:57:37 +01:00
|
|
|
|
|
|
|
local function create_screen(args)
|
|
|
|
local s = gears_obj()
|
2019-03-08 19:55:55 +01:00
|
|
|
awesome._forward_class(s, screen)
|
|
|
|
|
2016-09-30 11:03:56 +02:00
|
|
|
s.data = {}
|
2017-05-15 08:24:52 +02:00
|
|
|
s.valid = true
|
2016-03-19 09:57:37 +01:00
|
|
|
|
|
|
|
-- Copy the geo in case the args are mutated
|
|
|
|
local geo = {
|
|
|
|
x = args.x ,
|
|
|
|
y = args.y ,
|
|
|
|
width = args.width ,
|
|
|
|
height = args.height,
|
|
|
|
}
|
|
|
|
|
|
|
|
function s._resize(args2)
|
2019-03-08 20:09:24 +01:00
|
|
|
local old = s.geometry
|
2016-03-19 09:57:37 +01:00
|
|
|
geo.x = args2.x or geo.x
|
|
|
|
geo.y = args2.y or geo.y
|
|
|
|
geo.width = args2.width or geo.width
|
|
|
|
geo.height = args2.height or geo.height
|
2019-03-08 20:09:24 +01:00
|
|
|
s:emit_signal("property::geometry", old)
|
2016-03-19 09:57:37 +01:00
|
|
|
end
|
|
|
|
|
2018-07-24 23:12:04 +02:00
|
|
|
s.outputs = { ["LVDS1"] = {
|
|
|
|
mm_width = 0,
|
|
|
|
mm_height = 0,
|
|
|
|
}}
|
|
|
|
|
2016-03-19 09:57:37 +01:00
|
|
|
local wa = args.workarea_sides or 10
|
|
|
|
|
2018-07-24 23:12:04 +02:00
|
|
|
-- This will happen if `clear()` is called
|
2019-08-15 07:45:01 +02:00
|
|
|
if mouse and (screen.count() > 0 and not mouse.screen) then
|
|
|
|
screen[s] = s
|
2018-07-24 23:12:04 +02:00
|
|
|
mouse.screen = s
|
|
|
|
end
|
|
|
|
|
2016-03-19 09:57:37 +01:00
|
|
|
return setmetatable(s,{ __index = function(_, key)
|
2019-04-27 22:43:02 +02:00
|
|
|
if key == "geometry" then
|
|
|
|
return {
|
|
|
|
x = geo.x or 0,
|
|
|
|
y = geo.y or 0,
|
|
|
|
width = geo.width ,
|
|
|
|
height = geo.height,
|
|
|
|
}
|
|
|
|
elseif key == "workarea" then
|
|
|
|
return {
|
|
|
|
x = (geo.x or 0) + wa ,
|
|
|
|
y = (geo.y or 0) + wa ,
|
|
|
|
width = geo.width - 2*wa,
|
|
|
|
height = geo.height - 2*wa,
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return meta.__index(_, key)
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
__newindex = function(...) return meta.__newindex(...) end
|
|
|
|
})
|
2016-03-19 09:57:37 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
local screens = {}
|
|
|
|
|
|
|
|
function screen._add_screen(args)
|
|
|
|
local s = create_screen(args)
|
|
|
|
table.insert(screens, s)
|
2017-05-15 08:24:52 +02:00
|
|
|
|
|
|
|
-- Skip the metatable or it will have side effects
|
|
|
|
rawset(s, "index", #screens)
|
|
|
|
|
2016-03-19 09:57:37 +01:00
|
|
|
screen[#screen+1] = s
|
|
|
|
screen[s] = s
|
2018-07-24 23:12:04 +02:00
|
|
|
screen._count = screen._count + 1
|
2016-03-19 09:57:37 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
function screen._get_extents()
|
|
|
|
local xmax, ymax
|
2019-08-11 10:06:09 +02:00
|
|
|
for v in screen do
|
2016-03-19 09:57:37 +01:00
|
|
|
if not xmax or v.geometry.x+v.geometry.width > xmax.geometry.x+xmax.geometry.width then
|
|
|
|
xmax = v
|
|
|
|
end
|
|
|
|
if not ymax or v.geometry.y+v.geometry.height > ymax.geometry.y+ymax.geometry.height then
|
|
|
|
ymax = v
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
return xmax.geometry.x+xmax.geometry.width, ymax.geometry.y+ymax.geometry.height
|
|
|
|
end
|
|
|
|
|
|
|
|
function screen._clear()
|
|
|
|
for i=1, #screen do
|
|
|
|
screen[screen[i]] = nil
|
|
|
|
screen[i] = nil
|
|
|
|
end
|
|
|
|
screens = {}
|
2018-07-24 23:12:04 +02:00
|
|
|
|
|
|
|
if mouse then
|
|
|
|
mouse.screen = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
screen._count = 0
|
2016-03-19 09:57:37 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
function screen._setup_grid(w, h, rows, args)
|
|
|
|
args = args or {}
|
|
|
|
screen._clear()
|
|
|
|
for i, row in ipairs(rows) do
|
|
|
|
for j=1, row do
|
2018-07-24 23:12:04 +02:00
|
|
|
args.x = (j-1)*w + (j-1)*screen._grid_horizontal_margin
|
|
|
|
args.y = (i-1)*h + (i-1)*screen._grid_vertical_margin
|
2016-03-19 09:57:37 +01:00
|
|
|
args.width = w
|
|
|
|
args.height = h
|
|
|
|
screen._add_screen(args)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-05-15 08:24:52 +02:00
|
|
|
local function iter_scr(_, _, s)
|
|
|
|
if not s then
|
|
|
|
assert(screen[1])
|
|
|
|
return screen[1], 1
|
|
|
|
end
|
|
|
|
|
|
|
|
local i = s.index
|
|
|
|
|
|
|
|
if i + 1 < #screen then
|
|
|
|
return screen[i+1], i+1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-03-19 09:57:37 +01:00
|
|
|
screen._add_screen {width=320, height=240}
|
|
|
|
|
2018-07-24 23:12:04 +02:00
|
|
|
screen._grid_vertical_margin = 10
|
|
|
|
screen._grid_horizontal_margin = 10
|
|
|
|
|
2019-03-10 20:00:57 +01:00
|
|
|
screen.primary = screen[1]
|
2018-07-24 23:12:04 +02:00
|
|
|
|
|
|
|
function screen.count()
|
|
|
|
return screen._count
|
|
|
|
end
|
|
|
|
|
2017-05-15 08:24:52 +02:00
|
|
|
return setmetatable(screen, {
|
|
|
|
__call = iter_scr
|
|
|
|
})
|
2016-03-19 09:57:37 +01:00
|
|
|
|
|
|
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|