mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	Support passing the Wayland fd in the environment
This commit is contained in:
		
							parent
							
								
									0b29a2fec7
								
							
						
					
					
						commit
						4d33e802e0
					
				
					 1 changed files with 38 additions and 17 deletions
				
			
		| 
						 | 
					@ -320,30 +320,17 @@ static const struct wl_display_listener display_listener = {
 | 
				
			||||||
	display_handle_key
 | 
						display_handle_key
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WL_EXPORT struct wl_display *
 | 
					static int
 | 
				
			||||||
wl_display_connect(const char *name)
 | 
					connect_to_socket(struct wl_display *display, const char *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct wl_display *display;
 | 
					 | 
				
			||||||
	struct sockaddr_un addr;
 | 
						struct sockaddr_un addr;
 | 
				
			||||||
	socklen_t size;
 | 
						socklen_t size;
 | 
				
			||||||
	const char *runtime_dir;
 | 
						const char *runtime_dir;
 | 
				
			||||||
	const char *debug;
 | 
					 | 
				
			||||||
	size_t name_size;
 | 
						size_t name_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	debug = getenv("WAYLAND_DEBUG");
 | 
					 | 
				
			||||||
	if (debug)
 | 
					 | 
				
			||||||
		wl_debug = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	display = malloc(sizeof *display);
 | 
					 | 
				
			||||||
	if (display == NULL)
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	memset(display, 0, sizeof *display);
 | 
					 | 
				
			||||||
	display->fd = socket(PF_LOCAL, SOCK_STREAM, 0);
 | 
						display->fd = socket(PF_LOCAL, SOCK_STREAM, 0);
 | 
				
			||||||
	if (display->fd < 0) {
 | 
						if (display->fd < 0)
 | 
				
			||||||
		free(display);
 | 
							return -1;
 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	runtime_dir = getenv("XDG_RUNTIME_DIR");
 | 
						runtime_dir = getenv("XDG_RUNTIME_DIR");
 | 
				
			||||||
	if (runtime_dir == NULL) {
 | 
						if (runtime_dir == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -368,6 +355,40 @@ wl_display_connect(const char *name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (connect(display->fd, (struct sockaddr *) &addr, size) < 0) {
 | 
						if (connect(display->fd, (struct sockaddr *) &addr, size) < 0) {
 | 
				
			||||||
		close(display->fd);
 | 
							close(display->fd);
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WL_EXPORT struct wl_display *
 | 
				
			||||||
 | 
					wl_display_connect(const char *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct wl_display *display;
 | 
				
			||||||
 | 
						const char *debug;
 | 
				
			||||||
 | 
						char *connection, *end;
 | 
				
			||||||
 | 
						int flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						debug = getenv("WAYLAND_DEBUG");
 | 
				
			||||||
 | 
						if (debug)
 | 
				
			||||||
 | 
							wl_debug = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						display = malloc(sizeof *display);
 | 
				
			||||||
 | 
						if (display == NULL)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memset(display, 0, sizeof *display);
 | 
				
			||||||
 | 
						connection = getenv("WAYLAND_SOCKET");
 | 
				
			||||||
 | 
						if (connection) {
 | 
				
			||||||
 | 
							display->fd = strtol(connection, &end, 0);
 | 
				
			||||||
 | 
							if (*end != '\0') {
 | 
				
			||||||
 | 
								free(display);
 | 
				
			||||||
 | 
								return NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							flags = fcntl(display->fd, F_GETFD);
 | 
				
			||||||
 | 
							if (flags != -1)
 | 
				
			||||||
 | 
								fcntl(display->fd, F_SETFD, flags | FD_CLOEXEC);
 | 
				
			||||||
 | 
						} else if (connect_to_socket(display, name) < 0) {
 | 
				
			||||||
		free(display);
 | 
							free(display);
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue