mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-12-22 18:09:49 +01:00
examples/output-layers: relay feedback events
This commit is contained in:
parent
849c362ffb
commit
9a425841b0
1 changed files with 38 additions and 2 deletions
|
@ -10,6 +10,8 @@
|
|||
#include <wlr/render/allocator.h>
|
||||
#include <wlr/render/wlr_renderer.h>
|
||||
#include <wlr/types/wlr_compositor.h>
|
||||
#include <wlr/types/wlr_drm.h>
|
||||
#include <wlr/types/wlr_linux_dmabuf_v1.h>
|
||||
#include <wlr/types/wlr_output.h>
|
||||
#include <wlr/types/wlr_output_layer.h>
|
||||
#include <wlr/types/wlr_xdg_shell.h>
|
||||
|
@ -27,6 +29,7 @@ struct server {
|
|||
struct wlr_backend *backend;
|
||||
struct wlr_renderer *renderer;
|
||||
struct wlr_allocator *allocator;
|
||||
struct wlr_linux_dmabuf_v1 *linux_dmabuf_v1;
|
||||
|
||||
struct wl_list outputs;
|
||||
|
||||
|
@ -37,6 +40,7 @@ struct server {
|
|||
struct output_surface {
|
||||
struct wlr_surface *wlr_surface;
|
||||
struct wlr_output_layer *layer;
|
||||
struct server *server;
|
||||
struct wl_list link;
|
||||
|
||||
int x, y;
|
||||
|
@ -46,6 +50,7 @@ struct output_surface {
|
|||
|
||||
struct wl_listener destroy;
|
||||
struct wl_listener commit;
|
||||
struct wl_listener layer_feedback;
|
||||
};
|
||||
|
||||
struct output {
|
||||
|
@ -174,10 +179,11 @@ static void output_surface_handle_destroy(struct wl_listener *listener,
|
|||
struct output_surface *output_surface =
|
||||
wl_container_of(listener, output_surface, destroy);
|
||||
wlr_buffer_unlock(output_surface->buffer);
|
||||
wlr_output_layer_destroy(output_surface->layer);
|
||||
wl_list_remove(&output_surface->destroy.link);
|
||||
wl_list_remove(&output_surface->commit.link);
|
||||
wl_list_remove(&output_surface->layer_feedback.link);
|
||||
wl_list_remove(&output_surface->link);
|
||||
wlr_output_layer_destroy(output_surface->layer);
|
||||
free(output_surface);
|
||||
}
|
||||
|
||||
|
@ -195,6 +201,26 @@ static void output_surface_handle_commit(struct wl_listener *listener,
|
|||
output_surface->buffer = buffer;
|
||||
}
|
||||
|
||||
static void output_surface_handle_layer_feedback(struct wl_listener *listener,
|
||||
void *data) {
|
||||
struct output_surface *output_surface =
|
||||
wl_container_of(listener, output_surface, layer_feedback);
|
||||
const struct wlr_output_layer_feedback_event *event = data;
|
||||
|
||||
wlr_log(WLR_DEBUG, "Sending linux-dmabuf feedback to surface %p",
|
||||
output_surface->wlr_surface);
|
||||
|
||||
struct wlr_linux_dmabuf_feedback_v1 feedback = {0};
|
||||
const struct wlr_linux_dmabuf_feedback_v1_init_options options = {
|
||||
.main_renderer = output_surface->server->renderer,
|
||||
.output_layer_feedback_event = event,
|
||||
};
|
||||
wlr_linux_dmabuf_feedback_v1_init_with_options(&feedback, &options);
|
||||
wlr_linux_dmabuf_v1_set_surface_feedback(output_surface->server->linux_dmabuf_v1,
|
||||
output_surface->wlr_surface, &feedback);
|
||||
wlr_linux_dmabuf_feedback_v1_finish(&feedback);
|
||||
}
|
||||
|
||||
static void server_handle_new_surface(struct wl_listener *listener,
|
||||
void *data) {
|
||||
struct server *server = wl_container_of(listener, server, new_surface);
|
||||
|
@ -204,12 +230,16 @@ static void server_handle_new_surface(struct wl_listener *listener,
|
|||
wl_list_for_each(output, &server->outputs, link) {
|
||||
struct output_surface *output_surface = calloc(1, sizeof(*output_surface));
|
||||
output_surface->wlr_surface = wlr_surface;
|
||||
output_surface->server = server;
|
||||
output_surface->destroy.notify = output_surface_handle_destroy;
|
||||
wl_signal_add(&wlr_surface->events.destroy, &output_surface->destroy);
|
||||
output_surface->commit.notify = output_surface_handle_commit;
|
||||
wl_signal_add(&wlr_surface->events.commit, &output_surface->commit);
|
||||
|
||||
output_surface->layer = wlr_output_layer_create(output->wlr_output);
|
||||
output_surface->layer_feedback.notify = output_surface_handle_layer_feedback;
|
||||
wl_signal_add(&output_surface->layer->events.feedback,
|
||||
&output_surface->layer_feedback);
|
||||
|
||||
int pos = 50 * wl_list_length(&output->surfaces);
|
||||
|
||||
|
@ -246,7 +276,13 @@ int main(int argc, char *argv[]) {
|
|||
server.backend = wlr_backend_autocreate(server.wl_display, NULL);
|
||||
|
||||
server.renderer = wlr_renderer_autocreate(server.backend);
|
||||
wlr_renderer_init_wl_display(server.renderer, server.wl_display);
|
||||
wlr_renderer_init_wl_shm(server.renderer, server.wl_display);
|
||||
|
||||
if (wlr_renderer_get_dmabuf_texture_formats(server.renderer) != NULL) {
|
||||
wlr_drm_create(server.wl_display, server.renderer);
|
||||
server.linux_dmabuf_v1 = wlr_linux_dmabuf_v1_create_with_renderer(
|
||||
server.wl_display, 4, server.renderer);
|
||||
}
|
||||
|
||||
server.allocator = wlr_allocator_autocreate(server.backend,
|
||||
server.renderer);
|
||||
|
|
Loading…
Reference in a new issue