2021-12-04 18:42:03 +00:00
|
|
|
#include "logger.h"
|
2021-11-21 01:49:30 +00:00
|
|
|
#include "util.h"
|
|
|
|
|
2013-04-17 19:21:47 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <X11/Xlib.h>
|
2015-03-06 04:26:11 +00:00
|
|
|
#include <X11/Xft/Xft.h>
|
2013-04-17 19:21:47 +00:00
|
|
|
|
2021-11-21 01:49:30 +00:00
|
|
|
// TODO: Include necessary headers in this header.
|
2013-04-17 19:21:47 +00:00
|
|
|
#include "drw.h"
|
|
|
|
|
2022-09-08 20:35:00 +00:00
|
|
|
static void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
|
2015-03-06 04:26:11 +00:00
|
|
|
|
2013-04-17 19:21:47 +00:00
|
|
|
Drw *
|
2021-12-04 17:05:41 +00:00
|
|
|
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
|
2015-10-20 21:34:49 +00:00
|
|
|
{
|
2016-05-22 20:33:56 +00:00
|
|
|
Drw *drw = ecalloc(1, sizeof(Drw));
|
2015-10-20 21:34:49 +00:00
|
|
|
|
2013-04-17 19:21:47 +00:00
|
|
|
drw->dpy = dpy;
|
|
|
|
drw->screen = screen;
|
2013-06-16 13:20:29 +00:00
|
|
|
drw->root = root;
|
2021-12-04 17:05:41 +00:00
|
|
|
drw->w = w;
|
|
|
|
drw->h = h;
|
|
|
|
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
|
2013-06-16 13:20:29 +00:00
|
|
|
drw->gc = XCreateGC(dpy, root, 0, NULL);
|
2013-04-17 19:21:47 +00:00
|
|
|
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
|
2015-10-20 21:34:49 +00:00
|
|
|
|
2013-04-17 19:21:47 +00:00
|
|
|
return drw;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2015-10-20 21:34:49 +00:00
|
|
|
drw_free(Drw *drw)
|
|
|
|
{
|
2013-06-16 13:20:29 +00:00
|
|
|
XFreePixmap(drw->dpy, drw->drawable);
|
2013-04-17 19:21:47 +00:00
|
|
|
XFreeGC(drw->dpy, drw->gc);
|
|
|
|
free(drw);
|
|
|
|
}
|
|
|
|
|
2016-05-22 20:33:56 +00:00
|
|
|
void
|
2017-11-03 20:20:48 +00:00
|
|
|
drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
|
2015-10-20 21:34:49 +00:00
|
|
|
{
|
2016-05-22 20:33:56 +00:00
|
|
|
if (!drw || !dest || !clrname)
|
|
|
|
return;
|
2015-10-20 21:34:49 +00:00
|
|
|
|
|
|
|
if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
|
|
|
|
DefaultColormap(drw->dpy, drw->screen),
|
2016-05-22 20:33:56 +00:00
|
|
|
clrname, dest))
|
2021-11-21 02:25:19 +00:00
|
|
|
fatal("error, cannot allocate color '%s'", clrname);
|
2016-05-22 20:33:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Wrapper to create color schemes. The caller has to call free(3) on the
|
|
|
|
* returned color scheme when done using it. */
|
2017-11-03 20:20:48 +00:00
|
|
|
Clr *
|
2016-05-22 20:33:56 +00:00
|
|
|
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
|
|
|
{
|
|
|
|
size_t i;
|
2017-11-03 20:20:48 +00:00
|
|
|
Clr *ret;
|
2016-05-22 20:33:56 +00:00
|
|
|
|
|
|
|
/* need at least two colors for a scheme */
|
2019-02-02 12:50:42 +00:00
|
|
|
if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
|
2016-05-22 20:33:56 +00:00
|
|
|
return NULL;
|
2015-10-20 21:34:49 +00:00
|
|
|
|
2016-05-22 20:33:56 +00:00
|
|
|
for (i = 0; i < clrcount; i++)
|
|
|
|
drw_clr_create(drw, &ret[i], clrnames[i]);
|
|
|
|
return ret;
|
2013-04-17 19:21:47 +00:00
|
|
|
}
|
|
|
|
|
2013-06-16 13:20:29 +00:00
|
|
|
Cur *
|
2015-10-20 21:34:49 +00:00
|
|
|
drw_cur_create(Drw *drw, int shape)
|
|
|
|
{
|
|
|
|
Cur *cur;
|
2013-06-16 13:20:29 +00:00
|
|
|
|
2016-05-22 20:33:56 +00:00
|
|
|
if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
|
|
|
|
return NULL;
|
|
|
|
|
2013-06-16 13:20:29 +00:00
|
|
|
cur->cursor = XCreateFontCursor(drw->dpy, shape);
|
2015-10-20 21:34:49 +00:00
|
|
|
|
2013-06-16 13:20:29 +00:00
|
|
|
return cur;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2015-10-20 21:34:49 +00:00
|
|
|
drw_cur_free(Drw *drw, Cur *cursor)
|
|
|
|
{
|
|
|
|
if (!cursor)
|
2013-06-16 13:20:29 +00:00
|
|
|
return;
|
2016-05-22 20:33:56 +00:00
|
|
|
|
2013-06-16 13:20:29 +00:00
|
|
|
XFreeCursor(drw->dpy, cursor->cursor);
|
|
|
|
free(cursor);
|
|
|
|
}
|