doc: Add documentation for the client "window factor" related functions

It might be a good idea to deprecate them and move them to the tag
class. However, these APIs are not exactly well designed, so
moving them wont solve that. Some day the dynamic client layout will
hopefully be merged and send these functions to the heap of smelly
bad ideas trash.
This commit is contained in:
Emmanuel Lepage Vallee 2021-10-17 19:22:38 -07:00
parent 62685c661d
commit ae71158093
9 changed files with 398 additions and 8 deletions

View File

@ -909,6 +909,7 @@ local show_return = {
["function"] = true,
constructorfct = true,
constructorfct2 = true,
legacylayout = true,
staticfct = true,
method = true,
deprecated = true,

View File

@ -1116,11 +1116,14 @@ end
--- Calculate a client's column number, index in that column, and
-- number of visible clients in this column.
--
-- @DOC_screen_wfact4_EXAMPLE@
--
-- @legacylayout awful.client.idx
-- @tparam client c the client
-- @treturn integer col The column number.
-- @treturn integer idx Index of the client in the column.
-- @treturn integer num The number of visible clients in the column.
-- @treturn table data A table with "col", "idx" and "num" keys.
-- @treturn integer data.col The column number.
-- @treturn integer data.idx Index of the client in the column.
-- @treturn integer data.num The number of visible clients in the column.
function client.idx(c)
c = c or capi.client.focus
if not c then return end
@ -1175,12 +1178,22 @@ function client.idx(c)
end
--- Set the window factor of a client
--- Define how tall a client should be in the tile layout.
--
-- One valid use case for calling this is restoring serialized layouts.
-- This function is rather fragile and the behavior may not remain the
-- same across AwesomeWM versions.
--
-- When setting a value, make sure the sum remains 1. Otherwise, the
-- clients will just go offscreen or get negative size.
--
-- @DOC_screen_wfact3_EXAMPLE@
--
-- @legacylayout awful.client.setwfact
-- @tparam number wfact the window factor value
-- @tparam client c the client
-- @emits property::windowfact
-- @emits property::windowfact Emitted on the c.first_tag object.
-- @see tag.master_width_factor
function client.setwfact(wfact, c)
-- get the currently selected window
c = c or capi.client.focus
@ -1234,6 +1247,12 @@ end
-- This will emit `property::windowfact` on the specific tag object
-- `c.screen.selected_tag`.
--
-- @DOC_screen_wfact1_EXAMPLE@
--
-- Changing the gap will make some clients taller:
--
-- @DOC_screen_wfact2_EXAMPLE@
--
-- @legacylayout awful.client.incwfact
-- @tparam number add Amount to increase/decrease the client's window factor by.
-- Should be between `-current_window_factor` and something close to

View File

@ -2981,7 +2981,7 @@ client_kill(client_t *c)
* top to bottom).
* @treturn table A table with clients.
* @staticfct get
* @usage for _, c in client.get() do
* @usage for _, c in ipairs(client.get()) do
* -- do something
* end
*/

View File

@ -9,6 +9,7 @@ local cairo = require("lgi").cairo
local Pango = require("lgi").Pango
local PangoCairo = require("lgi").PangoCairo
local color = require("gears.color")
local aclient = require("awful.client")
-- Let the test request a size and file format
local args = loadfile(file_path)() or 10
@ -533,6 +534,45 @@ local function draw_mwfact(s)
cr:translate(tr_x, tr_y)
end
local function draw_wfact(s)
cr:translate(-tr_x, -tr_y)
local tags = s.selected_tags
local windowfacts = s.selected_tag.windowfact
local height = s.tiling_area.height / SCALE_FACTOR
local sum, gap = 0, s.selected_tag.gap or 0
for _, t in ipairs(tags) do
for _, c in ipairs(t:clients()) do
local info = aclient.idx(c)
sum = sum + windowfacts[info.col][info.idx]
end
end
local offset = s.tiling_area.y * args.factor + tr_y + (2*gap)
for i = 1, #windowfacts[1] do
draw_vruler(
s,
0, --s.geometry.x + s.geometry.width,
s.geometry.width * factor + 5,
{
y = math.floor(offset),
height =math.ceil( (height/sum) * windowfacts[1][i]),
color = colors.gaps.."66",
align = true,
},
1
)
offset = offset + (height/sum * windowfacts[1][i]) + (2*gap)
end
cr:translate(tr_x, tr_y)
end
local function draw_client_snap(s)
cr:translate(-tr_x, -tr_y)
@ -722,7 +762,9 @@ for k=1, screen.count() do
draw_area(s, s.tiling_area, "tiling_area", (k-1)*10, args.highlight_tiling_area)
-- Draw the ruler.
if args.draw_areas ~= false then
draw_rulers(s)
end
-- Draw the wibar.
for _, wibar in ipairs(args.draw_wibars or {}) do
@ -781,11 +823,16 @@ for k=1, screen.count() do
draw_gaps(s)
end
-- Draw the useless gaps.
-- Draw the master width factor gaps.
if args.draw_mwfact then
draw_mwfact(s)
end
-- Draw the (rows) width factor.
if args.draw_wfact then
draw_wfact(s)
end
-- Draw the snapping areas of floating clients.
if args.draw_client_snap then
draw_client_snap(s)

