/* * (C)opyright MMVI-MMVII Anselm R. Garbe * (C)opyright MMVII Robert Manea * See LICENSE file for license details. * */ #include "dzen.h" #include #include #include #include #include #include #define COLORCACHE_MAX 256 static char *colorcache_names[COLORCACHE_MAX]; static long colorcache_values[COLORCACHE_MAX]; #ifdef DZEN_XFT static char *xftcolorcache_names[COLORCACHE_MAX]; static XftColor xftcolorcache_values[COLORCACHE_MAX]; #endif #define ONEMASK ((size_t)(-1) / 0xFF) void * emalloc(unsigned int size) { void *res = malloc(size); if(!res) eprint("fatal: could not malloc() %u bytes\n", size); return res; } void eprint(const char *errstr, ...) { va_list ap; va_start(ap, errstr); vfprintf(stderr, errstr, ap); va_end(ap); exit(EXIT_FAILURE); } char * estrdup(const char *str) { void *res = strdup(str); if(!res) eprint("fatal: could not malloc() %u bytes\n", strlen(str)); return res; } void spawn(const char *arg) { static const char *shell = NULL; if(!shell && !(shell = getenv("SHELL"))) shell = "/bin/sh"; if(!arg) return; /* The double-fork construct avoids zombie processes and keeps the code * clean from stupid signal handlers. */ if(fork() == 0) { if(fork() == 0) { setsid(); execl(shell, shell, "-c", arg, (char *)NULL); fprintf(stderr, "dzen: execl '%s -c %s'", shell, arg); perror(" failed"); } exit(0); } wait(0); } long colorcache_get(const char *name) { int i; for (i = 0; i < COLORCACHE_MAX; ++i) { if (!colorcache_names[i]) break; if (!strcmp(colorcache_names[i], name)) return colorcache_values[i]; } return -1; } void colorcache_set(const char *name, long value) { int i; for (i = 0; i < COLORCACHE_MAX; ++i) if (!colorcache_names[i]) break; if (i >= COLORCACHE_MAX) return; colorcache_names[i] = strdup(name); colorcache_values[i] = value; } #ifdef DZEN_XFT int xftcolorcache_get(const char *name, XftColor *color) { int i; for (i = 0; i < COLORCACHE_MAX; ++i) { if (!xftcolorcache_names[i]) break; if (!strcmp(xftcolorcache_names[i], name)) { memcpy(color, &xftcolorcache_values[i], sizeof(XftColor)); return 1; } } return 0; } void xftcolorcache_set(const char *name, XftColor *color) { int i; for (i = 0; i < COLORCACHE_MAX; ++i) if (!xftcolorcache_names[i]) break; if (i >= COLORCACHE_MAX) return; xftcolorcache_names[i] = strdup(name); memcpy(&xftcolorcache_values[i], color, sizeof(XftColor)); } #endif