/* Copyright 1989 GROUPE BULL -- See license conditions in file COPYRIGHT
 * Copyright 1989 Massachusetts Institute of Technology
 */
/***************************************************************\
* 							        *
* 	BULL WINDOW MANAGER for X11 			        *
* 							        *
* 	general include file, contains GWM specific typedef.    *
* 							        *
\***************************************************************/

#ifndef INCLUDE_WOOL_H
#include "wool.h"
#endif
#ifdef DEBUG
#include <stdio.h>
#endif /* DEBUG */
#define GWM_h

extern char GWM_version_name[];

/* some parameters */

#define WLPROFILE_USER_VARIABLE "GWMPROFILE"
#define WOOL_USER_PROFILE ".gwmrc"
#define WOOL_TEXT_EXTENSION ".gwm"
#define WLPATH_SHELL_VARIABLE "GWMPATH"

/* adaptation to the different X11 libraries */

#if defined(X11R1) || defined(X11R2)|| defined(X11R3)
#  define NOBASEDIMS
#  define NOXEHTYPE
#else /* R4, R5, R6... */
#define SHAPE
#endif

#if defined(X11R1)||defined(X11R2)||defined(X11R3)||defined(X11R4)
typedef char *XPointer;
#endif

/* useful macro: XFree of a pointer that may be null */
#define XFreeN(p) if (p) XFree(p)

/* customization flags */

#ifndef TRUE
#define TRUE			1
#define FALSE			0
#endif
#ifndef Max
#define Max(x,y)		(((x)<(y))?(y):(x))
#define Min(x,y)		(((x)<(y))?(x):(y))
#define FlagOn(mask,flag) ((mask)&(flag))
#endif

#define HORIZONTAL		0
#define VERTICAL		1

typedef char   *Pointer;

typedef long    WoolAtom;
typedef char   *AtomName;
typedef int     Errno;
typedef int     (*PtrToFunc) ();
typedef void    (*PtrToProc) ();

/*
 * error numbers
 */

#define OK 				0
#define FatalError 		-1
EXT int      ErrorStatus;	/* setted at a string in XError */

/* X types */

#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>

typedef XEvent  EventData, *Event;

extern Card32 EventProperties[];
extern int EventTimeFieldOffset[];
#define EPGrabRedirected (1<<0)
#define EPKeyOrButton    (1<<1)
#define EPCrossing       (1<<2)
#define EPFocus          (1<<3)
#define EPXY             (1<<4)
#define EPXYRoot         (1<<5)
#define EPTime           (1<<6)
#define EPRedirectable   (1<<7)

#define event_is_key_or_button(evt) \
	(EventProperties[(evt).type] & EPKeyOrButton)
#define event_is_grabbable(evt) \
	(EventProperties[(evt).type] & EPGrabRedirected)
#define event_is_redirectable(evt) \
	(EventProperties[(evt).type] & EPRedirectable)
#define event_is_crossing(evt) \
	(EventProperties[(evt).type] & EPCrossing)
#define event_is_focus(evt) \
	(EventProperties[(evt).type] & EPFocus)

#define LegalPointerEventMask(mask) ((mask) & (0xffff ^ 0x8003))

#ifndef WOB_h
#include "wob.h"
#endif

#define GWMUserEvent (LASTEvent+1)

/* The Context is a structure of all screen-dependent variables
 * Multi-screen operation will be handled by switching contextes
 */

EXT GWMScreenContext *GWMManagedScreens;/* the list of all screens on the
					   display, being NULL if not
					   managed. */
    
EXT GWMScreenContext  Context;		/* the current screen (pointer to) */
EXT GWMScreenContext *ContextPtr;	/* used by the following macro */
EXT GWMScreenContext GWM_OldContext;	/* for FOR_ALL_SCREENS macro */

