diff --git a/backend/drm/drm.c b/backend/drm/drm.c index e37eba74..e61e624d 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -342,17 +342,17 @@ static void drm_connector_start_renderer(struct wlr_drm_connector *conn) { } } -void enable_drm_connector(struct wlr_output *output, bool enable) { +bool enable_drm_connector(struct wlr_output *output, bool enable) { struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output; if (conn->state != WLR_DRM_CONN_CONNECTED && conn->state != WLR_DRM_CONN_NEEDS_MODESET) { - return; + return false; } struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend; bool ok = drm->iface->conn_enable(drm, conn, enable); if (!ok) { - return; + return false; } if (enable) { @@ -360,6 +360,7 @@ void enable_drm_connector(struct wlr_output *output, bool enable) { } wlr_output_update_enabled(&conn->output, enable); + return true; } static void realloc_planes(struct wlr_drm_backend *drm, const uint32_t *crtc_in, diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h index fe279917..25225227 100644 --- a/include/backend/drm/drm.h +++ b/include/backend/drm/drm.h @@ -143,6 +143,6 @@ void finish_drm_resources(struct wlr_drm_backend *drm); void restore_drm_outputs(struct wlr_drm_backend *drm); void scan_drm_connectors(struct wlr_drm_backend *state); int handle_drm_event(int fd, uint32_t mask, void *data); -void enable_drm_connector(struct wlr_output *output, bool enable); +bool enable_drm_connector(struct wlr_output *output, bool enable); #endif diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index 4860a5b6..4cbf0d67 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -15,7 +15,7 @@ #include struct wlr_output_impl { - void (*enable)(struct wlr_output *output, bool enable); + bool (*enable)(struct wlr_output *output, bool enable); bool (*set_mode)(struct wlr_output *output, struct wlr_output_mode *mode); bool (*set_custom_mode)(struct wlr_output *output, int32_t width, int32_t height, int32_t refresh); diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 3a9f3c41..ded57959 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -124,11 +124,15 @@ struct wlr_output_event_swap_buffers { struct wlr_surface; -void wlr_output_enable(struct wlr_output *output, bool enable); +/** + * Enables or disables the output. A disabled output is turned off and doesn't + * emit `frame` events. + */ +bool wlr_output_enable(struct wlr_output *output, bool enable); void wlr_output_create_global(struct wlr_output *output); void wlr_output_destroy_global(struct wlr_output *output); /** - * Sets the output mode. + * Sets the output mode. Enables the output if it's currently disabled. */ bool wlr_output_set_mode(struct wlr_output *output, struct wlr_output_mode *mode); diff --git a/types/wlr_output.c b/types/wlr_output.c index abbdab9c..b864bc6c 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -142,14 +142,15 @@ static void output_update_matrix(struct wlr_output *output) { output->height, output->transform); } -void wlr_output_enable(struct wlr_output *output, bool enable) { +bool wlr_output_enable(struct wlr_output *output, bool enable) { if (output->enabled == enable) { - return; + return true; } if (output->impl->enable) { - output->impl->enable(output, enable); + return output->impl->enable(output, enable); } + return false; } bool wlr_output_set_mode(struct wlr_output *output,