Merge branch 'main' into wlroots-next
commit
34521ea43b
|
@ -38,7 +38,7 @@ Feature *non-goals* for the main codebase include:
|
||||||
|
|
||||||
## Building dwl
|
## Building dwl
|
||||||
|
|
||||||
dwl has only two dependencies: wlroots-git and wayland-protocols. Simply install these and run `make`.
|
dwl has only two dependencies: wlroots-git and wayland-protocols. Simply install these (and their `-devel` versions if your distro has separate development packages) and run `make`.
|
||||||
|
|
||||||
To enable XWayland, you should also install xorg-xwayland and uncomment its flag in `config.mk`.
|
To enable XWayland, you should also install xorg-xwayland and uncomment its flag in `config.mk`.
|
||||||
|
|
||||||
|
|
105
dwl.c
105
dwl.c
|
@ -259,6 +259,7 @@ static void pointerfocus(Client *c, struct wlr_surface *surface,
|
||||||
double sx, double sy, uint32_t time);
|
double sx, double sy, uint32_t time);
|
||||||
static void printstatus(void);
|
static void printstatus(void);
|
||||||
static void quit(const Arg *arg);
|
static void quit(const Arg *arg);
|
||||||
|
static void quitsignal(int signo);
|
||||||
static void render(struct wlr_surface *surface, int sx, int sy, void *data);
|
static void render(struct wlr_surface *surface, int sx, int sy, void *data);
|
||||||
static void renderclients(Monitor *m, struct timespec *now);
|
static void renderclients(Monitor *m, struct timespec *now);
|
||||||
static void renderlayer(struct wl_list *layer_surfaces, struct timespec *now);
|
static void renderlayer(struct wl_list *layer_surfaces, struct timespec *now);
|
||||||
|
@ -842,11 +843,13 @@ createmon(struct wl_listener *listener, void *data)
|
||||||
LISTEN(&wlr_output->events.frame, &m->frame, rendermon);
|
LISTEN(&wlr_output->events.frame, &m->frame, rendermon);
|
||||||
LISTEN(&wlr_output->events.destroy, &m->destroy, cleanupmon);
|
LISTEN(&wlr_output->events.destroy, &m->destroy, cleanupmon);
|
||||||
|
|
||||||
wl_list_insert(&mons, &m->link);
|
|
||||||
wlr_output_enable(wlr_output, 1);
|
wlr_output_enable(wlr_output, 1);
|
||||||
if (!wlr_output_commit(wlr_output))
|
if (!wlr_output_commit(wlr_output))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
wl_list_insert(&mons, &m->link);
|
||||||
|
printstatus();
|
||||||
|
|
||||||
/* Adds this to the output layout in the order it was configured in.
|
/* Adds this to the output layout in the order it was configured in.
|
||||||
*
|
*
|
||||||
* The output layout utility automatically adds a wl_output global to the
|
* The output layout utility automatically adds a wl_output global to the
|
||||||
|
@ -1576,6 +1579,12 @@ quit(const Arg *arg)
|
||||||
wl_display_terminate(dpy);
|
wl_display_terminate(dpy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
quitsignal(int signo)
|
||||||
|
{
|
||||||
|
quit(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
render(struct wlr_surface *surface, int sx, int sy, void *data)
|
render(struct wlr_surface *surface, int sx, int sy, void *data)
|
||||||
{
|
{
|
||||||
|
@ -1724,38 +1733,42 @@ rendermon(struct wl_listener *listener, void *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* wlr_output_attach_render makes the OpenGL context current. */
|
/* HACK: This loop is the simplest way to handle ephemeral pageflip
|
||||||
if (!wlr_output_attach_render(m->wlr_output, NULL))
|
* failures but probably not the best. Revisit if damage tracking is
|
||||||
return;
|
* added. */
|
||||||
|
do {
|
||||||
|
/* wlr_output_attach_render makes the OpenGL context current. */
|
||||||
|
if (!wlr_output_attach_render(m->wlr_output, NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
if (render) {
|
if (render) {
|
||||||
/* Begin the renderer (calls glViewport and some other GL sanity checks) */
|
/* Begin the renderer (calls glViewport and some other GL sanity checks) */
|
||||||
wlr_renderer_begin(drw, m->wlr_output->width, m->wlr_output->height);
|
wlr_renderer_begin(drw, m->wlr_output->width, m->wlr_output->height);
|
||||||
wlr_renderer_clear(drw, rootcolor);
|
wlr_renderer_clear(drw, rootcolor);
|
||||||
|
|
||||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], &now);
|
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], &now);
|
||||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM], &now);
|
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM], &now);
|
||||||
renderclients(m, &now);
|
renderclients(m, &now);
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
renderindependents(m->wlr_output, &now);
|
renderindependents(m->wlr_output, &now);
|
||||||
#endif
|
#endif
|
||||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &now);
|
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &now);
|
||||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], &now);
|
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], &now);
|
||||||
|
|
||||||
/* Hardware cursors are rendered by the GPU on a separate plane, and can be
|
/* Hardware cursors are rendered by the GPU on a separate plane, and can be
|
||||||
* moved around without re-rendering what's beneath them - which is more
|
* moved around without re-rendering what's beneath them - which is more
|
||||||
* efficient. However, not all hardware supports hardware cursors. For this
|
* efficient. However, not all hardware supports hardware cursors. For this
|
||||||
* reason, wlroots provides a software fallback, which we ask it to render
|
* reason, wlroots provides a software fallback, which we ask it to render
|
||||||
* here. wlr_cursor handles configuring hardware vs software cursors for you,
|
* here. wlr_cursor handles configuring hardware vs software cursors for you,
|
||||||
* and this function is a no-op when hardware cursors are in use. */
|
* and this function is a no-op when hardware cursors are in use. */
|
||||||
wlr_output_render_software_cursors(m->wlr_output, NULL);
|
wlr_output_render_software_cursors(m->wlr_output, NULL);
|
||||||
|
|
||||||
/* Conclude rendering and swap the buffers, showing the final frame
|
/* Conclude rendering and swap the buffers, showing the final frame
|
||||||
* on-screen. */
|
* on-screen. */
|
||||||
wlr_renderer_end(drw);
|
wlr_renderer_end(drw);
|
||||||
}
|
}
|
||||||
|
|
||||||
wlr_output_commit(m->wlr_output);
|
} while (!wlr_output_commit(m->wlr_output));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1786,27 +1799,9 @@ run(char *startup_cmd)
|
||||||
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");
|
BARF("startup: display_add_socket_auto");
|
||||||
|
|
||||||
/* Start the backend. This will enumerate outputs and inputs, become the DRM
|
|
||||||
* master, etc */
|
|
||||||
if (!wlr_backend_start(backend))
|
|
||||||
BARF("startup: backend_start");
|
|
||||||
|
|
||||||
/* Now that outputs are initialized, choose initial selmon based on
|
|
||||||
* cursor position, and set default cursor image */
|
|
||||||
selmon = xytomon(cursor->x, cursor->y);
|
|
||||||
|
|
||||||
/* TODO hack to get cursor to display in its initial location (100, 100)
|
|
||||||
* instead of (0, 0) and then jumping. still may not be fully
|
|
||||||
* initialized, as the image/coordinates are not transformed for the
|
|
||||||
* monitor when displayed here */
|
|
||||||
wlr_cursor_warp_closest(cursor, NULL, cursor->x, cursor->y);
|
|
||||||
wlr_xcursor_manager_set_cursor_image(cursor_mgr, "left_ptr", cursor);
|
|
||||||
|
|
||||||
/* Set the WAYLAND_DISPLAY environment variable to our socket and run the
|
|
||||||
* startup command if requested. */
|
|
||||||
setenv("WAYLAND_DISPLAY", socket, 1);
|
setenv("WAYLAND_DISPLAY", socket, 1);
|
||||||
|
|
||||||
|
/* Now that the socket exists, run the startup command */
|
||||||
if (startup_cmd) {
|
if (startup_cmd) {
|
||||||
int piperw[2];
|
int piperw[2];
|
||||||
pipe(piperw);
|
pipe(piperw);
|
||||||
|
@ -1825,6 +1820,22 @@ run(char *startup_cmd)
|
||||||
/* If nobody is reading the status output, don't terminate */
|
/* If nobody is reading the status output, don't terminate */
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
|
/* Start the backend. This will enumerate outputs and inputs, become the DRM
|
||||||
|
* master, etc */
|
||||||
|
if (!wlr_backend_start(backend))
|
||||||
|
BARF("startup: backend_start");
|
||||||
|
|
||||||
|
/* Now that outputs are initialized, choose initial selmon based on
|
||||||
|
* cursor position, and set default cursor image */
|
||||||
|
selmon = xytomon(cursor->x, cursor->y);
|
||||||
|
|
||||||
|
/* TODO hack to get cursor to display in its initial location (100, 100)
|
||||||
|
* instead of (0, 0) and then jumping. still may not be fully
|
||||||
|
* initialized, as the image/coordinates are not transformed for the
|
||||||
|
* monitor when displayed here */
|
||||||
|
wlr_cursor_warp_closest(cursor, NULL, cursor->x, cursor->y);
|
||||||
|
wlr_xcursor_manager_set_cursor_image(cursor_mgr, "left_ptr", cursor);
|
||||||
|
|
||||||
/* Run the Wayland event loop. This does not return until you exit the
|
/* Run the Wayland event loop. This does not return until you exit the
|
||||||
* compositor. Starting the backend rigged up all of the necessary event
|
* compositor. Starting the backend rigged up all of the necessary event
|
||||||
* loop configuration to listen to libinput events, DRM events, generate
|
* loop configuration to listen to libinput events, DRM events, generate
|
||||||
|
@ -1961,8 +1972,10 @@ setup(void)
|
||||||
* clients from the Unix socket, manging Wayland globals, and so on. */
|
* clients from the Unix socket, manging Wayland globals, and so on. */
|
||||||
dpy = wl_display_create();
|
dpy = wl_display_create();
|
||||||
|
|
||||||
/* clean up child processes immediately */
|
/* Set up signal handlers */
|
||||||
sigchld(0);
|
sigchld(0);
|
||||||
|
signal(SIGINT, quitsignal);
|
||||||
|
signal(SIGTERM, quitsignal);
|
||||||
|
|
||||||
/* The backend is a wlroots feature which abstracts the underlying input and
|
/* The backend is a wlroots feature which abstracts the underlying input and
|
||||||
* output hardware. The autocreate option will choose the most suitable
|
* output hardware. The autocreate option will choose the most suitable
|
||||||
|
|
Loading…
Reference in New Issue