#define FOR_ALL_SCREENS \
	{ GWMScreenContext OldContext = Context, *OldContextPtr = ContextPtr;\
	for (ContextPtr = GWMManagedScreens;\
	         ContextPtr < GWMManagedScreens + ScreenCount(dpy); \
	         ContextPtr++) \
	    if(Context = *ContextPtr)

#define END_OF_ALL_SCREENS Context = OldContext; ContextPtr = OldContextPtr;}

/*
 * ICCC structures
 */

#define WM_STATE_Withdrawn 0
#define WM_STATE_Normal 1
#define WM_STATE_Iconified 3

typedef struct _WM_STATE_PROP {
    Card32	state;		/* WM_STATE_Withdrawn, _Normal, _Iconified */
    Window	icon;		/* X window id of the icon */
} *WM_STATE_PROP;

#define WM_STATE_PROP_Length 2  /* in Card32 elements */

/* max length of some properties */

#define WM_COLORMAP_WINDOWS_PROP_Length 80 /* number of sub-wins colormaps */
#define WM_PROTOCOLS_PROP_Length        40 /* number of protocols */

/*
 * some useful macros
 */

#define check_window_size(wob) \
	if(!wob -> box.width && !wob -> box.height) \
		GWM_no_size_window_error(wob);

#define SAVE_EVENT_CONTEXT \
        Event old_TriggeringEvent = TriggeringEvent; \
	Wob   old_TargetWob = TargetWob; \
	ClientWindow old_TargetWindow = TargetWindow; \
	GWMScreenContext old_Context = Context

#define RESTORE_EVENT_CONTEXT \
	TriggeringEvent = old_TriggeringEvent; \
	TargetWob = old_TargetWob; \
	TargetWindow = old_TargetWindow; \
	Context = old_Context

#define TrapXErrors(statement) (\
  	XSync(dpy, 0), XSetErrorHandler(NoXError), ErrorStatus = 0,	\
	statement,  \
	XSync(dpy, 0), XSetErrorHandler(XError), ErrorStatus)

#define FlushXErrors() \
    	XSetErrorHandler(NoXError), XSync(dpy, 0), XSetErrorHandler(XError)

/*
 * tracing facilities:
 * trace1(level, string, parameter);
 * trace(level, string);
 */

#ifdef DEBUG
EXT int      GWM_Tracelevel INIT(0);

#define trace(l, s) ((l<=GWM_Tracelevel) ? fprintf(stderr,s) : 0);
#define trace1(l, s, p) ((l<=GWM_Tracelevel) ? fprintf(stderr,s,p) : 0);
#define trace2(l, s, p,q) ((l<=GWM_Tracelevel) ? fprintf(stderr,s,p,q) : 0);
#else /* DEBUG */
#define trace(l, s)
#define trace1(l, s, p)
#define trace2(l, s, p,q)
#endif /* DEBUG */

#ifdef SECURE
extern char    *eventtype[];

#endif /* SECURE */

#ifndef NULL
#define NULL	0
#endif

/*
 * GWM global variables, common to the display
 */

EXT Display    *dpy;		/* THE display */
EXT Time 	GWMTime INIT(0);/* the latest known server date */
EXT XContext 	wob_context;	/* to retrieve wobs via hooks */
EXT XContext 	client_context;	/* to retrieve wobs via clients */
EXT int         errno;
EXT Wob         TargetWob INIT(0);
EXT ClientWindow TargetWindow INIT(0);
EXT Event       TriggeringEvent INIT(0);
EXT char       *GWM_Display;
EXT int		GWM_ScreenCount;
EXT int		GWM_DefaultScreen;
EXT ClientWindow GWM_window_being_decorated INIT(0);
EXT int		GWM_ShapeExtension INIT(0); /* display has shape extension ? */
EXT int		GWM_ShapeEventBase INIT(0); /* first event # of shape ext. */
EXT int		GWM_ShapeErrorBase INIT(0); /* first error # of shape ext. */

