From e44ab5d5840557491a170af64cf851a9c0f201f2 Mon Sep 17 00:00:00 2001 From: random human Date: Sat, 1 Sep 2018 15:12:53 +0530 Subject: Add function wlr_log_get_verbosity() Returns the verbosity passed to wlr_log_init(). --- include/wlr/util/log.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'include') diff --git a/include/wlr/util/log.h b/include/wlr/util/log.h index 7b0070bb..0d659780 100644 --- a/include/wlr/util/log.h +++ b/include/wlr/util/log.h @@ -37,6 +37,9 @@ typedef void (*wlr_log_func_t)(enum wlr_log_importance importance, // If `callback` is NULL, wlr will use its default logger. void wlr_log_init(enum wlr_log_importance verbosity, wlr_log_func_t callback); +// Returns the log verbosity provided to wlr_log_init +enum wlr_log_importance wlr_log_get_verbosity(void); + #ifdef __GNUC__ #define _WLR_ATTRIB_PRINTF(start, end) __attribute__((format(printf, start, end))) #else -- cgit v1.2.3 From b8cc4a4152e5bf7bbe9644c63bcf0e874bb28322 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 3 Sep 2018 17:07:07 +1000 Subject: xwayland: Introduce set_role event --- include/wlr/xwayland.h | 2 ++ include/xwayland/xwm.h | 1 + xwayland/xwm.c | 27 +++++++++++++++++++++++++++ 3 files changed, 30 insertions(+) (limited to 'include') diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h index cf1c2cd1..eb5d6985 100644 --- a/include/wlr/xwayland.h +++ b/include/wlr/xwayland.h @@ -116,6 +116,7 @@ struct wlr_xwayland_surface { char *title; char *class; char *instance; + char *role; pid_t pid; bool has_utf8_title; @@ -157,6 +158,7 @@ struct wlr_xwayland_surface { struct wl_signal unmap; struct wl_signal set_title; struct wl_signal set_class; + struct wl_signal set_role; struct wl_signal set_parent; struct wl_signal set_pid; struct wl_signal set_window_type; diff --git a/include/xwayland/xwm.h b/include/xwayland/xwm.h index 607cc797..3536bbc8 100644 --- a/include/xwayland/xwm.h +++ b/include/xwayland/xwm.h @@ -25,6 +25,7 @@ enum atom_name { WM_HINTS, WM_NORMAL_HINTS, WM_SIZE_HINTS, + WM_WINDOW_ROLE, MOTIF_WM_HINTS, UTF8_STRING, WM_S0, diff --git a/xwayland/xwm.c b/xwayland/xwm.c index cebd9bbc..9c803543 100644 --- a/xwayland/xwm.c +++ b/xwayland/xwm.c @@ -24,6 +24,7 @@ const char *atom_map[ATOM_LAST] = { "WM_HINTS", "WM_NORMAL_HINTS", "WM_SIZE_HINTS", + "WM_WINDOW_ROLE", "_MOTIF_WM_HINTS", "UTF8_STRING", "WM_S0", @@ -152,6 +153,7 @@ static struct wlr_xwayland_surface *xwayland_surface_create( wl_signal_init(&surface->events.map); wl_signal_init(&surface->events.unmap); wl_signal_init(&surface->events.set_class); + wl_signal_init(&surface->events.set_role); wl_signal_init(&surface->events.set_title); wl_signal_init(&surface->events.set_parent); wl_signal_init(&surface->events.set_pid); @@ -327,6 +329,7 @@ static void xwayland_surface_destroy( free(xsurface->title); free(xsurface->class); free(xsurface->instance); + free(xsurface->role); free(xsurface->window_type); free(xsurface->protocols); free(xsurface->hints); @@ -365,6 +368,28 @@ static void read_surface_class(struct wlr_xwm *xwm, wlr_signal_emit_safe(&surface->events.set_class, surface); } +static void read_surface_role(struct wlr_xwm *xwm, + struct wlr_xwayland_surface *xsurface, + xcb_get_property_reply_t *reply) { + if (reply->type != XCB_ATOM_STRING && + reply->type != xwm->atoms[UTF8_STRING]) { + return; + } + + size_t len = xcb_get_property_value_length(reply); + char *role = xcb_get_property_value(reply); + + free(xsurface->role); + if (len > 0) { + xsurface->role = strndup(role, len); + } else { + xsurface->role = NULL; + } + + wlr_log(WLR_DEBUG, "XCB_ATOM_WM_WINDOW_ROLE: %s", xsurface->role); + wlr_signal_emit_safe(&xsurface->events.set_role, xsurface); +} + static void read_surface_title(struct wlr_xwm *xwm, struct wlr_xwayland_surface *xsurface, xcb_get_property_reply_t *reply) { @@ -638,6 +663,8 @@ static void read_surface_property(struct wlr_xwm *xwm, read_surface_normal_hints(xwm, xsurface, reply); } else if (property == xwm->atoms[MOTIF_WM_HINTS]) { read_surface_motif_hints(xwm, xsurface, reply); + } else if (property == xwm->atoms[WM_WINDOW_ROLE]) { + read_surface_role(xwm, xsurface, reply); } else { char *prop_name = xwm_get_atom_name(xwm, property); wlr_log(WLR_DEBUG, "unhandled X11 property %u (%s) for window %u", -- cgit v1.2.3 From 6daa69fbf567f8036031867d6767158a0a6e5fe4 Mon Sep 17 00:00:00 2001 From: random human Date: Mon, 3 Sep 2018 16:21:49 +0530 Subject: Update wlr_log_init docs --- include/wlr/util/log.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'include') diff --git a/include/wlr/util/log.h b/include/wlr/util/log.h index 0d659780..2c441180 100644 --- a/include/wlr/util/log.h +++ b/include/wlr/util/log.h @@ -35,6 +35,8 @@ typedef void (*wlr_log_func_t)(enum wlr_log_importance importance, // Will log all messages less than or equal to `verbosity` // If `callback` is NULL, wlr will use its default logger. +// The function can be called multiple times to update the verbosity or +// callback function. void wlr_log_init(enum wlr_log_importance verbosity, wlr_log_func_t callback); // Returns the log verbosity provided to wlr_log_init -- cgit v1.2.3 From b877daded11612891af0406fb43cb8bcf1e02809 Mon Sep 17 00:00:00 2001 From: emersion Date: Tue, 4 Sep 2018 15:09:07 +0200 Subject: backend/drm: better hotplug handling This commit handles better situations in which the number of connected outputs is greater than the number of available CRTCs. It'll enable as many outputs as possible, and transfer CRTCs to outputs that need one on unplug. This changes CRTC and plane reallocation to happen after scanning DRM connectors instead of on modeset. This cleanups CRTCs and planes on unplug to allow them to be re-used for other outputs. On modeset, if an output doesn't have a CRTC, the desired mode is saved and used later when the output gains a CRTC. Future work includes giving priority to enabled outputs over disabled ones for CRTC allocation. This requires the compositor to know about all outputs (even outputs without CRTCs) to properly modeset outputs enabled in the compositor config file and disable outputs disabled in the config file. --- backend/drm/drm.c | 402 ++++++++++++++++++++++++++-------------------- include/backend/drm/drm.h | 1 + 2 files changed, 227 insertions(+), 176 deletions(-) (limited to 'include') diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 5396dcd4..a6608877 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -404,9 +404,11 @@ static void realloc_planes(struct wlr_drm_backend *drm, const uint32_t *crtc_in, struct wlr_drm_plane *new = &drm->type_planes[type][crtc_res[i]]; if (*old != new) { - wlr_log(WLR_DEBUG, "Assigning plane %d -> %d to CRTC %d", + wlr_log(WLR_DEBUG, + "Assigning plane %d -> %d (type %zu) to CRTC %d", *old ? (int)(*old)->id : -1, new ? (int)new->id : -1, + type, c->id); changed_outputs[crtc_res[i]] = true; @@ -420,192 +422,41 @@ static void realloc_planes(struct wlr_drm_backend *drm, const uint32_t *crtc_in, } } -static void realloc_crtcs(struct wlr_drm_backend *drm, - struct wlr_drm_connector *conn, bool *changed_outputs) { - uint32_t crtc[drm->num_crtcs]; - uint32_t crtc_res[drm->num_crtcs]; - ssize_t num_outputs = wl_list_length(&drm->outputs); - uint32_t possible_crtc[num_outputs]; - - for (size_t i = 0; i < drm->num_crtcs; ++i) { - crtc[i] = UNMATCHED; - } - - memset(possible_crtc, 0, sizeof(possible_crtc)); - - wlr_log(WLR_DEBUG, "Reallocating CRTCs for output '%s'", conn->output.name); - - ssize_t index = -1, i = -1; - struct wlr_drm_connector *c; - wl_list_for_each(c, &drm->outputs, link) { - i++; - if (c == conn) { - index = i; - } - - wlr_log(WLR_DEBUG, "output '%s' crtc=%p state=%d", - c->output.name, c->crtc, c->state); - - if (c->crtc) { - crtc[c->crtc - drm->crtcs] = i; - } - - if (c->state == WLR_DRM_CONN_CONNECTED) { - possible_crtc[i] = c->possible_crtc; - } - } - assert(index != -1); - - possible_crtc[index] = conn->possible_crtc; - match_obj(wl_list_length(&drm->outputs), possible_crtc, - drm->num_crtcs, crtc, crtc_res); - - bool matched[num_outputs]; - memset(matched, false, sizeof(matched)); - for (size_t i = 0; i < drm->num_crtcs; ++i) { - if (crtc_res[i] != UNMATCHED) { - matched[crtc_res[i]] = true; - } - } - - // There is no point doing anything if this monitor doesn't get activated - if (!matched[index]) { - wlr_log(WLR_DEBUG, "Could not match a CRTC for this output"); - return; - } - - for (size_t i = 0; i < drm->num_crtcs; ++i) { - // We don't want any of the current monitors to be deactivated. - if (crtc[i] != UNMATCHED && !matched[crtc[i]]) { - wlr_log(WLR_DEBUG, "Could not match a CRTC for other output %d", - crtc[i]); - return; - } - } - - changed_outputs[index] = true; - - for (size_t i = 0; i < drm->num_crtcs; ++i) { - if (crtc_res[i] == UNMATCHED) { - continue; - } - - if (crtc_res[i] != crtc[i]) { - changed_outputs[crtc_res[i]] = true; - struct wlr_drm_connector *c; - size_t pos = 0; - wl_list_for_each(c, &drm->outputs, link) { - if (pos == crtc_res[i]) { - break; - } - pos++; - } - c->crtc = &drm->crtcs[i]; - - wlr_log(WLR_DEBUG, "Assigning CRTC %d to output '%s'", - drm->crtcs[i].id, c->output.name); - } - } - - realloc_planes(drm, crtc_res, changed_outputs); -} - -static uint32_t get_possible_crtcs(int fd, uint32_t conn_id) { - drmModeConnector *conn = drmModeGetConnector(fd, conn_id); - if (!conn) { - wlr_log_errno(WLR_ERROR, "Failed to get DRM connector"); - return 0; - } - - if (conn->connection != DRM_MODE_CONNECTED || conn->count_modes == 0) { - wlr_log(WLR_ERROR, "Output is not connected"); - goto error_conn; - } - - drmModeEncoder *enc = NULL; - for (int i = 0; !enc && i < conn->count_encoders; ++i) { - enc = drmModeGetEncoder(fd, conn->encoders[i]); - } - - if (!enc) { - wlr_log(WLR_ERROR, "Failed to get DRM encoder"); - goto error_conn; - } - - uint32_t ret = enc->possible_crtcs; - drmModeFreeEncoder(enc); - drmModeFreeConnector(conn); - return ret; - -error_conn: - drmModeFreeConnector(conn); - return 0; -} - static void drm_connector_cleanup(struct wlr_drm_connector *conn); static bool drm_connector_set_mode(struct wlr_output *output, struct wlr_output_mode *mode) { struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output; struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend; - bool changed_outputs[wl_list_length(&drm->outputs)]; - - wlr_log(WLR_INFO, "Modesetting '%s' with '%ux%u@%u mHz'", conn->output.name, - mode->width, mode->height, mode->refresh); - - conn->possible_crtc = get_possible_crtcs(drm->fd, conn->id); - if (conn->possible_crtc == 0) { - goto error_conn; + if (conn->crtc == NULL) { + wlr_log(WLR_ERROR, "Cannot modeset '%s': no CRTC for this connector", + conn->output.name); + // Save the desired mode for later, when we'll get a proper CRTC + conn->desired_mode = mode; + return false; } - memset(changed_outputs, false, sizeof(changed_outputs)); - realloc_crtcs(drm, conn, changed_outputs); + wlr_log(WLR_INFO, "Modesetting '%s' with '%ux%u@%u mHz'", + conn->output.name, mode->width, mode->height, mode->refresh); - struct wlr_drm_crtc *crtc = conn->crtc; - if (!crtc) { - wlr_log(WLR_ERROR, "Unable to match %s with a CRTC", conn->output.name); + if (!init_drm_plane_surfaces(conn->crtc->primary, drm, + mode->width, mode->height, GBM_FORMAT_XRGB8888)) { + wlr_log(WLR_ERROR, "Failed to initialize renderer for plane"); return false; } - wlr_log(WLR_DEBUG, "%s: crtc=%td ovr=%td pri=%td cur=%td", conn->output.name, - crtc - drm->crtcs, - crtc->overlay ? crtc->overlay - drm->overlay_planes : -1, - crtc->primary ? crtc->primary - drm->primary_planes : -1, - crtc->cursor ? crtc->cursor - drm->cursor_planes : -1); conn->state = WLR_DRM_CONN_CONNECTED; + conn->desired_mode = NULL; wlr_output_update_mode(&conn->output, mode); + wlr_output_update_enabled(&conn->output, true); + + drm_connector_start_renderer(conn); // When switching VTs, the mode is not updated but the buffers become // invalid, so we need to manually damage the output here wlr_output_damage_whole(&conn->output); - // Since realloc_crtcs can deallocate planes on OTHER outputs, - // we actually need to reinitialize any that has changed - ssize_t output_index = -1; - wl_list_for_each(conn, &drm->outputs, link) { - output_index++; - struct wlr_output_mode *mode = conn->output.current_mode; - struct wlr_drm_crtc *crtc = conn->crtc; - - if (conn->state != WLR_DRM_CONN_CONNECTED || - !changed_outputs[output_index]) { - continue; - } - - if (!init_drm_plane_surfaces(crtc->primary, drm, - mode->width, mode->height, GBM_FORMAT_XRGB8888)) { - wlr_log(WLR_ERROR, "Failed to initialize renderer for plane"); - goto error_conn; - } - - drm_connector_start_renderer(conn); - } - return true; - -error_conn: - drm_connector_cleanup(conn); - return false; } bool wlr_drm_connector_add_mode(struct wlr_output *output, @@ -855,6 +706,167 @@ static const int32_t subpixel_map[] = { [DRM_MODE_SUBPIXEL_NONE] = WL_OUTPUT_SUBPIXEL_NONE, }; +static void dealloc_crtc(struct wlr_drm_connector *conn) { + struct wlr_drm_backend *drm = (struct wlr_drm_backend *)conn->output.backend; + if (conn->crtc == NULL) { + return; + } + + for (size_t type = 0; type < 3; ++type) { + struct wlr_drm_plane *plane = conn->crtc->planes[type]; + if (plane == NULL) { + continue; + } + + finish_drm_surface(&plane->surf); + conn->crtc->planes[type] = NULL; + } + + drm->iface->conn_enable(drm, conn, false); + + conn->crtc = NULL; +} + +void realloc_crtcs(struct wlr_drm_backend *drm, bool *changed_outputs) { + size_t num_outputs = wl_list_length(&drm->outputs); + + wlr_log(WLR_DEBUG, "Reallocating CRTCs"); + + uint32_t crtc[drm->num_crtcs]; + for (size_t i = 0; i < drm->num_crtcs; ++i) { + crtc[i] = UNMATCHED; + } + + uint32_t possible_crtc[num_outputs]; + memset(possible_crtc, 0, sizeof(possible_crtc)); + + wlr_log(WLR_DEBUG, "State before reallocation:"); + ssize_t i = -1; + struct wlr_drm_connector *conn; + wl_list_for_each(conn, &drm->outputs, link) { + i++; + + wlr_log(WLR_DEBUG, " '%s' crtc=%d state=%d", conn->output.name, + conn->crtc ? (int)(conn->crtc - drm->crtcs) : -1, conn->state); + + if (conn->crtc) { + crtc[conn->crtc - drm->crtcs] = i; + } + + if (conn->state == WLR_DRM_CONN_CONNECTED || + conn->state == WLR_DRM_CONN_NEEDS_MODESET) { + possible_crtc[i] = conn->possible_crtc; + } + } + + uint32_t crtc_res[drm->num_crtcs]; + match_obj(wl_list_length(&drm->outputs), possible_crtc, + drm->num_crtcs, crtc, crtc_res); + + bool matched[num_outputs]; + memset(matched, false, sizeof(matched)); + for (size_t i = 0; i < drm->num_crtcs; ++i) { + if (crtc_res[i] != UNMATCHED) { + matched[crtc_res[i]] = true; + } + } + + for (size_t i = 0; i < drm->num_crtcs; ++i) { + // We don't want any of the current monitors to be deactivated + if (crtc[i] != UNMATCHED && !matched[crtc[i]]) { + wlr_log(WLR_DEBUG, "Could not match a CRTC for connected output %d", + crtc[i]); + return; + } + } + + for (size_t i = 0; i < drm->num_crtcs; ++i) { + if (crtc_res[i] == UNMATCHED) { + continue; + } + + if (crtc_res[i] != crtc[i]) { + changed_outputs[crtc_res[i]] = true; + + struct wlr_drm_connector *c; + size_t pos = 0; + wl_list_for_each(c, &drm->outputs, link) { + if (pos == crtc_res[i]) { + break; + } + pos++; + } + + dealloc_crtc(c); + c->crtc = &drm->crtcs[i]; + + wlr_log(WLR_DEBUG, "Assigning CRTC %zu to output %d -> %d '%s'", + i, crtc[i], crtc_res[i], c->output.name); + } + } + + wlr_log(WLR_DEBUG, "State after reallocation:"); + wl_list_for_each(conn, &drm->outputs, link) { + wlr_log(WLR_DEBUG, " '%s' crtc=%d state=%d", conn->output.name, + conn->crtc ? (int)(conn->crtc - drm->crtcs) : -1, conn->state); + } + + realloc_planes(drm, crtc_res, changed_outputs); + + // We need to reinitialize any plane that has changed + i = -1; + wl_list_for_each(conn, &drm->outputs, link) { + i++; + struct wlr_output_mode *mode = conn->output.current_mode; + + if (conn->state != WLR_DRM_CONN_CONNECTED || !changed_outputs[i]) { + continue; + } + assert(conn->crtc); + + if (!init_drm_plane_surfaces(conn->crtc->primary, drm, + mode->width, mode->height, GBM_FORMAT_XRGB8888)) { + wlr_log(WLR_ERROR, "Failed to initialize renderer for plane"); + drm_connector_cleanup(conn); + break; + } + + drm_connector_start_renderer(conn); + } +} + +static uint32_t get_possible_crtcs(int fd, uint32_t conn_id) { + drmModeConnector *conn = drmModeGetConnector(fd, conn_id); + if (!conn) { + wlr_log_errno(WLR_ERROR, "Failed to get DRM connector"); + return 0; + } + + if (conn->connection != DRM_MODE_CONNECTED || conn->count_modes == 0) { + wlr_log(WLR_ERROR, "Output is not connected"); + goto error_conn; + } + + drmModeEncoder *enc = NULL; + for (int i = 0; !enc && i < conn->count_encoders; ++i) { + enc = drmModeGetEncoder(fd, conn->encoders[i]); + } + + if (!enc) { + wlr_log(WLR_ERROR, "Failed to get DRM encoder"); + goto error_conn; + } + + uint32_t ret = enc->possible_crtcs; + drmModeFreeEncoder(enc); + drmModeFreeConnector(conn); + return ret; + +error_conn: + drmModeFreeConnector(conn); + return 0; +} + void scan_drm_connectors(struct wlr_drm_backend *drm) { wlr_log(WLR_INFO, "Scanning DRM connectors"); @@ -910,17 +922,16 @@ void scan_drm_connectors(struct wlr_drm_backend *drm) { wlr_conn->state = WLR_DRM_CONN_DISCONNECTED; wlr_conn->id = drm_conn->connector_id; + snprintf(wlr_conn->output.name, sizeof(wlr_conn->output.name), + "%s-%"PRIu32, conn_get_name(drm_conn->connector_type), + drm_conn->connector_type_id); + if (curr_enc) { wlr_conn->old_crtc = drmModeGetCrtc(drm->fd, curr_enc->crtc_id); } - snprintf(wlr_conn->output.name, sizeof(wlr_conn->output.name), - "%s-%"PRIu32, - conn_get_name(drm_conn->connector_type), - drm_conn->connector_type_id); - wl_list_insert(&drm->outputs, &wlr_conn->link); - wlr_log(WLR_INFO, "Found display '%s'", wlr_conn->output.name); + wlr_log(WLR_INFO, "Found connector '%s'", wlr_conn->output.name); } else { seen[index] = true; } @@ -976,6 +987,12 @@ void scan_drm_connectors(struct wlr_drm_backend *drm) { wl_list_insert(&wlr_conn->output.modes, &mode->wlr_mode.link); } + wlr_conn->possible_crtc = get_possible_crtcs(drm->fd, wlr_conn->id); + if (wlr_conn->possible_crtc == 0) { + wlr_log(WLR_ERROR, "No CRTC possible for connector '%s'", + wlr_conn->output.name); + } + wlr_output_update_enabled(&wlr_conn->output, wlr_conn->crtc != NULL); wlr_conn->state = WLR_DRM_CONN_NEEDS_MODESET; @@ -984,7 +1001,6 @@ void scan_drm_connectors(struct wlr_drm_backend *drm) { drm_conn->connection != DRM_MODE_CONNECTED) { wlr_log(WLR_INFO, "'%s' disconnected", wlr_conn->output.name); - wlr_output_update_enabled(&wlr_conn->output, false); drm_connector_cleanup(wlr_conn); } @@ -1011,6 +1027,26 @@ void scan_drm_connectors(struct wlr_drm_backend *drm) { free(conn); } + bool changed_outputs[wl_list_length(&drm->outputs)]; + memset(changed_outputs, false, sizeof(changed_outputs)); + for (size_t i = 0; i < new_outputs_len; ++i) { + struct wlr_drm_connector *conn = new_outputs[i]; + + ssize_t pos = -1; + struct wlr_drm_connector *c; + wl_list_for_each(c, &drm->outputs, link) { + ++pos; + if (c == conn) { + break; + } + } + assert(pos >= 0); + + changed_outputs[pos] = true; + } + + realloc_crtcs(drm, changed_outputs); + for (size_t i = 0; i < new_outputs_len; ++i) { struct wlr_drm_connector *conn = new_outputs[i]; @@ -1019,6 +1055,15 @@ void scan_drm_connectors(struct wlr_drm_backend *drm) { wlr_signal_emit_safe(&drm->backend.events.new_output, &conn->output); } + + // Try to modeset any output that has a desired mode and a CRTC (ie. was + // lacking a CRTC on last modeset) + wl_list_for_each(conn, &drm->outputs, link) { + if (conn->state == WLR_DRM_CONN_NEEDS_MODESET && conn->crtc != NULL && + conn->desired_mode != NULL) { + drm_connector_set_mode(&conn->output, conn->desired_mode); + } + } } static void page_flip_handler(int fd, unsigned seq, @@ -1114,23 +1159,28 @@ static void drm_connector_cleanup(struct wlr_drm_connector *conn) { } conn->output.current_mode = NULL; + conn->desired_mode = NULL; struct wlr_drm_mode *mode, *tmp; wl_list_for_each_safe(mode, tmp, &conn->output.modes, wlr_mode.link) { wl_list_remove(&mode->wlr_mode.link); free(mode); } + conn->output.enabled = false; + conn->output.width = conn->output.height = conn->output.refresh = 0; + memset(&conn->output.make, 0, sizeof(conn->output.make)); memset(&conn->output.model, 0, sizeof(conn->output.model)); memset(&conn->output.serial, 0, sizeof(conn->output.serial)); - conn->crtc = NULL; - conn->possible_crtc = 0; conn->pageflip_pending = false; /* Fallthrough */ case WLR_DRM_CONN_NEEDS_MODESET: wlr_log(WLR_INFO, "Emitting destruction signal for '%s'", conn->output.name); + dealloc_crtc(conn); + conn->possible_crtc = 0; + conn->desired_mode = NULL; wlr_signal_emit_safe(&conn->output.events.destroy, &conn->output); break; case WLR_DRM_CONN_DISCONNECTED: diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h index 5d6ff231..fe279917 100644 --- a/include/backend/drm/drm.h +++ b/include/backend/drm/drm.h @@ -119,6 +119,7 @@ struct wlr_drm_connector { struct wlr_output output; enum wlr_drm_connector_state state; + struct wlr_output_mode *desired_mode; uint32_t id; struct wlr_drm_crtc *crtc; -- cgit v1.2.3 From f6168c2afeece02b118b2bc43412fc3344e59028 Mon Sep 17 00:00:00 2001 From: nyorain Date: Fri, 7 Sep 2018 14:48:28 +0200 Subject: Fix #1129 and remove sx, sy from wlr_drag_icon sx, sy used to store the buffer offset of the drag surface which was then be added (by rootston) to the drag icon position. Buffer offsets are handled already in surface_intersect_output (output.c) so they were added twice for dnd surfaces. --- include/wlr/types/wlr_data_device.h | 2 -- rootston/seat.c | 8 ++++---- types/data_device/wlr_drag.c | 3 --- 3 files changed, 4 insertions(+), 9 deletions(-) (limited to 'include') diff --git a/include/wlr/types/wlr_data_device.h b/include/wlr/types/wlr_data_device.h index cc04c9e9..c45e8d1c 100644 --- a/include/wlr/types/wlr_data_device.h +++ b/include/wlr/types/wlr_data_device.h @@ -93,8 +93,6 @@ struct wlr_drag_icon { bool is_pointer; int32_t touch_id; - int32_t sx, sy; - struct { struct wl_signal map; struct wl_signal unmap; diff --git a/rootston/seat.c b/rootston/seat.c index 9010d6e3..c11ff017 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -502,16 +502,16 @@ void roots_drag_icon_update_position(struct roots_drag_icon *icon) { struct roots_seat *seat = icon->seat; struct wlr_cursor *cursor = seat->cursor->cursor; if (wlr_icon->is_pointer) { - icon->x = cursor->x + wlr_icon->sx; - icon->y = cursor->y + wlr_icon->sy; + icon->x = cursor->x; + icon->y = cursor->y; } else { struct wlr_touch_point *point = wlr_seat_touch_get_point(seat->seat, wlr_icon->touch_id); if (point == NULL) { return; } - icon->x = seat->touch_x + wlr_icon->sx; - icon->y = seat->touch_y + wlr_icon->sy; + icon->x = seat->touch_x; + icon->y = seat->touch_y; } roots_drag_icon_damage_whole(icon); diff --git a/types/data_device/wlr_drag.c b/types/data_device/wlr_drag.c index 7f3b346d..fcde7b3e 100644 --- a/types/data_device/wlr_drag.c +++ b/types/data_device/wlr_drag.c @@ -345,9 +345,6 @@ static void drag_icon_surface_role_commit(struct wlr_surface *surface) { return; } - icon->sx += icon->surface->current.dx; - icon->sy += icon->surface->current.dy; - drag_icon_set_mapped(icon, wlr_surface_has_buffer(surface)); } -- cgit v1.2.3