The beginnings of a more flexible widget configuration.

The problem is as follows. In the end, different types of widget are going to
have distinct configurable options. This means that we need to have a
different section type for every widget type, if we are ever to make the
configuration nice. In fact, a configuration syntax like this would suit us
very well:

    textbox name {
        foo = bar
    }
    focuslist name2 {
        bar = voing
    }

This is all very well, but libconfuse has a limitation - there is no "nice"
way to retrieve the order of disparate sections (i.e. sections of different
types), and order is important to us. This patch goes to some effort to
retrieve the section order by extracting an array of widgets, and sorting them
based on line number.
This commit is contained in:
Aldo Cortesi 2007-12-16 18:41:10 +11:00 committed by Julien Danjou
parent 8880a3804e
commit 65fd8d48f0
1 changed files with 67 additions and 18 deletions

View File

@ -243,6 +243,68 @@ static Key *section_keys(cfg_t *cfg_keys)
return head; return head;
} }
const char *widget_names[] = {
"focustitle",
"layoutinfo",
"taglist",
"textbox",
};
static int
cmp_widget_cfg(const void *a, const void *b){
if (((cfg_t*)a)->line < ((cfg_t*)b)->line)
return -1;
else if (((cfg_t*)a)->line > ((cfg_t*)b)->line)
return 1;
else
return 0;
}
static void
create_widgets(cfg_t* cfg_statusbar, Statusbar *statusbar)
{
cfg_t* widgets, *wptr;
Widget *widget = NULL;
unsigned int i, j, numnames, numwidgets = 0;
Widget *(*widget_new)(Statusbar *);
numnames = sizeof(widget_names)/sizeof(widget_names[0]);
for (i = 0; i < numnames; i++)
numwidgets += cfg_size(cfg_statusbar, widget_names[i]);
widgets = p_new(cfg_t, numwidgets);
wptr = widgets;
for (i = 0; i < numnames; i++)
for (j = 0; j < cfg_size(cfg_statusbar, widget_names[i]); j++)
{
memcpy(wptr,
cfg_getnsec(cfg_statusbar, widget_names[i], j),
sizeof(cfg_t));
wptr++;
}
qsort(widgets, numwidgets, sizeof(cfg_t), cmp_widget_cfg);
for (i = 0; i < numwidgets; i++){
widget_new = name_func_lookup(cfg_name(widgets + i), WidgetList);
if (widget_new)
if(!widget)
statusbar->widgets = widget = widget_new(statusbar);
else
{
widget->next = widget_new(statusbar);
widget = widget->next;
}
else
warn("Ignoring unknown widget: %s.\n", cfg_name(widgets + i));
}
}
/** Parse configuration file and initialize some stuff /** Parse configuration file and initialize some stuff
* \param configpatharg Path to configuration file * \param configpatharg Path to configuration file
@ -279,7 +341,10 @@ parse_config(const char *confpatharg)
static cfg_opt_t statusbar_opts[] = static cfg_opt_t statusbar_opts[] =
{ {
CFG_STR((char *) "position", (char *) "top", CFGF_NONE), CFG_STR((char *) "position", (char *) "top", CFGF_NONE),
CFG_SEC((char *) "widget", widget_opts, CFGF_TITLE | CFGF_MULTI), CFG_SEC((char *) "textbox", widget_opts, CFGF_TITLE | CFGF_MULTI),
CFG_SEC((char *) "taglist", widget_opts, CFGF_TITLE | CFGF_MULTI),
CFG_SEC((char *) "focustitle", widget_opts, CFGF_TITLE | CFGF_MULTI),
CFG_SEC((char *) "layoutinfo", widget_opts, CFGF_TITLE | CFGF_MULTI),
CFG_END() CFG_END()
}; };
static cfg_opt_t tag_opts[] = static cfg_opt_t tag_opts[] =
@ -399,8 +464,6 @@ parse_config(const char *confpatharg)
Rule *rule = NULL; Rule *rule = NULL;
Layout *layout = NULL; Layout *layout = NULL;
Tag *tag = NULL; Tag *tag = NULL;
Widget *widget = NULL;
Widget *(*widget_new)(Statusbar *);
VirtScreen *virtscreen; VirtScreen *virtscreen;
FILE *defconfig = NULL; FILE *defconfig = NULL;
@ -495,21 +558,7 @@ parse_config(const char *confpatharg)
virtscreen->statusbar.position = virtscreen->statusbar.dposition = virtscreen->statusbar.position = virtscreen->statusbar.dposition =
statusbar_get_position_from_str(cfg_getstr(cfg_statusbar, "position")); statusbar_get_position_from_str(cfg_getstr(cfg_statusbar, "position"));
/* Statusbar widgets */ create_widgets(cfg_statusbar, &virtscreen->statusbar);
if(cfg_size(cfg_statusbar, "widget"))
for(i = 0; i < cfg_size(cfg_statusbar, "widget"); i++)
{
cfgsectmp = cfg_getnsec(cfg_statusbar, "widget", i);
widget_new = name_func_lookup(cfg_title(cfgsectmp), WidgetList);
if(!widget)
virtscreen->statusbar.widgets = widget =
widget_new(&virtscreen->statusbar);
else
{
widget->next = widget_new(&virtscreen->statusbar);
widget = widget->next;
}
}
/* Layouts */ /* Layouts */
if(cfg_size(cfg_layouts, "layout")) if(cfg_size(cfg_layouts, "layout"))