I've been using awesome for
over a year now, and version 3 for the last 7 months. I had a lot of
widgets in my awesome2 setup and porting them to Lua
was very important to me. From a few different approaches I choose
Wicked. It's
a big module for awesome that provides a few default widget types and
allows registering custom functions to create new widgets
easily. Wicked is great because it takes care of everything for you;
registering widgets with awesome, setting timers,
unregistering... It's also the only module (for now) that allows easy
access to suspend and resume functions, so you can easily suspend your
widgets when running on battery. Speaking of which, another killer
feature is widget caching, you can have multiple widgets that use the
same function and it gets executed only once. Good example is the
volume widget, I have a textbox and a progressbar
both showing the volume level.
I've been using Wicked for the past 7 months, and I wrote a lot of
custom widget functions for
it. My
rc.lua was growing huge, close to the 1000 LOC mark. It bothered
me for some time and my first take on it was to remove all the widget
types I don't use from Wicked, and integrate my own widgets with
it. That worked for a while, but then another problem arose. Often
when bored or feeling creative I wanted to write a new widget, a good
example is the wireless information widget. I would need it only when
I'm outside or traveling, in the mean time it would just sit there in
memory. When my local Wicked copy started growing past the 1000 LOC
mark it was time for another solution.
Widgets need to be modular, you plug-in widgets that you need and
ignore the
rest. The Obvious
project provides exactly that, a modular widget library. However it
didn't sit well with me (in its current state), their design is that a
widget module should not only crunch data, but set
up everything. From output formatting to registering button
bindings and timers.
What I had in mind for a widget module is that it should be a small,
10 lines, module with a worker function that crunches some data and
spits out numbers/results. How that data will be formatted, should it
be red or blue I want to define somewhere else, in the rc.lua
most likely. If you need a new widget or maybe you are just motivated
or feeling creative... you write a quick function that does the work,
that's all you need to focus on. When you need it, you plug it
in.
Pondering on it for a while I decided to do it my self, otherwise I
would never be satisfied. Since I was already familiar with Wicked,
and it has suspend/resume/caching... I split it and modularized the
code. The new widget library I called Vicious, it has some of
the old Wicked widget types, a few of them rewritten, and a good
number of new widgets. Small summary of changes so far:
* Original code modularized * Widgets ported from Wicked: - CPU, MEM, FS, NET, Date, Uptime, MPD * Widgets written for Vicious: - Thermal, Battery, Mbox, OrgMode, Volume, Entropy, Disk I/O, System Load, Wireless, Pacman * MEM widget rewritten, uses pattern matching - Swap widget merged with MEM widget type * MPD widget rewritten, a bit more versatile * NET widget rewritten, uses pattern matching * CPU widget rewritten, uses pattern matching * FS widget rewritten, uses pattern matching - Also fixed padding in the process * Removed deprecated helper functionsI guess at least one user will share my views on widgets, and could be interested in the code. Since my rc.lua is by far the most requested file on this web server there will be a few more people interested in Vicious. For that reason I decided to share it.