2021-11-22 04:07:13 +00:00
|
|
|
#include "xbase.h"
|
|
|
|
|
|
|
|
#include "main.h"
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2021-11-22 04:48:33 +00:00
|
|
|
/* Startup Error handler to check if another
|
|
|
|
* window manager is already running. */
|
|
|
|
static int x_error_wm_check(Display*, XErrorEvent*);
|
|
|
|
|
|
|
|
Xbase xbase_new(
|
|
|
|
const char *const program_title,
|
|
|
|
const XErrorHandler x_error_handler
|
|
|
|
) {
|
2021-11-22 04:07:13 +00:00
|
|
|
if (!XSupportsLocale()) warning("no locale support in X");
|
|
|
|
|
|
|
|
Xbase xbase = malloc(sizeof(struct Xbase));
|
|
|
|
if (!xbase) fatal_perror("cannot allocate xbase");
|
|
|
|
|
|
|
|
if (!(xbase->program_title = strdup(program_title))) {
|
|
|
|
fatal_perror("no program title is given");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(xbase->x_display = XOpenDisplay(NULL))) {
|
|
|
|
fatal("cannot open X display");
|
|
|
|
}
|
|
|
|
|
|
|
|
xbase->x_screen = DefaultScreen(xbase->x_display);
|
2021-11-22 04:22:00 +00:00
|
|
|
xbase->x_root = RootWindow(xbase->x_display, xbase->x_screen);
|
2021-11-22 04:07:13 +00:00
|
|
|
xbase->screen_sizes = sizes_create_from_args(
|
|
|
|
DisplayWidth(xbase->x_display, xbase->x_screen),
|
|
|
|
DisplayHeight(xbase->x_display, xbase->x_screen)
|
|
|
|
);
|
|
|
|
|
2021-11-22 04:48:33 +00:00
|
|
|
if (!(xbase->x_error = XSetErrorHandler(x_error_wm_check))) {
|
|
|
|
fatal("no X error handler is given");
|
|
|
|
}
|
|
|
|
|
|
|
|
// This causes an error if some other window manager is running
|
|
|
|
XSelectInput(
|
|
|
|
xbase->x_display,
|
|
|
|
DefaultRootWindow(xbase->x_display),
|
|
|
|
SubstructureRedirectMask
|
|
|
|
);
|
|
|
|
XSync(xbase->x_display, False);
|
|
|
|
XSetErrorHandler(x_error_handler);
|
|
|
|
XSync(xbase->x_display, False);
|
|
|
|
|
2021-12-04 16:47:37 +00:00
|
|
|
if (!(xbase->atoms = atoms_create(xbase->x_display))) {
|
|
|
|
fatal("cannot create atoms");
|
|
|
|
}
|
|
|
|
|
2021-11-22 04:07:13 +00:00
|
|
|
return xbase;
|
|
|
|
}
|
|
|
|
|
|
|
|
void xbase_delete(const Xbase xbase)
|
|
|
|
{
|
|
|
|
// TODO: maybe we should assert here
|
|
|
|
if (xbase == NULL) return;
|
|
|
|
|
2021-12-04 16:47:37 +00:00
|
|
|
ATOMS_DELETE(xbase->atoms);
|
2021-11-22 04:07:13 +00:00
|
|
|
XCloseDisplay(xbase->x_display);
|
|
|
|
free(xbase);
|
|
|
|
}
|
2021-11-22 04:48:33 +00:00
|
|
|
|
|
|
|
int x_error_wm_check(
|
|
|
|
__attribute__((unused)) Display *const x_display,
|
|
|
|
__attribute__((unused)) XErrorEvent *const x_error_event
|
|
|
|
) {
|
|
|
|
fatal("another window manager is already running");
|
|
|
|
}
|