// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "fl_renderer_x11.h"

struct _FlRendererX11 {
  FlRenderer parent_instance;

  Window xid;
};

G_DEFINE_TYPE(FlRendererX11, fl_renderer_x11, fl_renderer_get_type())

static EGLSurface fl_renderer_x11_create_surface(FlRenderer* renderer,
                                                 EGLDisplay display,
                                                 EGLConfig config) {
  FlRendererX11* self = FL_RENDERER_X11(renderer);
  return eglCreateWindowSurface(display, config, self->xid, nullptr);
}

static void fl_renderer_x11_class_init(FlRendererX11Class* klass) {
  FL_RENDERER_CLASS(klass)->create_surface = fl_renderer_x11_create_surface;
}

static void fl_renderer_x11_init(FlRendererX11* self) {}

FlRendererX11* fl_renderer_x11_new() {
  return FL_RENDERER_X11(g_object_new(fl_renderer_x11_get_type(), nullptr));
}

void fl_renderer_x11_set_xid(FlRendererX11* self, Window xid) {
  g_return_if_fail(FL_IS_RENDERER_X11(self));
  self->xid = xid;
}
