#ifdef HAS_X11

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include <X11/Xlib.h>

bool x11_window(WGPUSurfaceSourceXlibWindow *result, int xw, int yh)
{
  Display *dis;
  Window   win;


  Zero((void*)result, 1, WGPUSurfaceSourceXlibWindow);
  xw = xw ? xw : 640;
  yh = yh ? yh : 360;

  dis = XOpenDisplay(NULL);

  if (!dis)
  {
    return false;
  }

  int scr = DefaultScreen( dis );
  Window root = RootWindow( dis, scr );

  if ( !root )
  {
    XCloseDisplay( dis );
    return false;
  }

  win = XCreateSimpleWindow(
        dis,
        root,
        10, 10,
        xw, yh,
        1, 0,
        0
  );

  XSelectInput(dis, win, ExposureMask);
  XMapWindow( dis, win);

  for (int i = 0; i < 10; i++)
  {
    XEvent e = {};
    XNextEvent(dis, &e);
    if (e.type == Expose) {
      break;
    }
  }

  XSelectInput(dis, win, 0);

  result->chain.sType = WGPUSType_SurfaceSourceXlibWindow;
  result->display = dis;
  result->window  = win;

  return true;
}

#endif