Use single function to parse sequences to keep the order
This commit is contained in:
parent
f6c0bc8a6c
commit
554952cc57
@ -63,11 +63,7 @@ config_theme(void)
|
|||||||
t->client_titlebar_width = fetch_opt_first(ks[i], "12", "client_titlebar_width").num;
|
t->client_titlebar_width = fetch_opt_first(ks[i], "12", "client_titlebar_width").num;
|
||||||
t->client_border_width = fetch_opt_first(ks[i], "1", "client_border_width").num;
|
t->client_border_width = fetch_opt_first(ks[i], "1", "client_border_width").num;
|
||||||
|
|
||||||
/* insert_tail with SLIST */
|
SLIST_INSERT_TAIL(&W->h.theme, t, next, p);
|
||||||
if(SLIST_EMPTY(&W->h.theme))
|
|
||||||
SLIST_INSERT_HEAD(&W->h.theme, t, next);
|
|
||||||
else
|
|
||||||
SLIST_INSERT_AFTER(p, t, next);
|
|
||||||
|
|
||||||
p = t;
|
p = t;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,11 +71,7 @@ infobar_elem_tag_init(struct element *e)
|
|||||||
barwin_mousebind_new(b, Button4, false, g, uicb_tag_next, NULL);
|
barwin_mousebind_new(b, Button4, false, g, uicb_tag_next, NULL);
|
||||||
barwin_mousebind_new(b, Button5, false, g, uicb_tag_prev, NULL);
|
barwin_mousebind_new(b, Button5, false, g, uicb_tag_prev, NULL);
|
||||||
|
|
||||||
/* insert_tail with SLIST */
|
SLIST_INSERT_TAIL(&e->bars, b, enext, prev);
|
||||||
if(SLIST_EMPTY(&e->bars))
|
|
||||||
SLIST_INSERT_HEAD(&e->bars, b, enext);
|
|
||||||
else
|
|
||||||
SLIST_INSERT_AFTER(prev, b, enext);
|
|
||||||
|
|
||||||
prev = b;
|
prev = b;
|
||||||
j += s;
|
j += s;
|
||||||
|
|||||||
186
src/status.c
186
src/status.c
@ -9,26 +9,20 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
/* Parse arg;between;semicolon */
|
/* Parse arg;between;semicolon */
|
||||||
#define STATUS_GET_ARGS(i, inc, p, arg, n) \
|
#define STATUS_GET_ARGS(i, p, arg, n) \
|
||||||
do { \
|
do { \
|
||||||
for(i = 0, p += inc, arg[0] = p; *p && *p != ']' && i < n; ++p) \
|
for(i = 0, p += 2, arg[0] = p; *p && *p != ']' && i < n; ++p) \
|
||||||
if(*p == ';') \
|
if(*p == ';') \
|
||||||
{ \
|
{ \
|
||||||
*p = '\0'; \
|
*p = '\0'; \
|
||||||
arg[++i] = ++p; \
|
arg[++i] = ++p; \
|
||||||
} \
|
} \
|
||||||
*p = '\0'; \
|
*p = '\0'; \
|
||||||
} while(/* CONSTCOND */ 0);
|
} while(/* CONSTCOND */ 0);
|
||||||
|
|
||||||
#define STATUS_CHECK_END(str, end, p) \
|
|
||||||
if(!(end = strstr(p, "]\\"))) \
|
|
||||||
{ \
|
|
||||||
str = end + 2; \
|
|
||||||
continue; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define STATUS_CHECK_ARGS(i, n1, n2, str, end) \
|
#define STATUS_CHECK_ARGS(i, n1, n2, str, end) \
|
||||||
if(i != n1 && i != n2) \
|
if(i != n1 && i != n2) \
|
||||||
{ \
|
{ \
|
||||||
@ -37,12 +31,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Alloc & fill status_sq struct with universal options: align/position and type */
|
/* Alloc & fill status_sq struct with universal options: align/position and type */
|
||||||
#define STATUS_FILL_SQ(sq, t, shift, arg) \
|
#define STATUS_FILL_SQ(sq, t, ma, shift, arg) \
|
||||||
do { \
|
do { \
|
||||||
sq = xcalloc(1, sizeof(struct status_seq)); \
|
sq = xcalloc(1, sizeof(struct status_seq)); \
|
||||||
sq->type = t; \
|
sq->type = t; \
|
||||||
\
|
\
|
||||||
if(!strcmp(arg[0], "right") || !strcmp(arg[0], "left")) \
|
if(i == ma || !strcmp(arg[0], "right") || !strcmp(arg[0], "left")) \
|
||||||
sq->align = str_to_position(arg[0]); \
|
sq->align = str_to_position(arg[0]); \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
@ -53,73 +47,61 @@
|
|||||||
} \
|
} \
|
||||||
} while(/* CONSTCOND */ 0); \
|
} while(/* CONSTCOND */ 0); \
|
||||||
|
|
||||||
|
|
||||||
/** Check text blocks in str and list it
|
|
||||||
* --> \s[left/right;#color;text]\ OR \s[x;y;#color;text]\
|
|
||||||
*\param ib Infobar pointer
|
|
||||||
*\param str String
|
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
status_text(struct infobar *ib, char *str)
|
status_parse(struct infobar *ib)
|
||||||
{
|
{
|
||||||
struct status_seq *sq;
|
struct status_seq *sq, *prev = NULL;
|
||||||
int i;
|
int i, shift = 0;
|
||||||
char *dstr = xstrdup(str), *sauv = dstr;
|
char *dstr = xstrdup(ib->status), *sauv = dstr;
|
||||||
char *p, *end;
|
char type, *p, *end, *arg[6] = { NULL };
|
||||||
|
|
||||||
while((p = strstr(dstr, "\\s[")))
|
for(; *dstr; ++dstr)
|
||||||
{
|
{
|
||||||
char *arg[5] = { NULL };
|
/* Check if this is a sequence */
|
||||||
int shift = 0;
|
if(*dstr != '\\')
|
||||||
|
continue;
|
||||||
|
|
||||||
STATUS_CHECK_END(dstr, end, p);
|
p = ++dstr;
|
||||||
STATUS_GET_ARGS(i, 3, p, arg, 4);
|
|
||||||
STATUS_CHECK_ARGS(i, 2, 3, dstr, end);
|
|
||||||
STATUS_FILL_SQ(sq, 's', shift, arg);
|
|
||||||
|
|
||||||
/* string sequence options */
|
if(!(strchr("sR", *p)) || !(end = strstr(p, "]\\")))
|
||||||
sq->color = color_atoh(arg[1 + shift]);
|
continue;
|
||||||
sq->str = xstrdup(arg[2 + shift]);
|
|
||||||
|
|
||||||
SLIST_INSERT_HEAD(&ib->statushead, sq, next);
|
/* Then parse & list it */
|
||||||
|
switch((type = tolower(*p)))
|
||||||
dstr = end + 2;
|
{
|
||||||
}
|
/*
|
||||||
|
* Text sequence: \s[left/right;#color;text]\ OR \s[x;y;#color;text]\
|
||||||
free(sauv);
|
*/
|
||||||
}
|
case 's':
|
||||||
|
STATUS_GET_ARGS(i, p, arg, 4);
|
||||||
/** Check rectangle blocks in str and list it
|
STATUS_CHECK_ARGS(i, 2, 3, dstr, end);
|
||||||
* --> \s[left/right;width;height;#color]\ OR \s[x;y;width;height;#color]\
|
STATUS_FILL_SQ(sq, type, 2, shift, arg);
|
||||||
*\param ib Infobar pointer
|
|
||||||
*\param str String
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
status_rect(struct infobar *ib, char *str)
|
|
||||||
{
|
|
||||||
struct status_seq *sq;
|
|
||||||
int i;
|
|
||||||
char *dstr = xstrdup(str), *sauv = dstr;
|
|
||||||
char *p, *end;
|
|
||||||
|
|
||||||
while((p = strstr(dstr, "\r[")))
|
|
||||||
{
|
|
||||||
char *arg[6] = { NULL };
|
|
||||||
int shift = 0;
|
|
||||||
|
|
||||||
STATUS_CHECK_END(dstr, end, p);
|
|
||||||
STATUS_GET_ARGS(i, 2, p, arg, 5);
|
|
||||||
STATUS_CHECK_ARGS(i, 3, 4, dstr, end);
|
|
||||||
STATUS_FILL_SQ(sq, 'r', shift, arg);
|
|
||||||
|
|
||||||
/* rectangle sequence options */
|
|
||||||
sq->geo.w = ATOI(arg[1 + shift]);
|
|
||||||
sq->geo.h = ATOI(arg[2 + shift]);
|
|
||||||
sq->color = color_atoh(arg[3 + shift]);
|
|
||||||
|
|
||||||
SLIST_INSERT_HEAD(&ib->statushead, sq, next);
|
|
||||||
|
|
||||||
|
sq->color = color_atoh(arg[1 + shift]);
|
||||||
|
sq->str = xstrdup(arg[2 + shift]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rectangle sequence: \s[left/right;w;h;#color]\ OR \s[x;y;w;h;#color]\
|
||||||
|
*/
|
||||||
|
case 'r':
|
||||||
|
STATUS_GET_ARGS(i, p, arg, 5);
|
||||||
|
STATUS_CHECK_ARGS(i, 3, 4, dstr, end);
|
||||||
|
STATUS_FILL_SQ(sq, type, 3, shift, arg);
|
||||||
|
|
||||||
|
sq->geo.w = ATOI(arg[1 + shift]);
|
||||||
|
sq->geo.h = ATOI(arg[2 + shift]);
|
||||||
|
sq->color = color_atoh(arg[3 + shift]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SLIST_INSERT_TAIL(&ib->statushead, sq, next, prev);
|
||||||
|
|
||||||
|
prev = sq;
|
||||||
dstr = end + 2;
|
dstr = end + 2;
|
||||||
|
shift = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(sauv);
|
free(sauv);
|
||||||
@ -177,11 +159,35 @@ status_apply_list(struct element *e)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Render current statustext of an element */
|
||||||
|
void
|
||||||
|
status_render(struct element *e)
|
||||||
|
{
|
||||||
|
struct barwin *b = SLIST_FIRST(&e->bars);
|
||||||
|
|
||||||
|
if(!e->infobar->status)
|
||||||
|
return;
|
||||||
|
|
||||||
|
barwin_refresh_color(b);
|
||||||
|
|
||||||
|
/* Use simple text instead sequence if no sequence found */
|
||||||
|
if(SLIST_EMPTY(&e->infobar->statushead))
|
||||||
|
{
|
||||||
|
int l = draw_textw(e->infobar->theme, e->infobar->status);
|
||||||
|
draw_text(b->dr, e->infobar->theme, e->geo.w - l,
|
||||||
|
TEXTY(e->infobar->theme, e->geo.h), b->fg, e->infobar->status);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
status_apply_list(e);
|
||||||
|
|
||||||
|
barwin_refresh(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse and render statustext */
|
||||||
void
|
void
|
||||||
status_manage(struct element *e)
|
status_manage(struct element *e)
|
||||||
{
|
{
|
||||||
struct status_seq *sq;
|
struct status_seq *sq;
|
||||||
struct barwin *b = SLIST_FIRST(&e->bars);
|
|
||||||
|
|
||||||
SLIST_INIT(&e->infobar->statushead);
|
SLIST_INIT(&e->infobar->statushead);
|
||||||
|
|
||||||
@ -194,30 +200,8 @@ status_manage(struct element *e)
|
|||||||
free(sq);
|
free(sq);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!e->infobar->status)
|
status_parse(e->infobar);
|
||||||
return;
|
status_render(e);
|
||||||
|
|
||||||
barwin_refresh_color(b);
|
|
||||||
|
|
||||||
status_text(e->infobar, e->infobar->status);
|
|
||||||
status_rect(e->infobar, e->infobar->status);
|
|
||||||
|
|
||||||
/* DEBUG
|
|
||||||
SLIST_FOREACH(sq, &e->infobar->statushead, next)
|
|
||||||
printf("-> %c (%d;%d)x(%d;%d) (%d) (#%x) (%s)\n",
|
|
||||||
sq->type, sq->geo.x, sq->geo.y, sq->geo.w, sq->geo.h, sq->align, sq->color, sq->str);
|
|
||||||
*/
|
|
||||||
|
|
||||||
status_apply_list(e);
|
|
||||||
|
|
||||||
/*
|
|
||||||
l = draw_textw(e->infobar->theme, e->infobar->status);
|
|
||||||
draw_text(b->dr, e->infobar->theme, e->geo.w - l,
|
|
||||||
TEXTY(e->infobar->theme, e->geo.h), b->fg, e->infobar->status);
|
|
||||||
*/
|
|
||||||
|
|
||||||
barwin_refresh(b);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Syntax: "<infobar name> <status string>" */
|
/* Syntax: "<infobar name> <status string>" */
|
||||||
|
|||||||
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "wmfs.h"
|
#include "wmfs.h"
|
||||||
|
|
||||||
|
void status_render(struct element *e);
|
||||||
void status_manage(struct element *e);
|
void status_manage(struct element *e);
|
||||||
void uicb_status(Uicb cmd);
|
void uicb_status(Uicb cmd);
|
||||||
|
|
||||||
|
|||||||
@ -21,6 +21,13 @@
|
|||||||
} \
|
} \
|
||||||
} while(/* CONSTCOND */ 0);
|
} while(/* CONSTCOND */ 0);
|
||||||
|
|
||||||
|
/* Insert at the end with SLIST */
|
||||||
|
#define SLIST_INSERT_TAIL(head, elem, field, prev) \
|
||||||
|
if(SLIST_EMPTY(head)) \
|
||||||
|
SLIST_INSERT_HEAD(head, elem, field); \
|
||||||
|
else \
|
||||||
|
SLIST_INSERT_AFTER(prev, elem, field);
|
||||||
|
|
||||||
/* t is Map or Unmap */
|
/* t is Map or Unmap */
|
||||||
#define WIN_STATE(w, t) do { \
|
#define WIN_STATE(w, t) do { \
|
||||||
X##t##Subwindows(W->dpy, w); \
|
X##t##Subwindows(W->dpy, w); \
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user