Portál AbcLinuxu, 2. května 2025 08:29
V mém posledním zveřejněném desktopu jsem si povzdechl nad tím, že mi Awesome v3.4.10 umísťuje firefox při plovoucím režimu o pár pixel přes horní wibox.
Nebudu tu příliš rozvádět jak to funguje, protože jsem se moc o problematiku signálů nezajímal - nebyl čas, tak tedy:
client.add_signal("manage", function (c, startup)
if not startup then
-- Set the windows at the slave,
-- i.e. put it at the end of others instead of setting it master.
awful.client.setslave(c)
-- Put windows in a smart way, only if they does not set an initial position.
if not c.size_hints.user_position and not c.size_hints.program_position then
awful.placement.no_offscreen(c)
awful.placement.no_overlap(c)
end
end
end)
Tato funkce/signál se mi stará o nové okna. V podstatě jde o to správně umístit okno na viditelnou plochu obrazovky a také aby nedošlo k překrytí. Hlavně maximalizovaný floating firefox či codeblocks o pár px překryly horní wibox o výšce 14px. Zjistil jsem, že za to může funkce no_offscreen() ve které byla chyba (feature?) v nastavování pozice okna v případě, že přesahuje maximální viditelnou šířku / výšku :
function no_offscreen(c)
local c = c or capi.client.focus
local geometry = c:geometry()
local border = c.border_width
local screen_geometry = capi.screen[c.screen].workarea
if geometry.x + geometry.width + 2*border > screen_geometry.x + screen_geometry.width then
-- geometry.x = screen_geometry.x + screen_geometry.width - geometry.width -- original , chybi odecet borderu
geometry.x = screen_geometry.x + screen_geometry.width - (geometry.width - 2*border)
elseif geometry.x < screen_geometry.x then
geometry.x = screen_geometry.x
end
if geometry.y + geometry.height + border > screen_geometry.y + screen_geometry.height then -- proc jen 1x border? radej nebudu patrat
-- geometry.y = screen_geometry.y + screen_geometry.height - geometry.height -- to same chybi border odecet
geometry.y = screen_geometry.y + screen_geometry.height - (geometry.height- 2*border)
elseif geometry.y < screen_geometry.y then
geometry.y = screen_geometry.y
end
-- c:geometry(geometry) -- v originale chybi return wtf?
return c:geometry(geometry) -- uprava luta
end
Jak je vidět, úprava byla elementární i pro člověka co programuje v C embedded a Lua umí jen editovat z rychlíku
Doufám, že to třeba někdy někomu pomůže a doufám, že se kvůli této úpravě neobjeví další chyba / feature
A ještě dotaz pro odborníky v Awesome: Je tohle na bugreport ? Nějak nemám čas zjišťovat, jestli to není jen můj osobní workaround a ve výsledku bych se třeba jen ztrapnil
Jak jsem teď dodatečně zjistil, chyba bude ještě někde jinde, protože je nutno donutit okno větší, než je plocha, aby nepřesahovalo. To by ovšem měla řešit funkce no_overlap..patrně to ale neřeší dokonale, neboť firefox o pár pixel přesahuje spodek obrazovky a pomůže až toggle maximize..
Tiskni
Sdílej:
ps mám to celé blbě, žádný bugreport nebude ale štvě mě to
Ja to mám vpodstate tak isto (Debian Wheezy) placement.lua :
function no_offscreen(c) local c = c or capi.client.focus local geometry = c:geometry() local border = c.border_width local screen_geometry = capi.screen[c.screen].workarea if geometry.x + geometry.width + 2*border > screen_geometry.x + screen_geometry.width then geometry.x = screen_geometry.x + screen_geometry.width - geometry.width elseif geometry.x < screen_geometry.x then geometry.x = screen_geometry.x end if geometry.y + geometry.height + border > screen_geometry.y + screen_geometry.height then geometry.y = screen_geometry.y + screen_geometry.height - geometry.height elseif geometry.y < screen_geometry.y then geometry.y = screen_geometry.y end c:geometry(geometry) end
Nepozorujem prekrytie horného panela ami presah okna cez dolný okraj pri maximalizovaní Firefoxu. Fullscreen mám zakomentovaný.
já nevím přesně jak to popsat. Nakonec to vypadá, že tam chyběl jen ten return v té funkci. Dále jsem si dopsal funkci, která mi testuje velikost okna a pokud je okno zaručeně větší jak obrazovka, tak ho zmenší. Tohle asi ani jedna z těch funkcí nedělala. Takže výsledek vypadá nějako takto :
function w_resize(c)
local geometry = c:geometry()
local border = c.border_width
local screen_geometry = screen[c.screen].workarea
if geometry.width + 2*border > screen_geometry.width then
geometry.width = screen_geometry.width
end
if geometry.height + 2*border > screen_geometry.height then
geometry.height = screen_geometry.height
end
return c:geometry(geometry)
end
-- {{{ Signals
-- Signal function to execute when a new client appears.
client.add_signal("manage", function (c, startup)
w_resize(c)
if not startup then
-- Set the windows at the slave,
-- i.e. put it at the end of others instead of setting it master.
awful.client.setslave(c)
-- Put windows in a smart way, only if they does not set an initial position.
if not c.size_hints.user_position and not c.size_hints.program_position then
awful.placement.no_offscreen(c)
awful.placement.no_overlap(c)
end
end
end)
tak nějak to zatím funguje, než zase najdou nějakou chybu
w_resize(c)
sa bude niekedy možno hodiť, zatial som ju nepotreboval.
trochu je v ní pořád bordel s těma borderama, protože netuším, jak s tím awesome počítá (jestli je už v geometry započítano), ale funguje to. Tenhle detail mě opravdu dlouho štval
Toto
awful.client.setslave(c)
mám zakomentované
-- awful.client.setslave(c)
-- SIGNALS client.add_signal("manage", function (c, startup) if not startup then if not c.size_hints.user_position and not c.size_hints.program_position then awful.placement.no_overlap(c) awful.placement.no_offscreen(c) end end end) client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)Ešte sa mi nestalo, aby sa mi niektoré okno zobrazilo nekorektne, skúšal som všetky graf. programy, ktoré mám nainštalované, až teda na Gimp, ktorý sa mi otvára maximalizovaný a ovládacie panely mi prekrýva hlavné okno, vpodstate mi to ale tak aj vyhovuje, lebo pár pixelov z nich je vidieť..
ja mel problem hlavne s floating layoutem. kazdopadne diky. btw gimp mi taky konecne startuje korektne. protoze mam wibox jen 14px vysoky tak nemam rad kdyz mi ho neco prekryva
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.