new functions ecalloc() and die()
die() replaces EBARF and BARF and allow us to add `-pedantic` to CFLAGSmain
parent
cb4265ac8c
commit
aab397c30b
4
Makefile
4
Makefile
|
@ -59,6 +59,6 @@ idle-protocol.o: idle-protocol.h
|
||||||
config.h: | config.def.h
|
config.h: | config.def.h
|
||||||
cp config.def.h $@
|
cp config.def.h $@
|
||||||
|
|
||||||
dwl.o: config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h idle-protocol.h
|
dwl.o: config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h idle-protocol.h util.h
|
||||||
|
|
||||||
dwl: xdg-shell-protocol.o wlr-layer-shell-unstable-v1-protocol.o idle-protocol.o
|
dwl: xdg-shell-protocol.o wlr-layer-shell-unstable-v1-protocol.o idle-protocol.o util.o
|
||||||
|
|
|
@ -3,7 +3,7 @@ PREFIX = /usr/local
|
||||||
MANDIR = $(PREFIX)/share/man
|
MANDIR = $(PREFIX)/share/man
|
||||||
|
|
||||||
# Default compile flags (overridable by environment)
|
# Default compile flags (overridable by environment)
|
||||||
CFLAGS ?= -g -Wall -Wextra -Werror -Wno-unused-parameter -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-unused-result -Wdeclaration-after-statement
|
CFLAGS ?= -g -Wall -Wextra -Werror -Wno-unused-parameter -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-unused-result -Wdeclaration-after-statement -pedantic
|
||||||
|
|
||||||
# Uncomment to build XWayland support
|
# Uncomment to build XWayland support
|
||||||
#CFLAGS += -DXWAYLAND
|
#CFLAGS += -DXWAYLAND
|
||||||
|
|
46
dwl.c
46
dwl.c
|
@ -54,9 +54,9 @@
|
||||||
#include <wlr/xwayland.h>
|
#include <wlr/xwayland.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
/* macros */
|
/* macros */
|
||||||
#define BARF(fmt, ...) do { fprintf(stderr, fmt "\n", ##__VA_ARGS__); exit(EXIT_FAILURE); } while (0)
|
|
||||||
#define EBARF(fmt, ...) BARF(fmt ": %s", ##__VA_ARGS__, strerror(errno))
|
|
||||||
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
||||||
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
||||||
#define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS)
|
#define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS)
|
||||||
|
@ -790,9 +790,7 @@ createkeyboard(struct wlr_input_device *device)
|
||||||
{
|
{
|
||||||
struct xkb_context *context;
|
struct xkb_context *context;
|
||||||
struct xkb_keymap *keymap;
|
struct xkb_keymap *keymap;
|
||||||
Keyboard *kb = device->data = calloc(1, sizeof(*kb));
|
Keyboard *kb = device->data = ecalloc(1, sizeof(*kb));
|
||||||
if (!kb)
|
|
||||||
EBARF("createkeyboard: calloc");
|
|
||||||
kb->device = device;
|
kb->device = device;
|
||||||
|
|
||||||
/* Prepare an XKB keymap and assign it to the keyboard. */
|
/* Prepare an XKB keymap and assign it to the keyboard. */
|
||||||
|
@ -823,9 +821,7 @@ createmon(struct wl_listener *listener, void *data)
|
||||||
* monitor) becomes available. */
|
* monitor) becomes available. */
|
||||||
struct wlr_output *wlr_output = data;
|
struct wlr_output *wlr_output = data;
|
||||||
const MonitorRule *r;
|
const MonitorRule *r;
|
||||||
Monitor *m = wlr_output->data = calloc(1, sizeof(*m));
|
Monitor *m = wlr_output->data = ecalloc(1, sizeof(*m));
|
||||||
if (!m)
|
|
||||||
EBARF("createmon: calloc");
|
|
||||||
m->wlr_output = wlr_output;
|
m->wlr_output = wlr_output;
|
||||||
|
|
||||||
wlr_output_init_render(wlr_output, alloc, drw);
|
wlr_output_init_render(wlr_output, alloc, drw);
|
||||||
|
@ -910,9 +906,7 @@ createnotify(struct wl_listener *listener, void *data)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Allocate a Client for this surface */
|
/* Allocate a Client for this surface */
|
||||||
c = xdg_surface->data = calloc(1, sizeof(*c));
|
c = xdg_surface->data = ecalloc(1, sizeof(*c));
|
||||||
if (!c)
|
|
||||||
EBARF("createnotify: calloc");
|
|
||||||
c->surface.xdg = xdg_surface;
|
c->surface.xdg = xdg_surface;
|
||||||
c->bw = borderpx;
|
c->bw = borderpx;
|
||||||
|
|
||||||
|
@ -938,9 +932,7 @@ createlayersurface(struct wl_listener *listener, void *data)
|
||||||
wlr_layer_surface->output = selmon->wlr_output;
|
wlr_layer_surface->output = selmon->wlr_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
layersurface = calloc(1, sizeof(LayerSurface));
|
layersurface = ecalloc(1, sizeof(LayerSurface));
|
||||||
if (!layersurface)
|
|
||||||
EBARF("layersurface: calloc");
|
|
||||||
layersurface->type = LayerShell;
|
layersurface->type = LayerShell;
|
||||||
LISTEN(&wlr_layer_surface->surface->events.commit,
|
LISTEN(&wlr_layer_surface->surface->events.commit,
|
||||||
&layersurface->surface_commit, commitlayersurfacenotify);
|
&layersurface->surface_commit, commitlayersurfacenotify);
|
||||||
|
@ -1744,7 +1736,7 @@ run(char *startup_cmd)
|
||||||
/* Add a Unix socket to the Wayland display. */
|
/* Add a Unix socket to the Wayland display. */
|
||||||
const char *socket = wl_display_add_socket_auto(dpy);
|
const char *socket = wl_display_add_socket_auto(dpy);
|
||||||
if (!socket)
|
if (!socket)
|
||||||
BARF("startup: display_add_socket_auto");
|
die("startup: display_add_socket_auto");
|
||||||
setenv("WAYLAND_DISPLAY", socket, 1);
|
setenv("WAYLAND_DISPLAY", socket, 1);
|
||||||
|
|
||||||
/* Now that the socket exists, run the startup command */
|
/* Now that the socket exists, run the startup command */
|
||||||
|
@ -1753,13 +1745,13 @@ run(char *startup_cmd)
|
||||||
pipe(piperw);
|
pipe(piperw);
|
||||||
startup_pid = fork();
|
startup_pid = fork();
|
||||||
if (startup_pid < 0)
|
if (startup_pid < 0)
|
||||||
EBARF("startup: fork");
|
die("startup: fork:");
|
||||||
if (startup_pid == 0) {
|
if (startup_pid == 0) {
|
||||||
dup2(piperw[0], STDIN_FILENO);
|
dup2(piperw[0], STDIN_FILENO);
|
||||||
close(piperw[0]);
|
close(piperw[0]);
|
||||||
close(piperw[1]);
|
close(piperw[1]);
|
||||||
execl("/bin/sh", "/bin/sh", "-c", startup_cmd, NULL);
|
execl("/bin/sh", "/bin/sh", "-c", startup_cmd, NULL);
|
||||||
EBARF("startup: execl");
|
die("startup: execl:");
|
||||||
}
|
}
|
||||||
dup2(piperw[1], STDOUT_FILENO);
|
dup2(piperw[1], STDOUT_FILENO);
|
||||||
close(piperw[1]);
|
close(piperw[1]);
|
||||||
|
@ -1772,7 +1764,7 @@ run(char *startup_cmd)
|
||||||
/* Start the backend. This will enumerate outputs and inputs, become the DRM
|
/* Start the backend. This will enumerate outputs and inputs, become the DRM
|
||||||
* master, etc */
|
* master, etc */
|
||||||
if (!wlr_backend_start(backend))
|
if (!wlr_backend_start(backend))
|
||||||
BARF("startup: backend_start");
|
die("startup: backend_start");
|
||||||
|
|
||||||
/* Now that outputs are initialized, choose initial selmon based on
|
/* Now that outputs are initialized, choose initial selmon based on
|
||||||
* cursor position, and set default cursor image */
|
* cursor position, and set default cursor image */
|
||||||
|
@ -1928,7 +1920,7 @@ setup(void)
|
||||||
* if the backend does not support hardware cursors (some older GPUs
|
* if the backend does not support hardware cursors (some older GPUs
|
||||||
* don't). */
|
* don't). */
|
||||||
if (!(backend = wlr_backend_autocreate(dpy)))
|
if (!(backend = wlr_backend_autocreate(dpy)))
|
||||||
BARF("couldn't create backend");
|
die("couldn't create backend");
|
||||||
|
|
||||||
/* Initialize the scene graph used to lay out windows */
|
/* Initialize the scene graph used to lay out windows */
|
||||||
scene = wlr_scene_create();
|
scene = wlr_scene_create();
|
||||||
|
@ -1942,12 +1934,12 @@ setup(void)
|
||||||
|
|
||||||
/* Create a renderer with the default implementation */
|
/* Create a renderer with the default implementation */
|
||||||
if (!(drw = wlr_renderer_autocreate(backend)))
|
if (!(drw = wlr_renderer_autocreate(backend)))
|
||||||
BARF("couldn't create renderer");
|
die("couldn't create renderer");
|
||||||
wlr_renderer_init_wl_display(drw, dpy);
|
wlr_renderer_init_wl_display(drw, dpy);
|
||||||
|
|
||||||
/* Create a default allocator */
|
/* Create a default allocator */
|
||||||
if (!(alloc = wlr_allocator_autocreate(backend, drw)))
|
if (!(alloc = wlr_allocator_autocreate(backend, drw)))
|
||||||
BARF("couldn't create allocator");
|
die("couldn't create allocator");
|
||||||
|
|
||||||
/* This creates some hands-off wlroots interfaces. The compositor is
|
/* This creates some hands-off wlroots interfaces. The compositor is
|
||||||
* necessary for clients to allocate surfaces and the data device manager
|
* necessary for clients to allocate surfaces and the data device manager
|
||||||
|
@ -2088,7 +2080,7 @@ sigchld(int unused)
|
||||||
* setting our own disposition for SIGCHLD.
|
* setting our own disposition for SIGCHLD.
|
||||||
*/
|
*/
|
||||||
if (signal(SIGCHLD, sigchld) == SIG_ERR)
|
if (signal(SIGCHLD, sigchld) == SIG_ERR)
|
||||||
EBARF("can't install SIGCHLD handler");
|
die("can't install SIGCHLD handler:");
|
||||||
while (0 < waitpid(-1, NULL, WNOHANG))
|
while (0 < waitpid(-1, NULL, WNOHANG))
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -2100,7 +2092,7 @@ spawn(const Arg *arg)
|
||||||
dup2(STDERR_FILENO, STDOUT_FILENO);
|
dup2(STDERR_FILENO, STDOUT_FILENO);
|
||||||
setsid();
|
setsid();
|
||||||
execvp(((char **)arg->v)[0], (char **)arg->v);
|
execvp(((char **)arg->v)[0], (char **)arg->v);
|
||||||
EBARF("dwl: execvp %s failed", ((char **)arg->v)[0]);
|
die("dwl: execvp %s failed:", ((char **)arg->v)[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2435,9 +2427,7 @@ createnotifyx11(struct wl_listener *listener, void *data)
|
||||||
setfullscreen(c, 0);
|
setfullscreen(c, 0);
|
||||||
|
|
||||||
/* Allocate a Client for this surface */
|
/* Allocate a Client for this surface */
|
||||||
c = xwayland_surface->data = calloc(1, sizeof(*c));
|
c = xwayland_surface->data = ecalloc(1, sizeof(*c));
|
||||||
if (!c)
|
|
||||||
EBARF("createnotifyx11: calloc");
|
|
||||||
c->surface.xwayland = xwayland_surface;
|
c->surface.xwayland = xwayland_surface;
|
||||||
c->type = xwayland_surface->override_redirect ? X11Unmanaged : X11Managed;
|
c->type = xwayland_surface->override_redirect ? X11Unmanaged : X11Managed;
|
||||||
c->bw = borderpx;
|
c->bw = borderpx;
|
||||||
|
@ -2517,12 +2507,12 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
/* Wayland requires XDG_RUNTIME_DIR for creating its communications socket */
|
/* Wayland requires XDG_RUNTIME_DIR for creating its communications socket */
|
||||||
if (!getenv("XDG_RUNTIME_DIR"))
|
if (!getenv("XDG_RUNTIME_DIR"))
|
||||||
BARF("XDG_RUNTIME_DIR must be set");
|
die("XDG_RUNTIME_DIR must be set");
|
||||||
setup();
|
setup();
|
||||||
run(startup_cmd);
|
run(startup_cmd);
|
||||||
cleanup();
|
cleanup();
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
usage:
|
usage:
|
||||||
BARF("Usage: %s [-s startup command]", argv[0]);
|
die("Usage: %s [-s startup command]", argv[0]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
/* See LICENSE.dwm file for copyright and license details. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
void *
|
||||||
|
ecalloc(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
if (!(p = calloc(nmemb, size)))
|
||||||
|
die("calloc:");
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
die(const char *fmt, ...) {
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
|
||||||
|
fputc(' ', stderr);
|
||||||
|
perror(NULL);
|
||||||
|
} else {
|
||||||
|
fputc('\n', stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(1);
|
||||||
|
}
|
Loading…
Reference in New Issue