1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2025-02-11 08:28:30 +00:00
conky/src/x11-color.cc
Tin Švagelj 93ffab51a0
Use perfect hash (gperf) for parsing color names (#1848)
Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
2024-04-24 06:24:54 +00:00

45 lines
1.2 KiB
C++

#include "colours.h"
#include <X11/Xlib.h>
unsigned long Colour::to_x11_color(Display *display, int screen,
bool transparency, bool premultiply) {
static std::unordered_map<Colour, unsigned long, Colour::Hash> x11_pixels;
if (display == nullptr) {
/* cannot work if display is not open */
return 0;
}
unsigned long pixel;
/* Either get a cached X11 pixel or allocate one */
if (auto pixel_iter = x11_pixels.find(*this);
pixel_iter != x11_pixels.end()) {
pixel = pixel_iter->second;
} else {
XColor xcolor{};
xcolor.red = this->red * 257;
xcolor.green = this->green * 257;
xcolor.blue = this->blue * 257;
if (XAllocColor(display, DefaultColormap(display, screen), &xcolor) == 0) {
// NORM_ERR("can't allocate X color");
return 0;
}
/* Save pixel value in the cache to avoid reallocating it */
x11_pixels[*this] = xcolor.pixel;
pixel = static_cast<unsigned long>(xcolor.pixel);
}
pixel &= 0xffffff;
#ifdef BUILD_ARGB
if (transparency) {
if (premultiply)
pixel = (red * alpha / 255) << 16 | (green * alpha / 255) << 8 |
(blue * alpha / 255);
pixel |= ((unsigned long)alpha << 24);
}
#endif /* BUILD_ARGB */
return pixel;
}