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); | ||||
| } | ||||
| 
 | ||||
| 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 | ||||
| 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; | ||||
|     int width, height; | ||||
|     int width = 0, height = 0, has_this_output = 0; | ||||
| 
 | ||||
|     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; | ||||
| 
 | ||||
|         output_get_new_size(it, &height, &width); | ||||
|     } | ||||
| 
 | ||||
|     if (!has_this_output) { | ||||
|         xorg_list_append(&xwl_output->link, &xwl_screen->output_list); | ||||
| 
 | ||||
|     width = 0; | ||||
|     height = 0; | ||||
|     xorg_list_for_each_entry(xwl_output, &xwl_screen->output_list, link) { | ||||
|         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; | ||||
|         /* 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->height = height; | ||||
|     RRScreenSizeNotify(xwl_screen->screen); | ||||
| 
 | ||||
|     xwl_screen->expecting_event--; | ||||
| } | ||||
| 
 | ||||
| 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, | ||||
|                                           &wl_output_interface, 2); | ||||
|     xwl_output->server_output_id = id; | ||||
|     wl_output_add_listener(xwl_output->output, &output_listener, xwl_output); | ||||
| 
 | ||||
|     snprintf(name, sizeof name, "XWAYLAND%d", serial++); | ||||
|  | @ -184,6 +203,7 @@ void | |||
| xwl_output_destroy(struct xwl_output *xwl_output) | ||||
| { | ||||
|     wl_output_destroy(xwl_output->output); | ||||
|     xorg_list_del(&xwl_output->link); | ||||
|     free(xwl_output); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -410,7 +410,16 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, | |||
| static void | ||||
| 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 = { | ||||
|  |  | |||
|  | @ -142,6 +142,7 @@ struct xwl_seat { | |||
| struct xwl_output { | ||||
|     struct xorg_list link; | ||||
|     struct wl_output *output; | ||||
|     uint32_t server_output_id; | ||||
|     struct xwl_screen *xwl_screen; | ||||
|     RROutputPtr randr_output; | ||||
|     RRCrtcPtr randr_crtc; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue