/*
 * util.h
 *
 * Copyright (C) 1995, 1996, 1997, 1997, 1998, 1999, 2000, 2001, 2002 Kenichi Kourai
 * Copyright (C) 1999, 2000, 2001, 2002 Luiz Blanes
 *
 * 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 of the License, 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 blwm; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#ifndef _UTIL_H_
#define _UTIL_H_

#include "misc.h"
#include "image.h"
#include "function.h"

/*
 * Size and bitmask from GetGeometry().
 */
 class InternGeom {
 public:
   Rect rc;
   Point gravity;
   int bitmask;
 
 public:
   InternGeom() {}
   InternGeom(int x, int y, unsigned int width, unsigned int height,
 	     const Point& grav)
     : rc(Rect(x, y, width, height)), gravity(grav),
       bitmask(XValue|YValue|WidthValue|HeightValue) {}

};

/*
 * The origin of menu.
 */
struct MenuElem {
  char* name;
  char* file;
  FuncNumber func;
  char* exec;
  int x, y;
  MenuElem* next;
  MenuElem* child;
};

/*
 * Fontset and fontname.
 */
struct FsNameSet {
  XFontSet* fs;
  char** fontname;
};

/*
 * Attribute bit and the name.
 */
struct AttrNameSet {
  char* name;
  unsigned long flag;
  Bool act;
};

class AppAttr {
public:
  unsigned long flags;
  char* small_file;
  BlImage* small_img;
  char* large_file;
  BlImage* large_img;
  InternGeom geom;

  AppAttr() : flags(0), small_file(NULL), small_img(NULL),
              large_file(NULL), large_img(NULL) {}
  ~AppAttr() {
    if (small_img != NULL)
      BlImage::Destroy(small_img);
    if (large_img != NULL)
      BlImage::Destroy(large_img);
  }
};

/*
 * Key modifier
 */
struct KeyMod
{
  char* str;
  unsigned int mask;
};

/*
 * Offset
 */
const int CENTER = -1;
const int EAST = -2;
const int WEST = 0;
const int NORTH = 0;
const int SOUTH = -2;

extern Point GravityOffset[];

/*
 * inline function
 */
inline int Max(int x, int y)
{
  return ((x > y) ? x : y);
}

inline int Min(int x, int y)
{
  return ((x < y) ? x : y);
}

inline int RoundDown(int x, int y)
{
  return x / y * y;
}

inline int RoundUp(int x, int y)
{
  return (x + y - 1) / y * y;
}

inline int RoundOff(int x, int y)
{
  int rdx = x / y * y;

  return (x - rdx > y / 2) ? (rdx + y) : rdx;
}

class Menu;
class BlImage;
class Timer;

extern Bool InRect(const Point& pt, const Rect& rc);
extern Bool Intersect(const Rect& rc1, const Rect& rc2);
extern Bool IsDoubleClick(Time prevTime, Time clickTime, const Point& ptPrev,
			  const Point& ptClick);
extern int GetMenuItemNum(const MenuElem* mItem);
extern BlImage* CreateImageFromFile(char* file, Timer* timer);
extern BlImage* CreateImage(char* filename, Timer* timer);
extern char* GetFixName(XFontSet& fs, const char* name, int width);
extern Bool MappedNotOverride(Window w, long* state);
extern GC CreateTileGC(Drawable d);
extern void DarkenScreen();
extern void RefreshScreen();
extern pid_t ExecCommand(char* exec);
extern void RestoreCursor();
extern char* ExtractPathName(char* name);
extern char* GetNextDelim(char* path, char* name, int maxSize);

#ifndef HAVE_USLEEP
#ifdef __EMX__
#include <emx/syscalls.h>
#define usleep __sleep2
#else
extern void usleep(unsigned long);
#endif
#endif // HAVE_USLEEP

extern int GetRealWidth(XFontSet fs, char* str);
extern void DrawRealString(Window w, XFontSet fs, GC gc, int x, int y,
			   char* str);
extern Bool IsPointerInWindow(const Point& ptRoot);
extern int CreateColor(unsigned short red, unsigned short green,
 		       unsigned short blue, XColor* color,
 		       XColor* substitute = NULL, const char* comment = NULL);

Bool SetGeometry(char* str, InternGeom* geom);
void SetDisplayEnv(const char* displayName);
int GetXColorFromName(const char* str, XColor* color);

#endif // _UTIL_H_


syntax highlighted by Code2HTML, v. 0.9.1