| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | #define _POSIX_C_SOURCE 200112L
 | 
					
						
							|  |  |  | #include <assert.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2017-10-20 17:49:04 +02:00
										 |  |  | #include <unistd.h>
 | 
					
						
							| 
									
										
										
										
											2019-07-27 11:53:54 +03:00
										 |  |  | #include <wayland-server-core.h>
 | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | #include <wlr/backend.h>
 | 
					
						
							| 
									
										
										
										
											2017-12-17 12:56:42 +01:00
										 |  |  | #include <wlr/backend/headless.h>
 | 
					
						
							| 
									
										
										
										
											2017-12-20 05:51:23 -05:00
										 |  |  | #include <wlr/backend/multi.h>
 | 
					
						
							| 
									
										
										
										
											2018-02-12 21:29:23 +01:00
										 |  |  | #include <wlr/config.h>
 | 
					
						
							| 
									
										
										
										
											2018-03-19 23:16:29 +01:00
										 |  |  | #include <wlr/render/wlr_renderer.h>
 | 
					
						
							| 
									
										
										
										
											2017-09-22 20:24:32 -04:00
										 |  |  | #include <wlr/util/log.h>
 | 
					
						
							|  |  |  | #include "rootston/config.h"
 | 
					
						
							|  |  |  | #include "rootston/server.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | struct roots_server server = { 0 }; | 
					
						
							| 
									
										
										
										
											2017-09-22 20:24:32 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | int main(int argc, char **argv) { | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 	wlr_log_init(WLR_DEBUG, NULL); | 
					
						
							| 
									
										
										
										
											2018-04-08 12:49:48 -04:00
										 |  |  | 	server.config = roots_config_create_from_args(argc, argv); | 
					
						
							|  |  |  | 	server.wl_display = wl_display_create(); | 
					
						
							| 
									
										
										
										
											2018-04-08 12:50:52 -04:00
										 |  |  | 	server.wl_event_loop = wl_display_get_event_loop(server.wl_display); | 
					
						
							| 
									
										
										
										
											2018-04-08 12:49:48 -04:00
										 |  |  | 	assert(server.config && server.wl_display && server.wl_event_loop); | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-25 13:14:35 +03:00
										 |  |  | 	server.backend = wlr_backend_autocreate(server.wl_display, NULL); | 
					
						
							| 
									
										
										
										
											2017-12-21 18:27:38 -05:00
										 |  |  | 	if (server.backend == NULL) { | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 		wlr_log(WLR_ERROR, "could not start backend"); | 
					
						
							| 
									
										
										
										
											2017-12-20 05:51:23 -05:00
										 |  |  | 		return 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-08 12:49:48 -04:00
										 |  |  | 	server.renderer = wlr_backend_get_renderer(server.backend); | 
					
						
							|  |  |  | 	assert(server.renderer); | 
					
						
							| 
									
										
										
										
											2017-10-15 11:06:03 -04:00
										 |  |  | 	server.data_device_manager = | 
					
						
							|  |  |  | 		wlr_data_device_manager_create(server.wl_display); | 
					
						
							| 
									
										
										
										
											2018-05-21 19:07:08 +01:00
										 |  |  | 	wlr_renderer_init_wl_display(server.renderer, server.wl_display); | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | 	server.desktop = desktop_create(&server, server.config); | 
					
						
							| 
									
										
										
										
											2017-09-30 08:46:18 -04:00
										 |  |  | 	server.input = input_create(&server, server.config); | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	const char *socket = wl_display_add_socket_auto(server.wl_display); | 
					
						
							|  |  |  | 	if (!socket) { | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 		wlr_log_errno(WLR_ERROR, "Unable to open wayland socket"); | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | 		wlr_backend_destroy(server.backend); | 
					
						
							|  |  |  | 		return 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 	wlr_log(WLR_INFO, "Running compositor on wayland display '%s'", socket); | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | 	setenv("_WAYLAND_DISPLAY", socket, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!wlr_backend_start(server.backend)) { | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 		wlr_log(WLR_ERROR, "Failed to start backend"); | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | 		wlr_backend_destroy(server.backend); | 
					
						
							| 
									
										
										
										
											2017-12-07 00:13:06 +01:00
										 |  |  | 		wl_display_destroy(server.wl_display); | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | 		return 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-03 10:35:54 -04:00
										 |  |  | 	setenv("WAYLAND_DISPLAY", socket, true); | 
					
						
							| 
									
										
										
										
											2018-11-12 10:12:46 +01:00
										 |  |  | #if WLR_HAS_XWAYLAND
 | 
					
						
							| 
									
										
										
										
											2017-11-17 15:28:22 +01:00
										 |  |  | 	if (server.desktop->xwayland != NULL) { | 
					
						
							| 
									
										
										
										
											2017-11-22 08:23:23 -05:00
										 |  |  | 		struct roots_seat *xwayland_seat = | 
					
						
							|  |  |  | 			input_get_seat(server.input, ROOTS_CONFIG_DEFAULT_SEAT_NAME); | 
					
						
							|  |  |  | 		wlr_xwayland_set_seat(server.desktop->xwayland, xwayland_seat->seat); | 
					
						
							| 
									
										
										
										
											2017-11-17 15:28:22 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-12 16:01:31 -05:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-10-20 17:49:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-06 22:51:32 +02:00
										 |  |  | 	if (server.config->startup_cmd != NULL) { | 
					
						
							|  |  |  | 		const char *cmd = server.config->startup_cmd; | 
					
						
							|  |  |  | 		pid_t pid = fork(); | 
					
						
							|  |  |  | 		if (pid < 0) { | 
					
						
							| 
									
										
										
										
											2018-07-09 22:49:54 +01:00
										 |  |  | 			wlr_log(WLR_ERROR, "cannot execute binding command: fork() failed"); | 
					
						
							| 
									
										
										
										
											2018-05-06 22:51:32 +02:00
										 |  |  | 		} else if (pid == 0) { | 
					
						
							|  |  |  | 			execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-23 00:29:53 -04:00
										 |  |  | 	wl_display_run(server.wl_display); | 
					
						
							| 
									
										
										
										
											2018-11-12 10:12:46 +01:00
										 |  |  | #if WLR_HAS_XWAYLAND
 | 
					
						
							| 
									
										
										
										
											2019-01-18 12:20:04 +01:00
										 |  |  | 	// We need to shutdown Xwayland before disconnecting all clients, otherwise
 | 
					
						
							|  |  |  | 	// wlroots will restart it automatically.
 | 
					
						
							| 
									
										
										
										
											2018-06-08 09:29:55 +01:00
										 |  |  | 	wlr_xwayland_destroy(server.desktop->xwayland); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-05-29 22:50:26 +01:00
										 |  |  | 	wl_display_destroy_clients(server.wl_display); | 
					
						
							| 
									
										
										
										
											2017-12-07 00:13:06 +01:00
										 |  |  | 	wl_display_destroy(server.wl_display); | 
					
						
							| 
									
										
										
										
											2017-09-22 20:24:32 -04:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  | } |