#pragma once

#include <algorithm>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>

#include <xcb/xcb.h>
#include <xcb/randr.h>

#include <xpp.hpp>
#include <proto/randr.hpp>

namespace x
{
  typedef xpp::connection<xpp::randr::extension> connection;
  typedef xpp::event::registry<connection &, xpp::randr::extension> registry;

  typedef xpp::window<connection &> window;
  typedef xpp::window<xcb_connection_t *> xcb_window;

  typedef xpp::x::event::key_press<connection &> key_press;
  typedef xpp::x::event::key_release<connection &> key_release;
  typedef xpp::x::event::button_press<connection &> button_press;

  typedef xpp::randr::event::notify<connection &> randr_notify;
  typedef xpp::randr::event::screen_change_notify<connection &> randr_screen_change_notify;
}

namespace xcb
{
  typedef struct monitor_t monitor_t;
  struct monitor_t
  {
    char name[32] = "NONAME";
    xcb_rectangle_t bounds;
    int index = 0;
  };

  namespace connection
  {
    bool check(xcb_connection_t *connection);
  }

  namespace monitor
  {
    std::shared_ptr<monitor_t> make_object();
    std::shared_ptr<monitor_t> make_object(char *name, size_t name_len, int idx, xcb_rectangle_t *rect);

    std::vector<std::shared_ptr<monitor_t>> get_list(xcb_connection_t *connection, xcb_window_t root);
  }
}