aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/drm/backend.c4
-rw-r--r--backend/drm/drm.c4
-rw-r--r--backend/drm/renderer.c2
-rw-r--r--backend/headless/output.c2
-rw-r--r--backend/libinput/backend.c4
-rw-r--r--backend/wayland/wl_seat.c10
-rw-r--r--backend/x11/backend.c12
7 files changed, 29 insertions, 9 deletions
diff --git a/backend/drm/backend.c b/backend/drm/backend.c
index 47dff227..75b44210 100644
--- a/backend/drm/backend.c
+++ b/backend/drm/backend.c
@@ -81,8 +81,10 @@ static void session_signal(struct wl_listener *listener, void *data) {
struct wlr_drm_connector *conn;
wl_list_for_each(conn, &drm->outputs, link){
- if (conn->output.current_mode) {
+ if (conn->output.enabled) {
wlr_output_set_mode(&conn->output, conn->output.current_mode);
+ } else {
+ wlr_drm_connector_enable(&conn->output, false);
}
if (!conn->crtc) {
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index e60b7e1c..3b714300 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -282,7 +282,7 @@ void wlr_drm_connector_start_renderer(struct wlr_drm_connector *conn) {
}
}
-static void wlr_drm_connector_enable(struct wlr_output *output, bool enable) {
+void wlr_drm_connector_enable(struct wlr_output *output, bool enable) {
struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
if (conn->state != WLR_DRM_CONN_CONNECTED) {
return;
@@ -647,7 +647,7 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
float matrix[16];
wlr_texture_get_matrix(plane->wlr_tex, &matrix, &plane->matrix, 0, 0);
wlr_render_with_matrix(plane->surf.renderer->wlr_rend, plane->wlr_tex,
- &matrix);
+ &matrix, 1.0f);
glFinish();
glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, bo_stride);
diff --git a/backend/drm/renderer.c b/backend/drm/renderer.c
index f3e570f7..7ee13843 100644
--- a/backend/drm/renderer.c
+++ b/backend/drm/renderer.c
@@ -239,7 +239,7 @@ struct gbm_bo *wlr_drm_surface_mgpu_copy(struct wlr_drm_surface *dest,
glViewport(0, 0, dest->width, dest->height);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
- wlr_render_with_matrix(dest->renderer->wlr_rend, tex, &matrix);
+ wlr_render_with_matrix(dest->renderer->wlr_rend, tex, &matrix, 1.0f);
return wlr_drm_surface_swap_buffers(dest, NULL);
}
diff --git a/backend/headless/output.c b/backend/headless/output.c
index ba4a094e..6ce8fc35 100644
--- a/backend/headless/output.c
+++ b/backend/headless/output.c
@@ -67,6 +67,8 @@ static void output_destroy(struct wlr_output *wlr_output) {
wl_list_remove(&output->link);
+ wl_event_source_remove(output->frame_timer);
+
eglDestroySurface(output->backend->egl.display, output->egl_surface);
free(output);
}
diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c
index 71fe0d93..1e7c1ad4 100644
--- a/backend/libinput/backend.c
+++ b/backend/libinput/backend.c
@@ -118,7 +118,9 @@ static void wlr_libinput_backend_destroy(struct wlr_backend *wlr_backend) {
wl_list_remove(&backend->session_signal.link);
wlr_list_finish(&backend->wlr_device_lists);
- wl_event_source_remove(backend->input_event);
+ if (backend->input_event) {
+ wl_event_source_remove(backend->input_event);
+ }
libinput_unref(backend->libinput_context);
free(backend);
}
diff --git a/backend/wayland/wl_seat.c b/backend/wayland/wl_seat.c
index b1f7cff6..841e693d 100644
--- a/backend/wayland/wl_seat.c
+++ b/backend/wayland/wl_seat.c
@@ -163,10 +163,12 @@ static void keyboard_handle_key(void *data, struct wl_keyboard *wl_keyboard,
struct wlr_input_device *dev = data;
assert(dev && dev->keyboard);
- struct wlr_event_keyboard_key wlr_event;
- wlr_event.keycode = key;
- wlr_event.state = state;
- wlr_event.time_msec = time;
+ struct wlr_event_keyboard_key wlr_event = {
+ .keycode = key,
+ .state = state,
+ .time_msec = time,
+ .update_state = false,
+ };
wlr_keyboard_notify_key(dev->keyboard, &wlr_event);
}
diff --git a/backend/x11/backend.c b/backend/x11/backend.c
index 65eb0094..8633ece3 100644
--- a/backend/x11/backend.c
+++ b/backend/x11/backend.c
@@ -188,6 +188,17 @@ static void init_atom(struct wlr_x11_backend *x11, struct wlr_x11_atom *atom,
atom->reply = xcb_intern_atom_reply(x11->xcb_conn, atom->cookie, NULL);
}
+static void parse_xcb_setup(struct wlr_output *output, xcb_connection_t *xcb_conn) {
+ const xcb_setup_t *xcb_setup = xcb_get_setup(xcb_conn);
+
+ snprintf(output->make, sizeof(output->make), "%.*s",
+ xcb_setup_vendor_length(xcb_setup),
+ xcb_setup_vendor(xcb_setup));
+ snprintf(output->model, sizeof(output->model), "%"PRIu16".%"PRIu16,
+ xcb_setup->protocol_major_version,
+ xcb_setup->protocol_minor_version);
+}
+
static bool wlr_x11_backend_start(struct wlr_backend *backend) {
struct wlr_x11_backend *x11 = (struct wlr_x11_backend *)backend;
struct wlr_x11_output *output = &x11->output;
@@ -207,6 +218,7 @@ static bool wlr_x11_backend_start(struct wlr_backend *backend) {
wlr_output_init(&output->wlr_output, &x11->backend, &output_impl,
x11->wl_display);
snprintf(output->wlr_output.name, sizeof(output->wlr_output.name), "X11-1");
+ parse_xcb_setup(&output->wlr_output, x11->xcb_conn);
output->win = xcb_generate_id(x11->xcb_conn);
xcb_create_window(x11->xcb_conn, XCB_COPY_FROM_PARENT, output->win,