// Copyright (c) 2010 The Chromium OS 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 "glbench/xlib_window.h"

#include <gflags/gflags.h>
#include <stdio.h>

#include "base/logging.h"

#include "glbench/glinterface.h"
#include "glbench/main.h"


Display *g_xlib_display = NULL;
Window g_xlib_window = 0;

GLint g_width = WINDOW_WIDTH;
GLint g_height = WINDOW_HEIGHT;
DEFINE_bool(override_redirect, true, "Use an override redirect window");


bool XlibInit() {
  // Prevent multiple initializations.
  if (g_xlib_window)
    return true;

  g_xlib_display = XOpenDisplay(0);
  if (!g_xlib_display) {
    printf("# Error: in xlib_window.cc::XlibInit() could not open "
           "default display.\n");
    return false;
  }

  int screen = DefaultScreen(g_xlib_display);
  Window root_window = RootWindow(g_xlib_display, screen);

  XWindowAttributes attributes;
  XGetWindowAttributes(g_xlib_display, root_window, &attributes);

  g_width = g_width == -1 ? attributes.width : g_width;
  g_height = g_height == -1 ? attributes.height : g_height;
  XVisualInfo* xlib_visinfo = g_main_gl_interface->GetXVisual();

  unsigned long mask =  // NOLINT(runtime/int)
      CWBackPixel | CWBorderPixel | CWColormap | CWEventMask |
      CWOverrideRedirect;
  XSetWindowAttributes attr;
  attr.background_pixel = 0;
  attr.border_pixel = 0;
  attr.colormap = XCreateColormap(g_xlib_display, root_window,
                                  xlib_visinfo->visual, AllocNone);
  attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
  attr.override_redirect = FLAGS_override_redirect ? True : False;
  g_xlib_window = XCreateWindow(g_xlib_display, root_window,
                                0, 0, g_width, g_height, 0,
                                xlib_visinfo->depth, InputOutput,
                                xlib_visinfo->visual, mask, &attr);

  XMapWindow(g_xlib_display, g_xlib_window);
  XSync(g_xlib_display, True);

  XGetWindowAttributes(g_xlib_display, g_xlib_window, &attributes);
  g_width = attributes.width;
  g_height = attributes.height;

  XFree(xlib_visinfo);

  return true;
}
