Added public fields to wlr_session
This commit is contained in:
		
							parent
							
								
									f413a67bb1
								
							
						
					
					
						commit
						bd5bca5283
					
				|  | @ -9,16 +9,18 @@ struct session_impl; | |||
| 
 | ||||
| struct wlr_session { | ||||
| 	const struct session_impl *impl; | ||||
| 
 | ||||
| 	bool active; | ||||
| 	struct wl_signal session_signal; | ||||
| 	bool active; | ||||
| 
 | ||||
| 	int drm_fd; | ||||
| 	unsigned vtnr; | ||||
| 	char seat[8]; | ||||
| }; | ||||
| 
 | ||||
| struct wlr_session *wlr_session_start(struct wl_display *disp); | ||||
| void wlr_session_finish(struct wlr_session *session); | ||||
| int wlr_session_open_file(struct wlr_session *restrict session, | ||||
| 		const char *restrict path); | ||||
| int wlr_session_open_file(struct wlr_session *session, const char *path); | ||||
| void wlr_session_close_file(struct wlr_session *session, int fd); | ||||
| bool wlr_session_change_vt(struct wlr_session *session, int vt); | ||||
| bool wlr_session_change_vt(struct wlr_session *session, unsigned vt); | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -6,10 +6,9 @@ | |||
| struct session_impl { | ||||
| 	struct wlr_session *(*start)(struct wl_display *disp); | ||||
| 	void (*finish)(struct wlr_session *session); | ||||
| 	int (*open)(struct wlr_session *restrict session, | ||||
| 			const char *restrict path); | ||||
| 	int (*open)(struct wlr_session *session, const char *path); | ||||
| 	void (*close)(struct wlr_session *session, int fd); | ||||
| 	bool (*change_vt)(struct wlr_session *session, int vt); | ||||
| 	bool (*change_vt)(struct wlr_session *session, unsigned vt); | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -30,8 +30,7 @@ const struct session_impl session_direct; | |||
| struct direct_session { | ||||
| 	struct wlr_session base; | ||||
| 	int tty_fd; | ||||
| 	int drm_fd; | ||||
| 	int kb_mode; | ||||
| 	int old_kbmode; | ||||
| 	int sock; | ||||
| 	pid_t child; | ||||
| 
 | ||||
|  | @ -93,8 +92,7 @@ static int send_message(int sock, enum session_message_type type, const char *pa | |||
| 	return err ? -err : fd; | ||||
| } | ||||
| 
 | ||||
| static int direct_session_open(struct wlr_session *restrict base, | ||||
| 		const char *restrict path) { | ||||
| static int direct_session_open(struct wlr_session *base, const char *path) { | ||||
| 	struct direct_session *session = wl_container_of(base, session, base); | ||||
| 
 | ||||
| 	struct stat st; | ||||
|  | @ -115,7 +113,7 @@ static int direct_session_open(struct wlr_session *restrict base, | |||
| 	} | ||||
| 
 | ||||
| 	if (maj == DRM_MAJOR) { | ||||
| 		session->drm_fd = fd; | ||||
| 		session->base.drm_fd = fd; | ||||
| 	} | ||||
| 
 | ||||
| 	return fd; | ||||
|  | @ -124,17 +122,17 @@ static int direct_session_open(struct wlr_session *restrict base, | |||
| static void direct_session_close(struct wlr_session *base, int fd) { | ||||
| 	struct direct_session *session = wl_container_of(base, session, base); | ||||
| 
 | ||||
| 	if (fd == session->drm_fd) { | ||||
| 	if (fd == session->base.drm_fd) { | ||||
| 		send_message(session->sock, SESSION_DROPMASTER, NULL); | ||||
| 		session->drm_fd = -1; | ||||
| 		session->base.drm_fd = -1; | ||||
| 	} | ||||
| 
 | ||||
| 	close(fd); | ||||
| } | ||||
| 
 | ||||
| static bool direct_change_vt(struct wlr_session *base, int vt) { | ||||
| static bool direct_change_vt(struct wlr_session *base, unsigned vt) { | ||||
| 	struct direct_session *session = wl_container_of(base, session, base); | ||||
| 	return ioctl(session->tty_fd, VT_ACTIVATE, vt) == 0; | ||||
| 	return ioctl(session->tty_fd, VT_ACTIVATE, (int)vt) == 0; | ||||
| } | ||||
| 
 | ||||
| static void direct_session_finish(struct wlr_session *base) { | ||||
|  | @ -143,10 +141,16 @@ static void direct_session_finish(struct wlr_session *base) { | |||
| 		.mode = VT_AUTO, | ||||
| 	}; | ||||
| 
 | ||||
| 	ioctl(session->tty_fd, KDSKBMODE, session->kb_mode); | ||||
| 	errno = 0; | ||||
| 
 | ||||
| 	ioctl(session->tty_fd, KDSKBMODE, session->old_kbmode); | ||||
| 	ioctl(session->tty_fd, KDSETMODE, KD_TEXT); | ||||
| 	ioctl(session->tty_fd, VT_SETMODE, &mode); | ||||
| 
 | ||||
| 	if (errno) { | ||||
| 		wlr_log(L_ERROR, "Failed to restore tty"); | ||||
| 	} | ||||
| 
 | ||||
| 	send_message(session->sock, SESSION_END, NULL); | ||||
| 	close(session->sock); | ||||
| 	wait(NULL); | ||||
|  | @ -175,8 +179,11 @@ static int vt_handler(int signo, void *data) { | |||
| } | ||||
| 
 | ||||
| static bool setup_tty(struct direct_session *session, struct wl_display *display) { | ||||
| 	// TODO: Change this to accept any TTY, instead of just the current one
 | ||||
| 	session->tty_fd = dup(STDIN_FILENO); | ||||
| 	if (session->tty_fd == -1) { | ||||
| 		wlr_log_errno(L_ERROR, "Cannot open tty"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	struct stat st; | ||||
| 	if (fstat(session->tty_fd, &st) == -1 || major(st.st_rdev) != TTY_MAJOR || | ||||
|  | @ -185,9 +192,10 @@ static bool setup_tty(struct direct_session *session, struct wl_display *display | |||
| 		goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	int ret; | ||||
| 	int tty = minor(st.st_rdev); | ||||
| 	int ret, kd_mode; | ||||
| 	session->base.vtnr = tty; | ||||
| 
 | ||||
| 	int kd_mode; | ||||
| 	ret = ioctl(session->tty_fd, KDGETMODE, &kd_mode); | ||||
| 	if (ret) { | ||||
| 		wlr_log_errno(L_ERROR, "Failed to get tty mode"); | ||||
|  | @ -200,10 +208,10 @@ static bool setup_tty(struct direct_session *session, struct wl_display *display | |||
| 		goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	ioctl(session->tty_fd, VT_ACTIVATE, minor(st.st_rdev)); | ||||
| 	ioctl(session->tty_fd, VT_WAITACTIVE, minor(st.st_rdev)); | ||||
| 	ioctl(session->tty_fd, VT_ACTIVATE, tty); | ||||
| 	ioctl(session->tty_fd, VT_WAITACTIVE, tty); | ||||
| 
 | ||||
| 	if (ioctl(session->tty_fd, KDGKBMODE, &session->kb_mode)) { | ||||
| 	if (ioctl(session->tty_fd, KDGKBMODE, &session->old_kbmode)) { | ||||
| 		wlr_log_errno(L_ERROR, "Failed to read keyboard mode"); | ||||
| 		goto error; | ||||
| 	} | ||||
|  | @ -311,8 +319,6 @@ static void communicate(int sock) { | |||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #ifdef HAS_LIBCAP | ||||
|  | @ -379,8 +385,16 @@ static struct wlr_session *direct_session_start(struct wl_display *disp) { | |||
| 		goto error_session; | ||||
| 	} | ||||
| 
 | ||||
| 	// XXX: Is it okay to trust the environment like this?
 | ||||
| 	const char *seat = getenv("XDG_SEAT"); | ||||
| 	if (!seat) { | ||||
| 		seat = "seat0"; | ||||
| 	} | ||||
| 
 | ||||
| 	wlr_log(L_INFO, "Successfully loaded direct session"); | ||||
| 
 | ||||
| 	snprintf(session->base.seat, sizeof(session->base.seat), "%s", seat); | ||||
| 	session->base.drm_fd = -1; | ||||
| 	session->base.impl = &session_direct; | ||||
| 	session->base.active = true; | ||||
| 	wl_signal_init(&session->base.session_signal); | ||||
|  |  | |||
|  | @ -26,13 +26,9 @@ struct logind_session { | |||
| 
 | ||||
| 	char *id; | ||||
| 	char *path; | ||||
| 	char *seat; | ||||
| 
 | ||||
| 	int drm_fd; | ||||
| }; | ||||
| 
 | ||||
| static int logind_take_device(struct wlr_session *restrict base, | ||||
| 		const char *restrict path) { | ||||
| static int logind_take_device(struct wlr_session *base, const char *path) { | ||||
| 	struct logind_session *session = wl_container_of(base, session, base); | ||||
| 
 | ||||
| 	int ret; | ||||
|  | @ -72,7 +68,7 @@ static int logind_take_device(struct wlr_session *restrict base, | |||
| 	} | ||||
| 
 | ||||
| 	if (major(st.st_rdev) == DRM_MAJOR) { | ||||
| 		session->drm_fd = fd; | ||||
| 		session->base.drm_fd = fd; | ||||
| 	} | ||||
| 
 | ||||
| error: | ||||
|  | @ -102,14 +98,14 @@ static void logind_release_device(struct wlr_session *base, int fd) { | |||
| 	} | ||||
| 
 | ||||
| 	if (major(st.st_rdev) == DRM_MAJOR) { | ||||
| 		session->drm_fd = -1; | ||||
| 		session->base.drm_fd = -1; | ||||
| 	} | ||||
| 
 | ||||
| 	sd_bus_error_free(&error); | ||||
| 	sd_bus_message_unref(msg); | ||||
| } | ||||
| 
 | ||||
| static bool logind_change_vt(struct wlr_session *base, int vt) { | ||||
| static bool logind_change_vt(struct wlr_session *base, unsigned vt) { | ||||
| 	struct logind_session *session = wl_container_of(base, session, base); | ||||
| 
 | ||||
| 	int ret; | ||||
|  | @ -187,7 +183,6 @@ static void logind_session_finish(struct wlr_session *base) { | |||
| 	sd_bus_unref(session->bus); | ||||
| 	free(session->id); | ||||
| 	free(session->path); | ||||
| 	free(session->seat); | ||||
| 	free(session); | ||||
| } | ||||
| 
 | ||||
|  | @ -242,7 +237,7 @@ static int resume_device(sd_bus_message *msg, void *userdata, sd_bus_error *ret_ | |||
| 	} | ||||
| 
 | ||||
| 	if (major == DRM_MAJOR) { | ||||
| 		dup2(fd, session->drm_fd); | ||||
| 		dup2(fd, session->base.drm_fd); | ||||
| 		session->base.active = true; | ||||
| 		wl_signal_emit(&session->base.session_signal, session); | ||||
| 	} | ||||
|  | @ -305,11 +300,20 @@ static struct wlr_session *logind_session_start(struct wl_display *disp) { | |||
| 		goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = sd_session_get_seat(session->id, &session->seat); | ||||
| 	ret = sd_session_get_vt(session->id, &session->base.vtnr); | ||||
| 	if (ret < 0) { | ||||
| 		wlr_log(L_ERROR, "Session not running in virtual terminal"); | ||||
| 		goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	char *seat; | ||||
| 	ret = sd_session_get_seat(session->id, &seat); | ||||
| 	if (ret < 0) { | ||||
| 		wlr_log(L_ERROR, "Failed to get seat id: %s", strerror(-ret)); | ||||
| 		goto error; | ||||
| 	} | ||||
| 	snprintf(session->base.seat, sizeof(session->base.seat), "%s", seat); | ||||
| 	free(seat); | ||||
| 
 | ||||
| 	const char *fmt = "/org/freedesktop/login1/session/%s"; | ||||
| 	int len = snprintf(NULL, 0, fmt, session->id); | ||||
|  | @ -345,7 +349,7 @@ static struct wlr_session *logind_session_start(struct wl_display *disp) { | |||
| 
 | ||||
| 	wlr_log(L_INFO, "Successfully loaded logind session"); | ||||
| 
 | ||||
| 	session->drm_fd = -1; | ||||
| 	session->base.drm_fd = -1; | ||||
| 	session->base.impl = &session_logind; | ||||
| 	session->base.active = true; | ||||
| 	wl_signal_init(&session->base.session_signal); | ||||
|  | @ -357,7 +361,6 @@ error_bus: | |||
| error: | ||||
| 	free(session->path); | ||||
| 	free(session->id); | ||||
| 	free(session->seat); | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -33,9 +33,7 @@ void wlr_session_finish(struct wlr_session *session) { | |||
| 	session->impl->finish(session); | ||||
| }; | ||||
| 
 | ||||
| int wlr_session_open_file(struct wlr_session *restrict session, | ||||
| 	const char *restrict path) { | ||||
| 
 | ||||
| int wlr_session_open_file(struct wlr_session *session, const char *path) { | ||||
| 	return session->impl->open(session, path); | ||||
| } | ||||
| 
 | ||||
|  | @ -43,6 +41,6 @@ void wlr_session_close_file(struct wlr_session *session, int fd) { | |||
| 	session->impl->close(session, fd); | ||||
| } | ||||
| 
 | ||||
| bool wlr_session_change_vt(struct wlr_session *session, int vt) { | ||||
| bool wlr_session_change_vt(struct wlr_session *session, unsigned vt) { | ||||
| 	return session->impl->change_vt(session, vt); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue