| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | #include <assert.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <stdbool.h>
 | 
					
						
							|  |  |  | #include <wayland-server.h>
 | 
					
						
							|  |  |  | #include <wlr/types/wlr_box.h>
 | 
					
						
							|  |  |  | #include <wlr/types/wlr_surface.h>
 | 
					
						
							|  |  |  | #include <wlr/xwayland.h>
 | 
					
						
							|  |  |  | #include <wlr/util/log.h>
 | 
					
						
							|  |  |  | #include "rootston/desktop.h"
 | 
					
						
							|  |  |  | #include "rootston/server.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 16:05:18 +02:00
										 |  |  | static void resize(struct roots_view *view, uint32_t width, uint32_t height) { | 
					
						
							|  |  |  | 	assert(view->type == ROOTS_XWAYLAND_VIEW); | 
					
						
							|  |  |  | 	struct wlr_xwayland_surface *xwayland_surface = view->xwayland_surface; | 
					
						
							| 
									
										
										
										
											2017-09-30 16:33:04 +02:00
										 |  |  | 	wlr_xwayland_surface_configure(view->desktop->xwayland, xwayland_surface, | 
					
						
							|  |  |  | 		xwayland_surface->x, xwayland_surface->y, width, height); | 
					
						
							| 
									
										
										
										
											2017-09-30 16:05:18 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | static void handle_destroy(struct wl_listener *listener, void *data) { | 
					
						
							| 
									
										
										
										
											2017-09-28 23:26:31 +02:00
										 |  |  | 	struct roots_xwayland_surface *roots_surface = | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | 		wl_container_of(listener, roots_surface, destroy); | 
					
						
							|  |  |  | 	wl_list_remove(&roots_surface->destroy.link); | 
					
						
							|  |  |  | 	view_destroy(roots_surface->view); | 
					
						
							|  |  |  | 	free(roots_surface); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 10:39:06 +02:00
										 |  |  | static void handle_request_configure(struct wl_listener *listener, void *data) { | 
					
						
							| 
									
										
										
										
											2017-09-29 18:28:38 +02:00
										 |  |  | 	struct roots_xwayland_surface *roots_surface = | 
					
						
							| 
									
										
										
										
											2017-09-29 22:26:03 +02:00
										 |  |  | 		wl_container_of(listener, roots_surface, request_configure); | 
					
						
							|  |  |  | 	struct wlr_xwayland_surface *xwayland_surface = | 
					
						
							|  |  |  | 		roots_surface->view->xwayland_surface; | 
					
						
							| 
									
										
										
										
											2017-09-29 18:28:38 +02:00
										 |  |  | 	struct wlr_xwayland_surface_configure_event *event = data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-29 20:44:00 +02:00
										 |  |  | 	roots_surface->view->x = (double)event->x; | 
					
						
							|  |  |  | 	roots_surface->view->y = (double)event->y; | 
					
						
							| 
									
										
										
										
											2017-09-29 18:28:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	wlr_xwayland_surface_configure(roots_surface->view->desktop->xwayland, | 
					
						
							| 
									
										
										
										
											2017-09-30 16:33:04 +02:00
										 |  |  | 		xwayland_surface, event->x, event->y, event->width, event->height); | 
					
						
							| 
									
										
										
										
											2017-09-29 18:28:38 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void activate(struct roots_view *view, bool active) { | 
					
						
							| 
									
										
										
										
											2017-10-06 13:57:25 +03:00
										 |  |  | 	if (active) { | 
					
						
							|  |  |  | 		wlr_xwayland_surface_activate(view->desktop->xwayland, | 
					
						
							|  |  |  | 			view->xwayland_surface); | 
					
						
							| 
									
										
										
										
											2017-10-06 09:34:22 -04:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		wlr_xwayland_surface_activate(view->desktop->xwayland, NULL); | 
					
						
							| 
									
										
										
										
											2017-10-06 13:57:25 +03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-28 09:11:16 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | void handle_xwayland_surface(struct wl_listener *listener, void *data) { | 
					
						
							|  |  |  | 	struct roots_desktop *desktop = | 
					
						
							|  |  |  | 		wl_container_of(listener, desktop, xwayland_surface); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-28 23:26:31 +02:00
										 |  |  | 	struct wlr_xwayland_surface *surface = data; | 
					
						
							| 
									
										
										
										
											2017-09-29 22:26:03 +02:00
										 |  |  | 	wlr_log(L_DEBUG, "new xwayland surface: title=%s, class=%s, instance=%s", | 
					
						
							|  |  |  | 		surface->title, surface->class, surface->instance); | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-28 23:26:31 +02:00
										 |  |  | 	struct roots_xwayland_surface *roots_surface = | 
					
						
							|  |  |  | 		calloc(1, sizeof(struct roots_xwayland_surface)); | 
					
						
							| 
									
										
										
										
											2017-09-29 22:26:03 +02:00
										 |  |  | 	if (roots_surface == NULL) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | 	wl_list_init(&roots_surface->destroy.link); | 
					
						
							|  |  |  | 	roots_surface->destroy.notify = handle_destroy; | 
					
						
							|  |  |  | 	wl_signal_add(&surface->events.destroy, &roots_surface->destroy); | 
					
						
							| 
									
										
										
										
											2017-09-29 18:28:38 +02:00
										 |  |  | 	wl_list_init(&roots_surface->request_configure.link); | 
					
						
							| 
									
										
										
										
											2017-09-30 10:39:06 +02:00
										 |  |  | 	roots_surface->request_configure.notify = handle_request_configure; | 
					
						
							| 
									
										
										
										
											2017-09-29 18:28:38 +02:00
										 |  |  | 	wl_signal_add(&surface->events.request_configure, | 
					
						
							|  |  |  | 		&roots_surface->request_configure); | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct roots_view *view = calloc(1, sizeof(struct roots_view)); | 
					
						
							| 
									
										
										
										
											2017-09-29 22:26:03 +02:00
										 |  |  | 	if (view == NULL) { | 
					
						
							|  |  |  | 		free(roots_surface); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | 	view->type = ROOTS_XWAYLAND_VIEW; | 
					
						
							| 
									
										
										
										
											2017-09-29 20:44:00 +02:00
										 |  |  | 	view->x = (double)surface->x; | 
					
						
							|  |  |  | 	view->y = (double)surface->y; | 
					
						
							| 
									
										
										
										
											2017-09-28 23:26:31 +02:00
										 |  |  | 	view->xwayland_surface = surface; | 
					
						
							|  |  |  | 	view->roots_xwayland_surface = roots_surface; | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | 	view->wlr_surface = surface->surface; | 
					
						
							|  |  |  | 	view->desktop = desktop; | 
					
						
							| 
									
										
										
										
											2017-09-29 18:28:38 +02:00
										 |  |  | 	view->activate = activate; | 
					
						
							| 
									
										
										
										
											2017-09-30 16:05:18 +02:00
										 |  |  | 	view->resize = resize; | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | 	roots_surface->view = view; | 
					
						
							| 
									
										
										
										
											2017-09-28 19:48:55 -04:00
										 |  |  | 	list_add(desktop->views, view); | 
					
						
							| 
									
										
										
										
											2017-09-28 08:54:57 -04:00
										 |  |  | } |