Merge remote-tracking branch 'mchalupa/output-bugs'
This commit is contained in:
		
						commit
						dca5770af9
					
				|  | @ -113,29 +113,47 @@ output_handle_mode(void *data, struct wl_output *wl_output, uint32_t flags, | ||||||
|                  xwl_output->rotation, NULL, 1, &xwl_output->randr_output); |                  xwl_output->rotation, NULL, 1, &xwl_output->randr_output); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static inline void | ||||||
|  | output_get_new_size(struct xwl_output *xwl_output, | ||||||
|  | 		    int *height, int *width) | ||||||
|  | { | ||||||
|  |     if (*width < xwl_output->x + xwl_output->width) | ||||||
|  |         *width = xwl_output->x + xwl_output->width; | ||||||
|  | 
 | ||||||
|  |     if (*height < xwl_output->y + xwl_output->height) | ||||||
|  |         *height = xwl_output->y + xwl_output->height; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| output_handle_done(void *data, struct wl_output *wl_output) | output_handle_done(void *data, struct wl_output *wl_output) | ||||||
| { | { | ||||||
|     struct xwl_output *xwl_output = data; |     struct xwl_output *it, *xwl_output = data; | ||||||
|     struct xwl_screen *xwl_screen = xwl_output->xwl_screen; |     struct xwl_screen *xwl_screen = xwl_output->xwl_screen; | ||||||
|     int width, height; |     int width = 0, height = 0, has_this_output = 0; | ||||||
| 
 | 
 | ||||||
|     xorg_list_append(&xwl_output->link, &xwl_screen->output_list); |     xorg_list_for_each_entry(it, &xwl_screen->output_list, link) { | ||||||
|  |         /* output done event is sent even when some property
 | ||||||
|  |          * of output is changed. That means that we may already | ||||||
|  |          * have this output. If it is true, we must not add it | ||||||
|  |          * into the output_list otherwise we'll corrupt it */ | ||||||
|  |         if (it == xwl_output) | ||||||
|  |             has_this_output = 1; | ||||||
| 
 | 
 | ||||||
|     width = 0; |         output_get_new_size(it, &height, &width); | ||||||
|     height = 0; |     } | ||||||
|     xorg_list_for_each_entry(xwl_output, &xwl_screen->output_list, link) { | 
 | ||||||
|         if (width < xwl_output->x + xwl_output->width) |     if (!has_this_output) { | ||||||
|             width = xwl_output->x + xwl_output->width; |         xorg_list_append(&xwl_output->link, &xwl_screen->output_list); | ||||||
|         if (height < xwl_output->y + xwl_output->height) | 
 | ||||||
|             height = xwl_output->y + xwl_output->height; |         /* we did not check this output for new screen size, do it now */ | ||||||
|  |         output_get_new_size(xwl_output, &height, &width); | ||||||
|  | 
 | ||||||
|  | 	--xwl_screen->expecting_event; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     xwl_screen->width = width; |     xwl_screen->width = width; | ||||||
|     xwl_screen->height = height; |     xwl_screen->height = height; | ||||||
|     RRScreenSizeNotify(xwl_screen->screen); |     RRScreenSizeNotify(xwl_screen->screen); | ||||||
| 
 |  | ||||||
|     xwl_screen->expecting_event--; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|  | @ -165,6 +183,7 @@ xwl_output_create(struct xwl_screen *xwl_screen, uint32_t id) | ||||||
| 
 | 
 | ||||||
|     xwl_output->output = wl_registry_bind(xwl_screen->registry, id, |     xwl_output->output = wl_registry_bind(xwl_screen->registry, id, | ||||||
|                                           &wl_output_interface, 2); |                                           &wl_output_interface, 2); | ||||||
|  |     xwl_output->server_output_id = id; | ||||||
|     wl_output_add_listener(xwl_output->output, &output_listener, xwl_output); |     wl_output_add_listener(xwl_output->output, &output_listener, xwl_output); | ||||||
| 
 | 
 | ||||||
|     snprintf(name, sizeof name, "XWAYLAND%d", serial++); |     snprintf(name, sizeof name, "XWAYLAND%d", serial++); | ||||||
|  | @ -184,6 +203,7 @@ void | ||||||
| xwl_output_destroy(struct xwl_output *xwl_output) | xwl_output_destroy(struct xwl_output *xwl_output) | ||||||
| { | { | ||||||
|     wl_output_destroy(xwl_output->output); |     wl_output_destroy(xwl_output->output); | ||||||
|  |     xorg_list_del(&xwl_output->link); | ||||||
|     free(xwl_output); |     free(xwl_output); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -410,7 +410,16 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, | ||||||
| static void | static void | ||||||
| global_remove(void *data, struct wl_registry *registry, uint32_t name) | global_remove(void *data, struct wl_registry *registry, uint32_t name) | ||||||
| { | { | ||||||
|     /* Nothing to do here, wl_compositor and wl_shm should not be removed */ |     struct xwl_screen *xwl_screen = data; | ||||||
|  |     struct xwl_output *xwl_output, *tmp_xwl_output; | ||||||
|  | 
 | ||||||
|  |     xorg_list_for_each_entry_safe(xwl_output, tmp_xwl_output, | ||||||
|  |                                   &xwl_screen->output_list, link) { | ||||||
|  |         if (xwl_output->server_output_id == name) { | ||||||
|  |             xwl_output_destroy(xwl_output); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static const struct wl_registry_listener registry_listener = { | static const struct wl_registry_listener registry_listener = { | ||||||
|  |  | ||||||
|  | @ -142,6 +142,7 @@ struct xwl_seat { | ||||||
| struct xwl_output { | struct xwl_output { | ||||||
|     struct xorg_list link; |     struct xorg_list link; | ||||||
|     struct wl_output *output; |     struct wl_output *output; | ||||||
|  |     uint32_t server_output_id; | ||||||
|     struct xwl_screen *xwl_screen; |     struct xwl_screen *xwl_screen; | ||||||
|     RROutputPtr randr_output; |     RROutputPtr randr_output; | ||||||
|     RRCrtcPtr randr_crtc; |     RRCrtcPtr randr_crtc; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue