blog · git · desktop · images · contact


Awesome: Die Trennlinien-Wibox

2011-10-29

Bei meinem Setup für Awesome spielt sich so gut wie alles in der Wibox ab: Systeminformationen, Mail-Notifications, TODO-Items, Uhrzeit, Datum und so weiter. Ohne besondere Vorkehrungen ist eine Wibox einfach nur ein Bereich mit Hintergrundfarbe (und optional ein bisschen Transparenz) am unteren Bildschirmrand:

Screenshot

Die vertikalen weißen Linien sind Imageboxes, die ein entsprechendes PNG darstellen. (Anmerkung/Mutmaßung: Im Git-Branch von Awesome könnte man das vermutlich direkt mit Cairo zeichnen lassen. Ich benutze aber noch den 3.4er-Branch.) Aber oben, horizontal über der Box ist gar nichts. Da hört die Box einfach auf. Das hat mich schon immer gestört und früher habe ich da einfach eine passende Linie in mein Hintergrundbild gezeichnet, was sich mit ImageMagick ja gut automatisieren lässt. Aber trotzdem war das ein bisschen lästig.

Der Vollständigkeit halber sei erwähnt, dass eine Wibox auch einen Border kennt. Das wären die Eigenschaften „border_width“ und „border_color“. Dieser Border umfasst aber die gesamte Wibox, was nicht nur unschön aussieht:

Screenshot

Auf diese Weise ist auch der Pixel ganz unten links vom Border bedeckt. Das heißt, ich kann meine Maus (ja, ich benutze die manchmal immernoch) nicht einfach nach links unten in die Ecke werfen, um meine Taglist zu erreichen – denn dort ist eben keine Taglist, sondern der Border der Wibox.

Es hat eine Weile gedauert, bis mir aufgefallen ist, dass man mehrere Wiboxes haben kann. Deswegen sieht meine jetzige Lösung so aus, dass die weiße Linie über der „normalen“ Wibox eine zweite, eigenständige, aber leere Wibox ohne Widgets ist. Sie ist genau ein Pixel hoch und hat eine passende Hintergrundfarbe:

Screenshot

Man kann das erreichen, indem man, nachdem alle anderen Wiboxes platziert wurden, noch eine erzeugt und ihr Position und Größe fest mitgibt:

for s = 1, screen.count()
do
    -- Create regular Wiboxes ...
end

-- ...

function divbox(relbox, s)
    local area = screen[s].geometry
    local arg = {}
    arg.position = nil
    arg.width = area.width
    arg.height = 1
    arg.bg = '#FFFFFF'
    local divbox = wibox(arg)
    divbox.x = area.x
    divbox.y = area.height - relbox.height - 1
    divbox.screen = s
    return divbox
end

for s = 1, screen.count()
do
    -- All tags have a bottom padding of 1px. This makes sure my
    -- fake-wibox-border is always visible.
    awful.screen.padding(screen[s], { bottom = 1 })

    -- Create the box and place it above the existing box.
    divbox(mywiboxpri[s], s)
end

Diese zweite Wibox orientiert sich dann an der bereits existierenden Box und platziert sich darüber. Zu erwähnen ist noch das zusätzliche Padding: Aus mir nicht ganz verständlichen Gründen trägt die Trennlinien-Wibox nicht wie jede andere Wibox zum normalen Padding bei (vermutlich, weil ich ihre Position explizit gesetzt habe, statt einfach nur „unten“ oder „oben“ anzugeben?), sodass die Layouts nichts von ihr wissen. In der Konsequenz würde sie von offenen Fenstern auf dem Bildschirm verdeckt. Um das zu verhindern, wird das Padding manuell gesetzt.

– Nachtrag 2012-06-04: Es gibt jetzt eine entsprechende Funktion im Paket awesome-vain, „vain.widgets.borderbox()“.

Comments?