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_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);
 | 
					        xorg_list_append(&xwl_output->link, &xwl_screen->output_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    width = 0;
 | 
					        /* we did not check this output for new screen size, do it now */
 | 
				
			||||||
    height = 0;
 | 
					        output_get_new_size(xwl_output, &height, &width);
 | 
				
			||||||
    xorg_list_for_each_entry(xwl_output, &xwl_screen->output_list, link) {
 | 
					
 | 
				
			||||||
        if (width < xwl_output->x + xwl_output->width)
 | 
						--xwl_screen->expecting_event;
 | 
				
			||||||
            width = xwl_output->x + xwl_output->width;
 | 
					 | 
				
			||||||
        if (height < xwl_output->y + xwl_output->height)
 | 
					 | 
				
			||||||
            height = xwl_output->y + xwl_output->height;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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