/* switches */
EXT Wob         GWM_ServerGrabbed INIT(0);
EXT Wob         GWM_KeyboardGrabbed INIT(0);
EXT int         GWM_ProcessingExistingWindows INIT(0);
EXT int 	GWM_Mapall INIT(0);
EXT int 	GWM_Synchronize INIT(0);
EXT int		GWM_UserSynchronous INIT(1);
EXT int		GWM_Monoscreen INIT(0);
EXT int		GWM_No_set_focus INIT(0);
EXT char       *GWM_ScreensNotManaged INIT(0);
EXT int         GWM_Movegrid INIT(0);
EXT int         GWM_Resizegrid INIT(0);
EXT int 	GWM_Move_meter INIT(0);		/* is there a moving meter */
EXT int 	GWM_Resize_meter INIT(1);	/* is there a resize meter */
EXT int         GWM_InvertCursors INIT(1); /* for cursor-make */
EXT XEvent      GWM_LastEvent;		/* last key or button (user) event */
EXT Time        GWM_DoubleClickDelay INIT(500);	/* in millisecond */
EXT int		GWM_check_input_focus_flag INIT(1);/*  set focus check flag */
EXT int		GWM_backup_old_property INIT(0);
EXT int		GWM_GrabChildEvents INIT(0);
EXT int		GWM_Propagate_user_events INIT(1);
EXT ClientWindow GWM_Window_being_opened INIT(0);
EXT int		GWM_resize_style INIT(0);
EXT int		GWM_window_cutting_size INIT(0);
EXT int         GWM_Mwm_catch_corners INIT(0);
EXT int         GWM_grab_keyboard_also INIT(0);
EXT int         GWM_confine_grabs INIT(0);
EXT int         GWM_confine_windows INIT(0);
EXT int         GWM_quiet INIT(0);
EXT int 	GWM_reenter_on_opens INIT(1);
EXT int 	GWM_delete_read_properties INIT(False);
EXT int 	GWM_never_warp_pointer INIT(0);
EXT int 	GWM_kill_pid INIT(0);
EXT int 	GWM_kill_pid_sig INIT(0);
EXT int         GWM_xpm_closeness INIT(40000);
EXT int 	GWM_allow_border_on_shaped_windows INIT(False);

#ifdef DEBUG
EXT int         GWM_GrabServer INIT(0);
#else
EXT int         GWM_GrabServer INIT(1);
#endif /* DEBUG */

/* masks */
EXT unsigned int ClientMask 	     INIT(SubstructureRedirectMask);
EXT unsigned int ClientClientMask    INIT(PropertyChangeMask
					| StructureNotifyMask
					| ColormapChangeMask);
EXT unsigned int RootMask	     INIT(SubstructureRedirectMask
					| ColormapChangeMask
					| PropertyChangeMask);
EXT unsigned int WobMask 	     INIT(0);
EXT unsigned int MeterMask	     INIT(ExposureMask);

/* static data for remebering GWM state */

EXT int 	GWM_argc;			/* unix argc argv of GWM */
EXT char 	** GWM_argv;
EXT char 	** GWM_is_restarting INIT(0);
EXT int		GWM_is_ending INIT(0);
EXT int		GWM_time_of_last_bus_error INIT(0);
EXT union {			/* keep track of old prop */
    XWMHints	wm_hints;
} GWM_backup_of_old_property;

/* defaults */
EXT int         DefaultBorderWidth INIT(1);
EXT int         DefaultLabelHorizontalMargin INIT(4);
EXT int         DefaultLabelVerticalMargin INIT(2);
EXT int         DefaultPlugSeparator INIT(4);
EXT int         DefaultBarSeparator INIT(0);
EXT int         DefaultInnerBorderwidth INIT(ANY);
EXT int		DefaultMenuDirection INIT(1);
EXT int		DefaultBarMinWidth INIT(0);
EXT int		DefaultBarMaxWidth INIT(1000);
EXT int		DefaultMenuMinWidth INIT(1);
EXT int		DefaultMenuMaxWidth INIT(10000);
EXT int         DefaultFont;

