color_xlib.c (2535B)
1 /* 2 * Copyright (c) 2021-2024 lumidify <nobody@lumidify.org> 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include <stddef.h> 18 19 #include <X11/Xlib.h> 20 21 #include "color.h" 22 #include "memory.h" 23 #include "graphics.h" 24 #include "graphics_xlib.h" 25 26 /* FIXME: I think xcolor is unneeded when xft is enabled */ 27 ltk_color * 28 ltk_color_create(ltk_renderdata *renderdata, const char *hex) { 29 ltk_color *col = ltk_malloc(sizeof(ltk_color)); 30 if (!XParseColor(renderdata->dpy, renderdata->cm, hex, &col->xcolor)) { 31 ltk_free(col); 32 return NULL; 33 } 34 if (!XAllocColor(renderdata->dpy, renderdata->cm, &col->xcolor)) { 35 ltk_free(col); 36 return NULL; 37 } 38 /* FIXME: replace with XftColorAllocValue */ 39 #if USE_XFT == 1 40 if (!XftColorAllocName(renderdata->dpy, renderdata->vis, renderdata->cm, hex, &col->xftcolor)) { 41 XFreeColors(renderdata->dpy, renderdata->cm, &col->xcolor.pixel, 1, 0); 42 ltk_free(col); 43 return NULL; 44 } 45 #endif 46 return col; 47 } 48 49 /* FIXME: does this actually work the way I think it does? */ 50 ltk_color * 51 ltk_color_copy(ltk_renderdata *renderdata, const ltk_color *color) { 52 ltk_color *col = ltk_malloc(sizeof(ltk_color)); 53 col->xcolor = color->xcolor; 54 if (!XAllocColor(renderdata->dpy, renderdata->cm, &col->xcolor)) { 55 ltk_free(col); 56 return NULL; 57 } 58 #if USE_XFT == 1 59 if (!XftColorAllocValue(renderdata->dpy, renderdata->vis, renderdata->cm, &color->xftcolor.color, &col->xftcolor)) { 60 XFreeColors(renderdata->dpy, renderdata->cm, &col->xcolor.pixel, 1, 0); 61 ltk_free(col); 62 return NULL; 63 } 64 #endif 65 return col; 66 } 67 68 void 69 ltk_color_destroy(ltk_renderdata *renderdata, ltk_color *col) { 70 /* FIXME: what should the 'planes' argument be? */ 71 XFreeColors(renderdata->dpy, renderdata->cm, &col->xcolor.pixel, 1, 0); 72 #if USE_XFT == 1 73 XftColorFree(renderdata->dpy, renderdata->vis, renderdata->cm, &col->xftcolor); 74 #endif 75 ltk_free(col); 76 }