92 lines
2.2 KiB
C
92 lines
2.2 KiB
C
/*
|
|
* wmfs2 by Martin Duquesnoy <xorg62@gmail.com> { for(i = 2011; i < 2111; ++i) ©(i); }
|
|
* For license, see COPYING.
|
|
*/
|
|
|
|
#ifndef INFOBAR_H
|
|
#define INFOBAR_H
|
|
|
|
#include "wmfs.h"
|
|
#include "util.h"
|
|
#include "tag.h"
|
|
|
|
enum { ElemTag = 0, ElemStatus, ElemSystray, ElemLauncher, ElemCustom, ElemLast };
|
|
|
|
struct infobar *infobar_new(struct screen *s, char *name, struct theme *theme, enum barpos pos, const char *elem);
|
|
void infobar_elem_update(struct infobar *i, int type);
|
|
void infobar_refresh(struct infobar *i);
|
|
void infobar_remove(struct infobar *i);
|
|
void infobar_free(struct screen *s);
|
|
void infobar_elem_reinit(struct infobar *i);
|
|
|
|
/* Basic placement of elements */
|
|
static inline void
|
|
infobar_elem_placement(struct element *e)
|
|
{
|
|
struct element *p = TAILQ_PREV(e, esub, next);
|
|
|
|
e->geo.y = 0;
|
|
e->geo.h = e->infobar->geo.h;
|
|
|
|
if(e->align == Left)
|
|
e->geo.x = (p ? p->geo.x + p->geo.w : 0);
|
|
else
|
|
e->geo.x = ((p = TAILQ_NEXT(e, next))
|
|
? p->geo.x - e->geo.w
|
|
: e->infobar->geo.w - e->geo.w);
|
|
}
|
|
|
|
/* Bars placement management and usable space management */
|
|
static inline bool
|
|
infobar_placement(struct infobar *i, enum barpos p)
|
|
{
|
|
i->pos = p;
|
|
i->geo = i->screen->ugeo;
|
|
i->geo.h = i->theme->bars_width;
|
|
|
|
switch(p)
|
|
{
|
|
case BarTop:
|
|
i->screen->ugeo.y += i->geo.h;
|
|
i->screen->ugeo.h -= i->geo.h;
|
|
break;
|
|
case BarBottom:
|
|
i->geo.y = (i->screen->ugeo.y + i->screen->ugeo.h) - i->geo.h;
|
|
i->screen->ugeo.h -= i->geo.h;
|
|
break;
|
|
default:
|
|
case BarHide:
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static inline void
|
|
infobar_elem_screen_update(struct screen *s, int type)
|
|
{
|
|
struct infobar *i;
|
|
|
|
SLIST_FOREACH(i, &s->infobars, next)
|
|
infobar_elem_update(i, type);
|
|
|
|
}
|
|
|
|
static inline struct infobar*
|
|
infobar_gb_name(const char *name)
|
|
{
|
|
struct screen *s;
|
|
struct infobar *i;
|
|
|
|
SLIST_FOREACH(s, &W->h.screen, next)
|
|
{
|
|
SLIST_FOREACH(i, &s->infobars, next)
|
|
if(!strcmp(i->name, name))
|
|
return i;
|
|
}
|
|
|
|
return SLIST_FIRST(&s->infobars);
|
|
}
|
|
|
|
#endif /* INFOBAR_H */
|