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