From 4dc9319239a172eb9f36ca57ea539a4a28edb50f Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Fri, 24 Feb 2017 19:43:51 -0800 Subject: xserver: introduce isolated core xserver api In preparation for monitoring overlays being shared across vwm and vmon, adding a common xserver abstraction for both to use and overlay to depend on. --- src/xserver.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/xserver.c (limited to 'src/xserver.c') diff --git a/src/xserver.c b/src/xserver.c new file mode 100644 index 0000000..114a924 --- /dev/null +++ b/src/xserver.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include + +#include "util.h" +#include "xserver.h" + +/* xserver context shared by vwm and vmon. + * This is the X part monitor.c interfaces with, so monitor.c can avoid depending + * on vwm_t which won't exist in the vmon tool. + */ + +static int errhandler(Display *display, XErrorEvent *err) +{ + /* TODO */ + return 1; +} + +/* open the X display server, initializing *xserver on success. */ +vwm_xserver_t * vwm_xserver_open(void) +{ + vwm_xserver_t *xserver; + + if (!(xserver = calloc(sizeof(vwm_xserver_t), 1))) { + VWM_ERROR("Cannot allocate vwm_xserver_t"); + goto _err; + } + + if (!(xserver->display = XOpenDisplay(NULL))) { + VWM_ERROR("Cannot open display"); + goto _err_free; + } + + /* prevent children from inheriting the X connection */ + if (fcntl(ConnectionNumber(xserver->display), F_SETFD, FD_CLOEXEC) < 0) { + VWM_ERROR("Cannot set FD_CLOEXEC on X connection"); + goto _err_xclose; + } + + XSetErrorHandler(errhandler); /* TODO, this may not belong here. */ + + xserver->screen_num = DefaultScreen(xserver->display); + xserver->gc = XCreateGC(xserver->display, XSERVER_XROOT(xserver), 0, NULL); + xserver->cmap = DefaultColormap(xserver->display, xserver->screen_num); + + return xserver; + + +_err_xclose: + XCloseDisplay(xserver->display); + +_err_free: + free(xserver); + +_err: + return NULL; +} + + +/* close on opened xserver */ +void vwm_xserver_close(vwm_xserver_t *xserver) +{ + XFlush(xserver->display); + XCloseDisplay(xserver->display); + free(xserver); +} -- cgit v1.2.3