View File

@ -0,0 +1,61 @@
--DOC_GEN_IMAGE --DOC_NO_USAGE --DOC_HIDE_ALL
screen[1]._resize {x = 0, width = 640, height = 480}
local awful = {
wibar = require("awful.wibar"),
tag = require("awful.tag"),
tag_layout = require("awful.layout.suit.tile")
}
function awful.spawn(_, args)
local c = client.gen_fake{}
c:tags({args.tag})
assert(#c:tags() == 1)
assert(c:tags()[1] == args.tag)
end
screen[1].padding = {
left = 40,
right = 40,
top = 20,
bottom = 20,
}
local wibar = awful.wibar {
position = "top",
height = 24,
}
awful.tag.add("1", {
screen = screen[1],
selected = true,
layout = awful.tag_layout.right,
gap = 5,
master_count = 2,
master_width_factor = 0.66
})
local clients = {
['master #1 \nCol:1, Sum: 2\nRatio: 1/2'] = client.gen_fake{},
['master #2 \nCol:1, Sum: 2\nRatio: 1/2'] = client.gen_fake{},
['slave #1 \nCol:2, Sum: 3\nRatio: 1/3'] = client.gen_fake{},
['slave #2 \nCol:2, Sum: 3\nRatio: 1/3'] = client.gen_fake{},
['slave #3 \nCol:2, Sum: 3\nRatio: 1/3'] = client.gen_fake{}
}
for _,c in ipairs(clients) do
c:tags{"1"}
end
return {
factor = 2 ,
show_boxes = true,
draw_wibars = {wibar},
draw_clients = clients,
display_screen_info = false,
draw_mwfact = true,
draw_wfact = true,
draw_areas = false,
}

View File

@ -0,0 +1,83 @@
--DOC_GEN_IMAGE --DOC_NO_USAGE --DOC_HIDE_START
screen[1]._resize {x = 0, width = 640, height = 480}
local awful = {
client = require("awful.client"),
wibar = require("awful.wibar"),
tag = require("awful.tag"),
tag_layout = require("awful.layout.suit.tile")
}
function awful.spawn(_, args)
local c = client.gen_fake{}
c:tags({args.tag})
assert(#c:tags() == 1)
assert(c:tags()[1] == args.tag)
end
screen[1].padding = {
left = 40,
right = 40,
top = 20,
bottom = 20,
}
local wibar = awful.wibar {
position = "top",
height = 24,
}
awful.tag.add("1", {
screen = screen[1],
selected = true,
layout = awful.tag_layout.right,
gap = 5,
master_count = 2,
master_width_factor = 0.66
})
local clients = {
['master #1 \nCol:1, Sum: 2\nRatio: 1/3'] = client.gen_fake{},
['master #2 \nCol:1, Sum: 2\nRatio: 3/4'] = client.gen_fake{},
['slave #1 \nCol:2, Sum: 3\nRatio: 1/5'] = client.gen_fake{},
['slave #2 \nCol:2, Sum: 3\nRatio: 3/5'] = client.gen_fake{},
['slave #3 \nCol:2, Sum: 3\nRatio: 1/5'] = client.gen_fake{}
}
for _,c in ipairs(clients) do
c:tags{"1"}
end
local tag = screen[1].selected_tag
local param = {
tag = tag,
screen = 1,
clients = tag:clients(),
focus = nil,
geometries = setmetatable({}, {__mode = "k"}),
workarea = tag.screen.workarea,
useless_gap = tag.gaps or 4,
apply_size_hints = false,
}
-- wfact only works after the first arrange call...
tag.layout.arrange(param)
--DOC_HIDE_END
awful.client.incwfact(2, client.get()[4])
awful.client.incwfact(3, client.get()[2])
--DOC_HIDE_START
return {
factor = 2 ,
show_boxes = true,
draw_wibars = {wibar},
draw_clients = clients,
display_screen_info = false,
draw_mwfact = true,
draw_wfact = true,
draw_areas = false,
}

View File

@ -0,0 +1,87 @@
--DOC_GEN_IMAGE --DOC_NO_USAGE --DOC_HIDE_START
screen[1]._resize {x = 0, width = 640, height = 480}
local awful = {
client = require("awful.client"),
wibar = require("awful.wibar"),
tag = require("awful.tag"),
tag_layout = require("awful.layout.suit.tile")
}
function awful.spawn(_, args)
local c = client.gen_fake{}
c:tags({args.tag})
assert(#c:tags() == 1)
assert(c:tags()[1] == args.tag)
end
screen[1].padding = {
left = 40,
right = 40,
top = 20,
bottom = 20,
}
local wibar = awful.wibar {
position = "top",
height = 24,
}
awful.tag.add("1", {
screen = screen[1],
selected = true,
layout = awful.tag_layout.right,
gap = 5,
master_count = 2,
master_width_factor = 0.66
})
local clients = {
['master #1 \nCol:1'] = client.gen_fake{},
['master #2 \nCol:1'] = client.gen_fake{},
['slave #1 \nCol:2'] = client.gen_fake{},
['slave #2 \nCol:2'] = client.gen_fake{},
['slave #3 \nCol:2'] = client.gen_fake{},
['slave #4 \nCol:2'] = client.gen_fake{}
}
for _,c in ipairs(clients) do
c:tags{"1"}
end
local tag = screen[1].selected_tag
local param = {
tag = tag,
screen = 1,
clients = tag:clients(),
focus = nil,
geometries = setmetatable({}, {__mode = "k"}),
workarea = tag.screen.workarea,
useless_gap = tag.gaps or 4,
apply_size_hints = false,
}
-- wfact only works after the first arrange call...
tag.layout.arrange(param)
--DOC_HIDE_END
awful.client.setwfact(2/3, client.get()[1])
awful.client.setwfact(1/3, client.get()[2])
awful.client.setwfact(4/8, client.get()[3])
awful.client.setwfact(2/8, client.get()[4])
awful.client.setwfact(1/8, client.get()[5])
awful.client.setwfact(1/8, client.get()[6])
--DOC_HIDE_START
return {
factor = 2,
show_boxes = true,
draw_wibars = {wibar},
draw_clients = clients,
display_screen_info = false,
draw_mwfact = true,
draw_wfact = true,
draw_areas = false,
}

View File

@ -0,0 +1,87 @@
--DOC_GEN_IMAGE --DOC_NO_USAGE --DOC_HIDE_START --DOC_GEN_OUTPUT
screen[1]._resize {x = 0, width = 640, height = 480}
local awful = {
client = require("awful.client"),
wibar = require("awful.wibar"),
tag = require("awful.tag"),
tag_layout = require("awful.layout.suit.tile")
}
function awful.spawn(_, args)
local c = client.gen_fake{}
c:tags({args.tag})
assert(#c:tags() == 1)
assert(c:tags()[1] == args.tag)
end
screen[1].padding = {
left = 40,
right = 40,
top = 20,
bottom = 20,
}
local wibar = awful.wibar {
position = "top",
height = 24,
}
awful.tag.add("1", {
screen = screen[1],
selected = true,
layout = awful.tag_layout.right,
gap = 5,
master_count = 2,
master_width_factor = 0.66
})
local clients = {
['master #1 \nCol:1, Sum: 2\nRatio: 1/2'] = client.gen_fake{},
['master #2 \nCol:1, Sum: 2\nRatio: 1/2'] = client.gen_fake{},
['slave #1 \nCol:2, Sum: 3\nRatio: 1/3'] = client.gen_fake{},
['slave #2 \nCol:2, Sum: 3\nRatio: 1/3'] = client.gen_fake{},
['slave #3 \nCol:2, Sum: 3\nRatio: 1/3'] = client.gen_fake{}
}
for _,c in ipairs(clients) do
c:tags{"1"}
end
local tag = screen[1].selected_tag
local param = {
tag = tag,
screen = 1,
clients = tag:clients(),
focus = nil,
geometries = setmetatable({}, {__mode = "k"}),
workarea = tag.screen.workarea,
useless_gap = tag.gaps or 4,
apply_size_hints = false,
}
-- wfact only works after the first arrange call...
tag.layout.arrange(param)
--DOC_HIDE_END
for i, c in ipairs(client.get()) do
local data = awful.client.idx(c)
print("Client #"..i..":", data.col, data.idx, data.num)
end
--DOC_HIDE_START
return {
factor = 2 ,
show_boxes = true,
draw_wibars = {wibar},
draw_clients = clients,
display_screen_info = false,
draw_mwfact = true,
draw_wfact = true,
draw_areas = false,
}

View File

@ -0,0 +1,5 @@
Client #1: 0 1 2
Client #2: 0 2 2
Client #3: 1 1 3
Client #4: 1 2 3
Client #5: 1 3 3