Untitled

 avatar
unknown
plain_text
a month ago
2.8 kB
1
Indexable
// rdprail_output.c
#include <assert.h>
#include <stdlib.h>
#include <wlr/interfaces/wlr_output.h>
#include <wlr/util/log.h>
#include "backend/rdprail/rdprail_output.h"

// Remove the gamma size function as it's not needed

// rdprail_output.c
static bool output_test(struct wlr_output *wlr_output,
        const struct wlr_output_state *state) {
    return true;  // Always allow test state
}

static bool output_commit(struct wlr_output *wlr_output,
        const struct wlr_output_state *state) {
    struct wlr_rdp_output *output = (struct wlr_rdp_output *)wlr_output;
    
    if (state->committed & WLR_OUTPUT_STATE_BUFFER && state->buffer) {
        void *data;
        uint32_t format;
        size_t stride;

        if (wlr_buffer_begin_data_ptr_access(state->buffer, 0,
            &data, &format, &stride)) {
            // Get damage region
            pixman_box32_t *rects;
            int n_rects;
            rects = pixman_region32_rectangles(&output->pending.damage, &n_rects);

            for (int i = 0; i < n_rects; i++) {
                RECTANGLE_16 rect = {
                    .left = (uint16_t)rects[i].x1,
                    .top = (uint16_t)rects[i].y1,
                    .right = (uint16_t)rects[i].x2,
                    .bottom = (uint16_t)rects[i].y2
                };

                output->backend->redir_ctx->SurfaceCommand(
                    output->backend->redir_ctx,
                    output,
                    GFX_REDIR_SURFACE_COMMAND_UPDATEREGION,
                    &rect,
                    data);
            }

            wlr_buffer_end_data_ptr_access(state->buffer);
        }
    }
    return true;
}

static void output_destroy(struct wlr_output *wlr_output) {
    struct wlr_rdp_output *output = (struct wlr_rdp_output *)wlr_output;
    wl_list_remove(&output->link);
    free(output);
}

static const struct wlr_output_impl output_impl = {
    .destroy = output_destroy,
    .test = output_test,
    .commit = output_commit,
};
struct wlr_rdp_output *wlr_rdp_output_create(struct wlr_rdp_backend *backend) {
    struct wlr_rdp_output *output = calloc(1, sizeof(*output));
    if (!output) {
        return NULL;
    }

    struct wl_event_loop *event_loop = 
        wl_display_get_event_loop(backend->display);

    wlr_output_init(&output->base,
        &backend->base,     // backend
        &output_impl,       // impl
        event_loop,         // event_loop
        NULL);             // state

    output->backend = backend;
    output->width = 1920;
    output->height = 1080;
    output->refresh_rate = 60000;

    pixman_region32_init(&output->pending.damage);

    wl_list_insert(&backend->outputs, &output->link);
    wlr_signal_emit_safe(&backend->events.new_output, output);

    return output;
}
Leave a Comment