Add clean status_surface. cmd syntax: "w;h;bg <statusline>"

This commit is contained in:
Martin Duquesnoy 2012-02-06 15:29:48 +01:00
parent b5764dd0a6
commit ff269f01b3
8 changed files with 73 additions and 3 deletions

View File

@ -83,7 +83,8 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] =
{ "client_tab_next_opened", uicb_client_tab_next_opened },
/* Status */
{ "status" , uicb_status },
{ "status" , uicb_status },
{ "status_surface", uicb_status_surface },
/* Mouse */
{ "mouse_resize", uicb_mouse_resize },

View File

@ -29,6 +29,7 @@ event_buttonpress(XEvent *e)
struct barwin *b;
screen_update_sel();
status_flush_surface();
SLIST_FOREACH(b, &W->h.barwin, next)
if(b->win == ev->window)
@ -325,6 +326,7 @@ event_keypress(XEvent *e)
struct keybind *k;
screen_update_sel();
status_flush_surface();
SLIST_FOREACH(k, &W->h.keybind, next)
if(k->keysym == keysym && KEYPRESS_MASK(k->mod) == KEYPRESS_MASK(ev->state))

View File

@ -26,7 +26,7 @@ mouse_resize(struct client *c)
int d, u, ox, oy, ix, iy;
int mx, my;
XQueryPointer(W->dpy, W->root, &w, &w, &ox, &oy, &d, &d, (uint *)&u);
XQueryPointer(W->dpy, W->root, &w, &w, &ox, &oy, &d, &d, (unsigned int *)&u);
XGrabServer(W->dpy);
if(c->flags & CLIENT_FREE)

View File

@ -528,6 +528,68 @@ status_manage(struct status_ctx *ctx)
status_copy_mousebind(ctx);
}
void
status_flush_surface(void)
{
struct barwin *b;
while(!SLIST_EMPTY(&W->h.vbarwin))
{
b = SLIST_FIRST(&W->h.vbarwin);
SLIST_REMOVE_HEAD(&W->h.vbarwin, vnext);
barwin_remove(b);
}
}
static void
status_surface(int w, int h, Color bg, char *status)
{
struct barwin *b;
struct status_ctx ctx;
int d, x, y;
if(!status)
return;
XQueryPointer(W->dpy, W->root, (Window*)&d, (Window*)&d, &x, &y, &d, &d, (unsigned int *)&d);
b = barwin_new(W->root, x, y, w, h, 0, bg, false);
barwin_map(b);
ctx = status_new_ctx(b, SLIST_FIRST(&W->h.theme));
ctx.status = xstrdup(status);
SLIST_INSERT_HEAD(&W->h.vbarwin, b, vnext);
status_manage(&ctx);
status_free_ctx(&ctx);
}
void
uicb_status_surface(Uicb cmd)
{
char *p, *ccmd = xstrdup(cmd);
int w, h;
Color bg;
if(!ccmd || !(p = strchr(ccmd, ' ')))
return;
if(sscanf(ccmd, "%d,%d,#%x", &w, &h, &bg) != 3
|| !w || !h)
{
free(ccmd);
return;
}
*p = '\0';
++p;
status_surface(w, h, bg, p);
free(ccmd);
}
/* Syntax: "<infobar name> <status string>" */
void
uicb_status(Uicb cmd)

View File

@ -16,6 +16,8 @@ void status_copy_mousebind(struct status_ctx *ctx);
void status_parse(struct status_ctx *ctx);
void status_render(struct status_ctx *ctx);
void status_manage(struct status_ctx *ctx);
void status_flush_surface(void);
void uicb_status(Uicb cmd);
void uicb_status_surface(Uicb cmd);
#endif /* STATUS_H */

View File

@ -149,7 +149,7 @@ parse_args(char *str, char delim, char end, int narg, char *args[])
int i = 0;
for(args[0] = str; *str && (*str != end || *(str - 1) == '\\') && i < narg; ++str)
if(*str == delim)
if(*str == delim && i < narg - 1)
{
*str = '\0';
args[++i] = ++str;

View File

@ -160,6 +160,7 @@ wmfs_xinit(void)
* Barwin linked list
*/
SLIST_INIT(&W->h.barwin);
SLIST_INIT(&W->h.vbarwin);
/*
* Optional dep init

View File

@ -95,6 +95,7 @@ struct barwin
SLIST_HEAD(, mousebind) statusmousebinds;
SLIST_ENTRY(barwin) next; /* global barwin */
SLIST_ENTRY(barwin) enext; /* element barwin */
SLIST_ENTRY(barwin) vnext; /* volatile barwin */
};
struct status_seq
@ -363,6 +364,7 @@ struct wmfs
SLIST_HEAD(, rule) rule;
SLIST_HEAD(, mousebind) mousebind;
SLIST_HEAD(, launcher) launcher;
SLIST_HEAD(, barwin) vbarwin;
} h;
/*