/*
 * info_display.cc
 *
 * Copyright (C) 1995-2001 Kenichi Kourai
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with qvwm; see the file COPYING.  If not, write to
 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
#include "main.h"
#include "info_display.h"

#define X_MARGIN 10
#define Y_MARGIN 6

InfoDisplay::InfoDisplay()
{
  XSetWindowAttributes attributes;
  unsigned long valueMask;

  attributes.event_mask = ExposureMask;
  attributes.background_pixel = gray.pixel;
  valueMask = CWBackPixel | CWEventMask;

  frame = XCreateWindow(display, root,
			0, 0, 1, 1,
			0, CopyFromParent, InputOutput, CopyFromParent,
			valueMask, &attributes);

  strInfo[0] = '\0';
}

InfoDisplay::~InfoDisplay()
{
  XDestroyWindow(display, frame);
}

void InfoDisplay::Map()
{
  XMapRaised(display, frame);
}

void InfoDisplay::Unmap()
{
  XUnmapWindow(display, frame);

  strInfo[0] = '\0';
}

void InfoDisplay::Draw()
{
  int len = strlen(strInfo);
  XRectangle ink, log;
  Point pt;

  XmbTextExtents(fsTitle, strInfo, len, &ink, &log);

  rc.width = log.width + X_MARGIN * 2;
  rc.height = log.height + Y_MARGIN * 2;
  rc.x = (DisplayWidth(display, screen) - rc.width) / 2;
  rc.y = (DisplayHeight(display, screen) - rc.height) / 2;

  XMoveResizeWindow(display, frame, rc.x, rc.y, rc.width, rc.height);
  XClearWindow(display, frame);

  pt.x = X_MARGIN - log.x;
  pt.y = Y_MARGIN - log.y;

  XSetForeground(display, gc, black.pixel);
  XmbDrawString(display, frame, fsTitle, gc, pt.x, pt.y, strInfo, len);

  XPoint xp[3];

  xp[0].x = rc.width - 2;
  xp[0].y = 0;
  xp[1].x = 0;
  xp[1].y = 0;
  xp[2].x = 0;
  xp[2].y = rc.height - 2;

  XSetForeground(display, gc, white.pixel);
  XDrawLines(display, frame, gc, xp, 3, CoordModeOrigin);

  xp[0].x = rc.width - 1;
  xp[0].y = 0;
  xp[1].x = rc.width - 1;
  xp[1].y = rc.height - 1;
  xp[2].x = 0;
  xp[2].y = rc.height - 1;

  XSetForeground(display, gc, darkGrey.pixel);
  XDrawLines(display, frame, gc, xp, 3, CoordModeOrigin);

  xp[0].x = rc.width - 3;
  xp[0].y = 1;
  xp[1].x = 1;
  xp[1].y = 1;
  xp[2].x = 1;
  xp[2].y = rc.height - 3;

  XSetForeground(display, gc, gray.pixel);
  XDrawLines(display, frame, gc, xp, 3, CoordModeOrigin);

  xp[0].x = rc.width - 2;
  xp[0].y = 1;
  xp[1].x = rc.width - 2;
  xp[1].y = rc.height - 2;
  xp[2].x = 1;
  xp[2].y = rc.height - 2;
  
  XSetForeground(display, gc, darkGray.pixel);
  XDrawLines(display, frame, gc, xp, 3, CoordModeOrigin);

  // internal box
  xp[0].x = rc.width - 5;
  xp[0].y = 3;
  xp[1].x = 3;
  xp[1].y = 3;
  xp[2].x = 3;
  xp[2].y = rc.height - 5;

  XSetForeground(display, gc, darkGray.pixel);
  XDrawLines(display, frame, gc, xp, 3, CoordModeOrigin);

  xp[0].x = rc.width - 4;
  xp[0].y = 2;
  xp[1].x = rc.width - 4;
  xp[1].y = rc.height - 4;
  xp[2].x = 2;
  xp[2].y = rc.height - 4;

  XSetForeground(display, gc, white.pixel);
  XDrawLines(display, frame, gc, xp, 3, CoordModeOrigin);
}  

void InfoDisplay::NotifyPosition(const Point& pt)
{
  sprintf(strInfo, "%d, %d", pt.x, pt.y);
  Draw();
}

void InfoDisplay::NotifyShape(const Rect& rect)
{
  sprintf(strInfo, "%d, %d, %d, %d", rect.x, rect.y, rect.width, rect.height);
  Draw();
}


syntax highlighted by Code2HTML, v. 0.9.1