Merge branch 'main' into wlroots-next
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user