From 9b984253e2b878128d2042836a8c86228700b1ee Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Sat, 21 Oct 2017 14:48:58 +1300 Subject: Move egl.h to render/egl.h --- backend/x11/backend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backend/x11/backend.c') diff --git a/backend/x11/backend.c b/backend/x11/backend.c index 11dd8568..4ecca325 100644 --- a/backend/x11/backend.c +++ b/backend/x11/backend.c @@ -15,7 +15,7 @@ #endif #include #include -#include +#include #include #include #include -- cgit v1.2.3 From 822a9f65a4f965a7561de287013c2a5c159453ab Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Sat, 21 Oct 2017 17:37:25 +1300 Subject: Add pointer to backend inside wlr_output --- backend/drm/drm.c | 2 +- backend/wayland/output.c | 2 +- backend/x11/backend.c | 2 +- include/wlr/interfaces/wlr_output.h | 6 ++++-- include/wlr/types/wlr_output.h | 4 +++- types/wlr_output.c | 3 ++- 6 files changed, 12 insertions(+), 7 deletions(-) (limited to 'backend/x11/backend.c') diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 0e898d3f..b3057166 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -707,7 +707,7 @@ void wlr_drm_scan_connectors(struct wlr_drm_backend *drm) { drmModeFreeConnector(drm_conn); continue; } - wlr_output_init(&wlr_conn->output, &output_impl); + wlr_output_init(&wlr_conn->output, &drm->backend, &output_impl); struct wl_event_loop *ev = wl_display_get_event_loop(drm->display); wlr_conn->retry_pageflip = wl_event_loop_add_timer(ev, retry_pageflip, diff --git a/backend/wayland/output.c b/backend/wayland/output.c index e1138ee1..0216823e 100644 --- a/backend/wayland/output.c +++ b/backend/wayland/output.c @@ -241,7 +241,7 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) { wlr_log(L_ERROR, "Failed to allocate wlr_wl_backend_output"); return NULL; } - wlr_output_init(&output->wlr_output, &output_impl); + wlr_output_init(&output->wlr_output, &backend->backend, &output_impl); struct wlr_output *wlr_output = &output->wlr_output; wlr_output->width = 640; diff --git a/backend/x11/backend.c b/backend/x11/backend.c index 4ecca325..d30ec376 100644 --- a/backend/x11/backend.c +++ b/backend/x11/backend.c @@ -264,7 +264,7 @@ static bool wlr_x11_backend_start(struct wlr_backend *backend) { output->x11 = x11; - wlr_output_init(&output->wlr_output, &output_impl); + wlr_output_init(&output->wlr_output, &x11->backend, &output_impl); snprintf(output->wlr_output.name, sizeof(output->wlr_output.name), "X11-1"); output->win = xcb_generate_id(x11->xcb_conn); diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index b7927569..17dd5538 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -1,8 +1,9 @@ #ifndef WLR_INTERFACES_WLR_OUTPUT_H #define WLR_INTERFACES_WLR_OUTPUT_H -#include #include +#include +#include struct wlr_output_impl { void (*enable)(struct wlr_output *output, bool enable); @@ -21,7 +22,8 @@ struct wlr_output_impl { uint16_t (*get_gamma_size)(struct wlr_output *output); }; -void wlr_output_init(struct wlr_output *output, const struct wlr_output_impl *impl); +void wlr_output_init(struct wlr_output *output, struct wlr_backend *backend, + const struct wlr_output_impl *impl); void wlr_output_free(struct wlr_output *output); void wlr_output_update_matrix(struct wlr_output *output); struct wl_global *wlr_output_create_global( diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 312b51f8..a2d595ea 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -1,9 +1,10 @@ #ifndef WLR_TYPES_WLR_OUTPUT_H #define WLR_TYPES_WLR_OUTPUT_H +#include #include +#include #include -#include struct wlr_output_mode { uint32_t flags; // enum wl_output_mode @@ -15,6 +16,7 @@ struct wlr_output_impl; struct wlr_output { const struct wlr_output_impl *impl; + struct wlr_backend *backend; struct wl_global *wl_global; struct wl_list wl_resources; diff --git a/types/wlr_output.c b/types/wlr_output.c index 5e10509e..c89c5c45 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -307,8 +307,9 @@ bool wlr_output_move_cursor(struct wlr_output *output, int x, int y) { return output->impl->move_cursor(output, x, y); } -void wlr_output_init(struct wlr_output *output, +void wlr_output_init(struct wlr_output *output, struct wlr_backend *backend, const struct wlr_output_impl *impl) { + output->backend = backend; output->impl = impl; output->modes = list_create(); output->transform = WL_OUTPUT_TRANSFORM_NORMAL; -- cgit v1.2.3 From eea532911a5be8d45770d074546bdeb8a0f16c5b Mon Sep 17 00:00:00 2001 From: emersion Date: Mon, 23 Oct 2017 21:03:00 +0200 Subject: Send output current mode when changed --- backend/wayland/output.c | 10 +++----- backend/x11/backend.c | 4 +-- include/wlr/interfaces/wlr_output.h | 3 ++- types/wlr_output.c | 51 ++++++++++++++++++++++++++++++++----- 4 files changed, 51 insertions(+), 17 deletions(-) (limited to 'backend/x11/backend.c') diff --git a/backend/wayland/output.c b/backend/wayland/output.c index 3194e2cf..0dde343c 100644 --- a/backend/wayland/output.c +++ b/backend/wayland/output.c @@ -210,9 +210,7 @@ static void xdg_toplevel_handle_configure(void *data, struct zxdg_toplevel_v6 *x } // loop over states for maximized etc? wl_egl_window_resize(output->egl_window, width, height, 0, 0); - output->wlr_output.width = width; - output->wlr_output.height = height; - wlr_output_update_matrix(&output->wlr_output); + wlr_output_update_size(&output->wlr_output, width, height); wl_signal_emit(&output->wlr_output.events.resolution, output); } @@ -244,13 +242,11 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) { wlr_output_init(&output->wlr_output, &backend->backend, &output_impl); struct wlr_output *wlr_output = &output->wlr_output; - wlr_output->width = 640; - wlr_output->height = 480; + wlr_output_update_size(wlr_output, 640, 480); strncpy(wlr_output->make, "wayland", sizeof(wlr_output->make)); strncpy(wlr_output->model, "wayland", sizeof(wlr_output->model)); snprintf(wlr_output->name, sizeof(wlr_output->name), "WL-%d", - wl_list_length(&backend->outputs) + 1); - wlr_output_update_matrix(wlr_output); + wl_list_length(&backend->outputs) + 1); output->backend = backend; diff --git a/backend/x11/backend.c b/backend/x11/backend.c index d30ec376..0e98b8d9 100644 --- a/backend/x11/backend.c +++ b/backend/x11/backend.c @@ -121,9 +121,7 @@ static bool handle_x11_event(struct wlr_x11_backend *x11, xcb_generic_event_t *e case XCB_CONFIGURE_NOTIFY: { xcb_configure_notify_event_t *ev = (xcb_configure_notify_event_t *)event; - output->wlr_output.width = ev->width; - output->wlr_output.height = ev->height; - wlr_output_update_matrix(&output->wlr_output); + wlr_output_update_size(&output->wlr_output, ev->width, ev->height); wl_signal_emit(&output->wlr_output.events.resolution, output); // Move the pointer to its new location diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index 636cc06c..d365e8f5 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -25,7 +25,8 @@ struct wlr_output_impl { void wlr_output_init(struct wlr_output *output, struct wlr_backend *backend, const struct wlr_output_impl *impl); void wlr_output_free(struct wlr_output *output); -void wlr_output_update_matrix(struct wlr_output *output); +void wlr_output_update_size(struct wlr_output *output, int32_t width, + int32_t height); struct wl_global *wlr_output_create_global(struct wlr_output *wlr_output, struct wl_display *display); void wlr_output_destroy_global(struct wlr_output *wlr_output); diff --git a/types/wlr_output.c b/types/wlr_output.c index a02798b2..e8d4af3e 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -33,8 +33,8 @@ static void wl_output_send_to_resource(struct wl_resource *resource) { if (output->current_mode == mode) { flags |= WL_OUTPUT_MODE_CURRENT; } - wl_output_send_mode(resource, flags, - mode->width, mode->height, mode->refresh); + wl_output_send_mode(resource, flags, mode->width, mode->height, + mode->refresh); } if (wl_list_length(&output->modes) == 0) { @@ -51,6 +51,25 @@ static void wl_output_send_to_resource(struct wl_resource *resource) { } } +static void wlr_output_send_current_mode_to_resource( + struct wl_resource *resource) { + struct wlr_output *output = wl_resource_get_user_data(resource); + assert(output); + const uint32_t version = wl_resource_get_version(resource); + if (version < WL_OUTPUT_MODE_SINCE_VERSION) { + return; + } + if (output->current_mode != NULL) { + struct wlr_output_mode *mode = output->current_mode; + wl_output_send_mode(resource, mode->flags | WL_OUTPUT_MODE_CURRENT, + mode->width, mode->height, mode->refresh); + } else { + // Output has no mode, send the current width/height + wl_output_send_mode(resource, WL_OUTPUT_MODE_CURRENT, output->width, + output->height, 0); + } +} + static void wl_output_destroy(struct wl_resource *resource) { struct wlr_output *output = wl_resource_get_user_data(resource); struct wl_resource *_resource = NULL; @@ -110,32 +129,52 @@ void wlr_output_destroy_global(struct wlr_output *wlr_output) { wlr_output->wl_global = NULL; } -void wlr_output_update_matrix(struct wlr_output *output) { - wlr_matrix_texture(output->transform_matrix, output->width, output->height, output->transform); +static void wlr_output_update_matrix(struct wlr_output *output) { + wlr_matrix_texture(output->transform_matrix, output->width, output->height, + output->transform); } void wlr_output_enable(struct wlr_output *output, bool enable) { output->impl->enable(output, enable); } -bool wlr_output_set_mode(struct wlr_output *output, struct wlr_output_mode *mode) { +bool wlr_output_set_mode(struct wlr_output *output, + struct wlr_output_mode *mode) { if (!output->impl || !output->impl->set_mode) { return false; } bool result = output->impl->set_mode(output, mode); if (result) { wlr_output_update_matrix(output); + struct wl_resource *resource; + wl_resource_for_each(resource, &output->wl_resources) { + wlr_output_send_current_mode_to_resource(resource); + } } return result; } +void wlr_output_update_size(struct wlr_output *output, int32_t width, + int32_t height) { + output->width = width; + output->height = height; + wlr_output_update_matrix(output); + if (output->wl_global != NULL) { + struct wl_resource *resource; + wl_resource_for_each(resource, &output->wl_resources) { + wlr_output_send_current_mode_to_resource(resource); + } + } +} + void wlr_output_transform(struct wlr_output *output, enum wl_output_transform transform) { output->impl->transform(output, transform); wlr_output_update_matrix(output); } -void wlr_output_set_position(struct wlr_output *output, int32_t lx, int32_t ly) { +void wlr_output_set_position(struct wlr_output *output, int32_t lx, + int32_t ly) { if (lx == output->lx && ly == output->ly) { return; } -- cgit v1.2.3