/* X Atoms */
EXT Atom	XA_WM_STATE;
EXT Atom	XA_WM_COLORMAP_WINDOWS;
EXT Atom	XA_WM_CHANGE_STATE;
EXT Atom	XA_WM_PROTOCOLS;
EXT Atom	XA_WM_TAKE_FOCUS;
EXT Atom	XA_WM_SAVE_YOURSELF;
EXT Atom	XA_WM_DELETE_WINDOW;
EXT Atom        XA_GWM_EXECUTE;
EXT Atom        XA_GWM_RUNNING;

 /* WOOL Atoms of the context */
#ifdef INCLUDE_WL_ATOM_H

EXT WOOL_Atom   WA_borderwidth;
EXT WOOL_Atom   WA_borderpixel;
EXT WOOL_Atom   WA_background;
EXT WOOL_Atom   WA_foreground;
EXT WOOL_Atom   WA_bordertile;
EXT WOOL_Atom   WA_fsm;
EXT WOOL_Atom   WA_menu;
EXT WOOL_Atom   WA_tile;
EXT WOOL_Atom   WA_cursor;
EXT WOOL_Atom   WA_property;
EXT WOOL_Atom   WA_describe_window;
EXT WOOL_Atom   WA_window_description;
EXT WOOL_Atom   WA_icon_description;
EXT WOOL_Atom   WA_describe_screen;
EXT WOOL_Atom   WA_window;
EXT WOOL_Atom   WA_bar;
EXT WOOL_Atom   WA_plug;
EXT WOOL_Atom   WA_root;
EXT WOOL_Atom   WA_icon;
EXT WOOL_Atom   WA_root_window;
EXT WOOL_Atom   WA_grabs;
EXT WOOL_Atom   WA_grab;
EXT WOOL_Atom   WA_ungrab;
EXT WOOL_Atom   WA_opening;
EXT WOOL_Atom   WA_closing;
EXT WOOL_Atom	WA_mapped;
EXT WOOL_Atom	WA_stacking_order;
EXT WOOL_Atom   WA_iconify_window;
EXT WOOL_Atom   WA_font;
EXT WOOL_Atom   WA_horizontal_margin;
EXT WOOL_Atom   WA_vertical_margin;
EXT WOOL_Atom   WA_color;
EXT WOOL_Atom   WA_gray;
EXT WOOL_Atom   WA_mono;
EXT WOOL_Atom   WA_ContextNamespace;
EXT WOOL_Atom   WA_cursorNW;
EXT WOOL_Atom   WA_cursorNE;
EXT WOOL_Atom   WA_cursorN;
EXT WOOL_Atom   WA_cursorSW;
EXT WOOL_Atom   WA_cursorSE;
EXT WOOL_Atom   WA_cursorS;
EXT WOOL_Atom   WA_cursorE;
EXT WOOL_Atom   WA_cursorW;
EXT WOOL_Atom	WA_here;
EXT WOOL_Atom	WA_class_name;
EXT WOOL_Atom	WA_client_name;
EXT WOOL_Atom	WA_icon_name;
EXT WOOL_Atom	WA_starts_iconic;
EXT WOOL_Atom   WA_x;
EXT WOOL_Atom   WA_y;
EXT WOOL_Atom   WA_gravity;
EXT WOOL_Atom   WA_map_on_raise;
EXT WOOL_Atom   WA_ignore_take_focus;

#endif /* INCLUDE_WL_ATOM_H */

#ifdef INCLUDE_WL_LIST_H
EXT WOOL_List   WL_describe_window_call;
EXT WOOL_List   WL_describe_screen_call;
EXT WOOL_List   WL_iconify_window_call;

#endif /* INCLUDE_WL_LIST_H */

#ifdef INCLUDE_WL_STRING_H

EXT WOOL_String DefaultClientClass;
EXT WOOL_String DefaultClientName;
EXT WOOL_String DefaultWindowName;
EXT WOOL_String DefaultMachineName;
EXT WOOL_String DefaultIconName;

#endif /* INCLUDE_WL_STRING_H */
