2006-02-10 00:48:01 +03:00
|
|
|
/*
|
|
|
|
* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
|
|
|
|
* See LICENSE file for license details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <string.h>
|
2006-03-09 04:15:43 +03:00
|
|
|
#include <stdlib.h>
|
2006-02-10 00:48:01 +03:00
|
|
|
|
|
|
|
#include "wm.h"
|
|
|
|
|
2006-03-09 04:15:43 +03:00
|
|
|
static int
|
|
|
|
comp_label(const void *l1, const void *l2)
|
|
|
|
{
|
2006-03-09 04:43:20 +03:00
|
|
|
Label *ll1 = *(Label **)l1;
|
|
|
|
Label *ll2 = *(Label **)l2;
|
|
|
|
return strcmp(ll1->name, ll2->name);
|
2006-03-09 04:15:43 +03:00
|
|
|
}
|
|
|
|
|
2006-02-10 17:59:30 +03:00
|
|
|
Label *
|
2006-03-09 04:15:43 +03:00
|
|
|
get_label(char *name)
|
2006-02-10 00:48:01 +03:00
|
|
|
{
|
|
|
|
static unsigned int id = 1;
|
2006-03-09 04:15:43 +03:00
|
|
|
Label *l = name2label(name);
|
|
|
|
|
|
|
|
if(l)
|
|
|
|
return l;
|
|
|
|
l = cext_emallocz(sizeof(Label));
|
2006-02-10 17:59:30 +03:00
|
|
|
l->id = id++;
|
2006-03-09 04:15:43 +03:00
|
|
|
cext_strlcpy(l->name, name, sizeof(l->name));
|
2006-02-10 17:59:30 +03:00
|
|
|
cext_strlcpy(l->colstr, def.selcolor, sizeof(l->colstr));
|
|
|
|
l->color = def.sel;
|
|
|
|
label = (Label **)cext_array_attach((void **)label, l, sizeof(Label *), &labelsz);
|
|
|
|
nlabel++;
|
2006-03-09 04:15:43 +03:00
|
|
|
qsort(label, nlabel, sizeof(Label *), comp_label);
|
2006-03-09 04:43:20 +03:00
|
|
|
|
2006-02-10 17:59:30 +03:00
|
|
|
return l;
|
2006-02-10 00:48:01 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2006-03-09 04:15:43 +03:00
|
|
|
destroy_label(Label *l)
|
2006-02-10 00:48:01 +03:00
|
|
|
{
|
2006-02-10 17:59:30 +03:00
|
|
|
cext_array_detach((void **)label, l, &labelsz);
|
|
|
|
nlabel--;
|
2006-02-10 00:48:01 +03:00
|
|
|
}
|
|
|
|
|
2006-02-24 12:38:48 +03:00
|
|
|
unsigned int
|
|
|
|
bar_height()
|
|
|
|
{
|
|
|
|
return xfont->ascent + xfont->descent + 4;
|
|
|
|
}
|
|
|
|
|
2006-02-10 20:32:35 +03:00
|
|
|
void
|
|
|
|
update_bar_geometry()
|
|
|
|
{
|
2006-03-01 13:55:46 +03:00
|
|
|
unsigned int i, j;
|
2006-02-10 20:32:35 +03:00
|
|
|
brect = rect;
|
2006-02-24 12:38:48 +03:00
|
|
|
brect.height = bar_height();
|
2006-02-10 20:32:35 +03:00
|
|
|
brect.y = rect.height - brect.height;
|
2006-03-10 20:35:00 +03:00
|
|
|
XMoveResizeWindow(dpy, barwin, brect.x, brect.y, brect.width, brect.height);
|
2006-02-10 20:32:35 +03:00
|
|
|
XSync(dpy, False);
|
2006-03-10 20:35:00 +03:00
|
|
|
XFreePixmap(dpy, barpmap);
|
|
|
|
barpmap = XCreatePixmap(dpy, barwin, brect.width, brect.height, DefaultDepth(dpy, screen));
|
2006-02-10 20:32:35 +03:00
|
|
|
XSync(dpy, False);
|
|
|
|
draw_bar();
|
2006-03-04 11:23:17 +03:00
|
|
|
for(i = 0; i < ntag; i++)
|
|
|
|
for(j = 1; j < tag[i]->narea; j++) {
|
|
|
|
update_area_geometry(tag[i]->area[j]);
|
|
|
|
arrange_area(tag[i]->area[j]);
|
2006-02-19 17:40:44 +03:00
|
|
|
}
|
2006-02-10 20:32:35 +03:00
|
|
|
}
|
|
|
|
|
2006-02-10 00:48:01 +03:00
|
|
|
void
|
|
|
|
draw_bar()
|
|
|
|
{
|
2006-03-09 04:43:20 +03:00
|
|
|
unsigned int i, iexp = 0;
|
2006-02-10 00:48:01 +03:00
|
|
|
unsigned int w = 0;
|
2006-03-09 04:43:20 +03:00
|
|
|
Label *exp = name2label(expand);
|
2006-02-10 00:48:01 +03:00
|
|
|
Draw d = { 0 };
|
|
|
|
|
2006-03-09 04:43:20 +03:00
|
|
|
if(exp)
|
|
|
|
iexp = label2index(exp);
|
|
|
|
|
2006-02-10 00:48:01 +03:00
|
|
|
d.align = WEST;
|
2006-03-10 20:35:00 +03:00
|
|
|
d.gc = bargc;
|
|
|
|
d.drawable = barpmap;
|
2006-02-10 00:48:01 +03:00
|
|
|
d.rect = brect;
|
|
|
|
d.rect.y = 0;
|
|
|
|
d.font = xfont;
|
|
|
|
|
2006-02-10 17:59:30 +03:00
|
|
|
if(!nlabel) { /* /default only */
|
2006-02-10 00:48:01 +03:00
|
|
|
d.color = def.sel;
|
|
|
|
blitz_drawlabel(dpy, &d);
|
2006-03-10 20:22:48 +03:00
|
|
|
blitz_drawborder(dpy, &d);
|
2006-02-10 00:48:01 +03:00
|
|
|
}
|
|
|
|
else {
|
2006-02-10 17:59:30 +03:00
|
|
|
for(i = 0; i < nlabel; i++) {
|
|
|
|
Label *l = label[i];
|
|
|
|
l->rect.x = l->rect.y = 0;
|
|
|
|
l->rect.height = brect.height;
|
2006-03-09 04:43:20 +03:00
|
|
|
if(i == iexp)
|
2006-02-10 00:48:01 +03:00
|
|
|
continue;
|
2006-02-10 17:59:30 +03:00
|
|
|
l->rect.width = brect.height;
|
2006-03-11 01:34:13 +03:00
|
|
|
if(strlen(l->data))
|
|
|
|
l->rect.width += XTextWidth(xfont, l->data, strlen(l->data));
|
2006-02-10 17:59:30 +03:00
|
|
|
w += l->rect.width;
|
2006-02-10 00:48:01 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if(w >= brect.width) {
|
|
|
|
/* failsafe mode, give all labels same width */
|
2006-02-10 17:59:30 +03:00
|
|
|
w = brect.width / nlabel;
|
|
|
|
for(i = 0; i < nlabel; i++) {
|
|
|
|
label[i]->rect.x = i * w;
|
|
|
|
label[i]->rect.width = w;
|
2006-02-10 00:48:01 +03:00
|
|
|
}
|
|
|
|
i--;
|
2006-02-10 17:59:30 +03:00
|
|
|
label[i]->rect.width = brect.width - label[i]->rect.x;
|
2006-02-10 00:48:01 +03:00
|
|
|
}
|
|
|
|
else {
|
2006-03-09 04:43:20 +03:00
|
|
|
label[iexp]->rect.width = brect.width - w;
|
2006-02-10 17:59:30 +03:00
|
|
|
for(i = 1; i < nlabel; i++)
|
|
|
|
label[i]->rect.x = label[i - 1]->rect.x + label[i - 1]->rect.width;
|
2006-02-10 00:48:01 +03:00
|
|
|
}
|
|
|
|
|
2006-02-10 17:59:30 +03:00
|
|
|
for(i = 0; i < nlabel; i++) {
|
|
|
|
d.color = label[i]->color;
|
|
|
|
d.rect = label[i]->rect;
|
|
|
|
d.data = label[i]->data;
|
2006-03-10 20:35:00 +03:00
|
|
|
blitz_drawlabel(dpy, &d);
|
2006-03-10 20:22:48 +03:00
|
|
|
blitz_drawborder(dpy, &d);
|
2006-02-10 00:48:01 +03:00
|
|
|
}
|
|
|
|
}
|
2006-03-10 20:35:00 +03:00
|
|
|
XCopyArea(dpy, barpmap, barwin, bargc, 0, 0, brect.width, brect.height, 0, 0);
|
2006-02-10 00:48:01 +03:00
|
|
|
XSync(dpy, False);
|
|
|
|
}
|
|
|
|
|
2006-03-09 04:15:43 +03:00
|
|
|
int
|
|
|
|
label2index(Label *l)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < nlabel; i++)
|
|
|
|
if(label[i] == l)
|
|
|
|
return i;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2006-02-10 00:48:01 +03:00
|
|
|
int
|
2006-03-01 09:51:04 +03:00
|
|
|
lid2index(unsigned short id)
|
2006-02-10 00:48:01 +03:00
|
|
|
{
|
|
|
|
int i;
|
2006-02-10 17:59:30 +03:00
|
|
|
for(i = 0; i < nlabel; i++)
|
|
|
|
if(label[i]->id == id)
|
2006-02-10 00:48:01 +03:00
|
|
|
return i;
|
|
|
|
return -1;
|
|
|
|
}
|
2006-03-09 04:15:43 +03:00
|
|
|
|
|
|
|
Label *
|
|
|
|
name2label(const char *name)
|
|
|
|
{
|
|
|
|
char buf[256];
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
cext_strlcpy(buf, name, sizeof(buf));
|
|
|
|
for(i = 0; i < nlabel; i++)
|
|
|
|
if(!strncmp(label[i]->name, name, sizeof(label[i]->name)))
|
|
|
|
return label[i];
|
|
|
|
return nil;
|
|
|
|
}
|