/*
 * Copyright 1989 Massachusetts Institute of Technology
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of M.I.T. not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission.  M.I.T. makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 *
 * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/***********************************************************************
 *
 * $XConsortium: screen.h,v 1.62 91/05/01 17:33:09 keith Exp $
 *
 * twm per-screen data include file
 *
 * 11-3-88 Dave Payne, Apple Computer			File created
 *
 ***********************************************************************/

#ifndef _SCREEN_
#define _SCREEN_

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/cursorfont.h>
#include "list.h"
#include "menus.h"
#include "iconmgr.h"
#include "doors.h"

typedef struct _StdCmap {
    struct _StdCmap *next;		/* next link in chain */
    Atom atom;				/* property from which this came */
    int nmaps;				/* number of maps below */
    XStandardColormap *maps;		/* the actual maps */
} StdCmap;

#define SIZE_HINDENT 10
#define SIZE_VINDENT 2

typedef struct _TitlebarPixmaps {
    Pixmap xlogo;
    Pixmap resize;
    Pixmap question;
    Pixmap menu;
    Pixmap delete;
} TitlebarPixmaps;

typedef struct ScreenInfo
{
    int screen;			/* the default screen */
    int d_depth;		/* copy of DefaultDepth(dpy, screen) */
    Visual *d_visual;		/* copy of DefaultVisual(dpy, screen) */
    int Monochrome;		/* is the display monochrome ? */
    int MyDisplayWidth;		/* my copy of DisplayWidth(dpy, screen) */
    int MyDisplayHeight;	/* my copy of DisplayHeight(dpy, screen) */
    int MaxWindowWidth;		/* largest window to allow */
    int MaxWindowHeight;	/* ditto */

    int VirtualDesktopWidth;	/* width of virtual desktop */
    int VirtualDesktopHeight;	/* height of virtual desktop */
    int VirtualDesktopX;	/* top left x of my screen on the desktop */
    int VirtualDesktopY;	/* top left y of my screen on the desktop */
    int VirtualDesktopPanDistanceX; /* distance to pan screen */
    int VirtualDesktopPanDistanceY; /* distance to pan screen */
    int VirtualDesktopDisplayBorderWidth;

    /* these are for the little vd display */
    int VirtualDesktopDScale;	/* scale of the virtual desktop display */
    int VirtualDesktopDX;	/* position of the vd display */
    int VirtualDesktopDY;	/* position of the vd display */

    /* the autopan stuff */
    int AutoPan;		/* how wide should the autopan windows be */
    Window VirtualDesktopAutoPan[4]; /* the autopan windows */
    				/* 0 = left, 1 = right, 2 = top, 3 = bottom */

    TwmWindow TwmRoot;		/* the head of the twm window list */

    Window Root;		/* the root window */
    Window SizeWindow;		/* the resize dimensions window */
    Window InfoWindow;		/* the information window */
    Window VirtualDesktopDisplayOuter; /* wrapper for display of the virtual desktop */
    Window VirtualDesktopDisplay; /* display of the virtual desktop */
    Window VirtualDesktopDScreen; /* display of the real screen on the vd */
    TwmWindow *VirtualDesktopDisplayTwin; /* twm window for the above */

    name_list *Icons;		/* list of icon pixmaps */
    TitlebarPixmaps tbpm;	/* titlebar pixmaps */
    Pixmap UnknownPm;		/* the unknown icon pixmap */
#ifdef XPM
    XpmIcon *UnknownXpmIcon;
#endif
    Pixmap siconifyPm;		/* the icon manager iconify pixmap */
    Pixmap pullPm;		/* pull right menu icon */
    int	pullW, pullH;		/* size of pull right menu icon */
    Pixmap hilitePm;		/* focus highlight window background */
    int hilite_pm_depth;	/* depth of hilight image */
    int hilite_pm_width, hilite_pm_height;  /* cache the size */
    Pixmap virtualPm;		/* panner background pixmap RFB PIXMAP*/
    int virtual_pm_width, virtual_pm_height;/*RFB PIXMAP*/
    Pixmap RealScreenPm;		/* panner background pixmap RFB PIXMAP*/
    int RealScreen_pm_width, RealScreen_pm_height;/*RFB PIXMAP*/

    MenuRoot *MenuList;		/* head of the menu list */
    MenuRoot *LastMenu;		/* the last menu (mostly unused?) */
    MenuRoot *Windows;		/* the TwmWindows menu */

    TwmWindow *Ring;		/* one of the windows in window ring */
    TwmWindow *RingLeader;	/* current winodw in ring */

    MouseButton Mouse[MAX_BUTTONS+1][NUM_CONTEXTS][MOD_SIZE];
    MouseButton DefaultFunction;
    MouseButton WindowFunction;

    struct {
      Colormaps *cmaps; 	/* current list of colormap windows */
      int maxCmaps;		/* maximum number of installed colormaps */
      unsigned long first_req;	/* seq # for first XInstallColormap() req in
				   pass thru loading a colortable list */
      int root_pushes;		/* current push level to install root
				   colormap windows */
      TwmWindow *pushed_window;	/* saved window to install when pushes drops
				   to zero */
    } cmapInfo;

    struct {
	StdCmap *head, *tail;		/* list of maps */
	StdCmap *mru;			/* most recently used in list */
	int mruindex;			/* index of mru in entry */
    } StdCmapInfo;

    struct {
	int nleft, nright;		/* numbers of buttons in list */
	TitleButton *head;		/* start of list */
	int border;			/* button border */
	int pad;			/* button-padding */
	int width;			/* width of single button & border */
	int leftx;			/* start of left buttons */
	int titlex;			/* start of title string */
	int rightoff;			/* offset back from right edge */
	int titlew;		        /* with of title part */
    } TBInfo;
    ColorPair BorderTileC;	/* border tile colors */
    ColorPair TitleC;		/* titlebar colors */
    ColorPair MenuC;		/* menu colors */
    ColorPair MenuTitleC;	/* menu title colors */
    ColorPair IconC;		/* icon colors */
    ColorPair IconManagerC;	/* icon manager colors */
    ColorPair DefaultC;		/* default colors */
    ColorPair VirtualDesktopDisplayC; /* desktop display color */
    ColorPair DoorC;		/* default door colors */
    ColorPair VirtualC;     /* default virtual colors *//*RFB VCOLOR*/
    ColorPair RealScreenC;	/* "real screen" in panner RFB 4/92 */
    Pixel VirtualDesktopDisplayBorder; /* desktop display default border */
    Pixel BorderColor;		/* color of window borders */
    Pixel MenuShadowColor;	/* menu shadow color */
    Pixel IconBorderColor;	/* icon border color */
    Pixel IconManagerHighlight;	/* icon manager highlight */
    short ClearShadowContrast;  /* The contrast of the clear shadow */
    short DarkShadowContrast;   /* The contrast of the dark shadow */

    Cursor TitleCursor;		/* title bar cursor */
    Cursor FrameCursor;		/* frame cursor */
    Cursor IconCursor;		/* icon cursor */
    Cursor IconMgrCursor;	/* icon manager cursor */
    Cursor ButtonCursor;	/* title bar button cursor */
    Cursor MoveCursor;		/* move cursor */
    Cursor ResizeCursor;	/* resize cursor */
    Cursor WaitCursor;		/* wait a while cursor */
    Cursor MenuCursor;		/* menu cursor */
    Cursor SelectCursor;	/* dot cursor for f.move, etc. from menus */
    Cursor DestroyCursor;	/* skull and cross bones, f.destroy */
    Cursor DoorCursor;/*RFBCURSOR*/
    Cursor VirtualCursor;/*RFBCURSOR*/
    Cursor DesktopCursor;/*RFBCURSOR*/
    Cursor NoCursor;		/* a black cursor - used on desktop display */

    short use3Dmenus;
    short use3Dtitles;
    short use3Diconmanagers;
    short SunkFocusWindowTitle;
    short BeNiceToColormap;
    short CenteredInfoBox;

    name_list *BorderColorL;
    name_list *IconBorderColorL;
    name_list *BorderTileForegroundL;
    name_list *BorderTileBackgroundL;
    name_list *TitleForegroundL;
    name_list *TitleBackgroundL;
    name_list *IconForegroundL;
    name_list *IconBackgroundL;
    name_list *IconManagerFL;
    name_list *IconManagerBL;
    name_list *IconMgrs;
    name_list *NoIconTitle;	/* list of windows without icon titles */
    name_list *NoTitle;		/* list of window names with no title bar */
    name_list *MakeTitle;	/* list of window names with title bar */
    name_list *AutoRaise;	/* list of window names to auto-raise */
    name_list *IconNames;	/* list of window names and icon names */
    name_list *NoHighlight;	/* list of windows to not highlight */
    name_list *NoStackModeL;	/* windows to ignore stack mode requests */
    name_list *NoTitleHighlight;/* list of windows to not highlight the TB*/
    name_list *DontIconify;	/* don't iconify by unmapping */
    name_list *IconMgrNoShow;	/* don't show in the icon manager */
    name_list *IconMgrShow;	/* show in the icon manager */
    name_list *IconifyByUn;	/* windows to iconify by unmapping */
    name_list *StartIconified;	/* windows to start iconic */
    name_list *IconManagerHighlightL;	/* icon manager highlight colors */
    name_list *SqueezeTitleL;		/* windows of which to squeeze title */
    name_list *DontSqueezeTitleL;	/* windows of which not to squeeze */
    name_list *WindowRingL;	/* windows in ring */
    name_list *WarpCursorL;	/* windows to warp cursor to on deiconify */
    name_list *NailedDown;      /* windows that are nailed down */
    name_list *VirtualDesktopColorFL;  /* color of representations on the vd display */
    name_list *VirtualDesktopColorBL;  /* color of representations on the vd display */
    name_list *VirtualDesktopColorBoL; /* color of representations on the vd display */
    name_list *DontShowInDisplay;      /* don't show these in the desktop display */
    name_list *DoorForegroundL; /* doors foreground */
    name_list *DoorBackgroundL; /* doors background */
    
    /* Opacity(?) can be on a per window basis -njw. Courtesy of ctwm */
    name_list* OpaqueMoveList;
    name_list* NoOpaqueMoveList;
    name_list* OpaqueResizeList;
    name_list* NoOpaqueResizeList;

    GC NormalGC;		/* normal GC for everything */
    GC MenuGC;			/* gc for menus */
    GC DrawGC;			/* GC to draw lines for move and resize */
    GC GreyGC;			/* for shadowing on monochrome displays */
    GC ShadGC;			/* for shadowing on with patterns */

    unsigned long Black;
    unsigned long White;
    unsigned long XORvalue;	/* number to use when drawing xor'ed */
    MyFont DefaultFont;		/* default for all other fonts */
    MyFont TitleBarFont;	/* title bar font structure */
    MyFont MenuFont;		/* menu font structure */
    MyFont IconFont;		/* icon font structure */
    MyFont SizeFont;		/* resize font structure */
    MyFont IconManagerFont;	/* window list font structure */
    MyFont VirtualFont;		/* virtual display windows */
    MyFont DoorFont;		/* for drawing in doors */
    MyFont InfoFont;		/* for the identify/version window */
    IconMgr *iconmgr;		/* default icon manager  */
    struct IconRegion *FirstRegion;	/* pointer to icon regions */
    struct IconRegion *LastRegion;	/* pointer to the last icon region */
    char *IconDirectory;	/* icon directory to search */
    char* PixmapDirectory;	/* pixmap directory to search */
    int SizeStringOffset;	/* x offset in size window for drawing */
    int SizeStringWidth;	/* minimum width of size window */
    int BorderWidth;		/* border width of twm windows */
    int IconBorderWidth;	/* border width of icon windows */
    int UnknownWidth;		/* width of the unknown icon */
    int UnknownHeight;		/* height of the unknown icon */
    int TitleHeight;		/* height of the title bar window */
    TwmWindow *Focus;		/* the twm window that has focus */
    int EntryHeight;		/* menu entry height */
    int FramePadding;		/* distance between decorations and border */
    int TitlePadding;		/* distance between items in titlebar */
    int ButtonIndent;		/* amount to shrink buttons on each side */
    int NumAutoRaises;		/* number of autoraise windows on screen */
    short TransientOnTop;	/* percentage of the surface of it's leader */
    short NoDefaults;		/* do not add in default UI stuff */
    short UsePPosition;		/* what do with PPosition, see values below */
    short AutoRelativeResize;	/* start resize relative to position in quad */
    short FocusRoot;		/* is the input focus on the root ? */
    short WarpCursor;		/* warp cursor on de-iconify ? */
    short ForceIcon;		/* force the icon to the user specified */
    short NoGrabServer;		/* don't do server grabs */
    short NoRaiseDesktop;	/* don't raise the desktop at start of move */
    short NoRaiseMove;		/* don't raise window following move */
    short NoRaiseResize;	/* don't raise window following resize */
    short NoRaiseDeicon;	/* don't raise window on deiconify */
    short NoRaiseWarp;		/* don't raise window on warp */
    short DontMoveOff;		/* don't allow windows to be moved off */
    short DoZoom;		/* zoom in and out of icons */
    short TitleFocus;		/* focus on window in title bar ? */
    short NoIconTitlebar;	/* put title bars on icons */
    short NoTitlebar;		/* put title bars on windows */
    short DecorateTransients;	/* put title bars on transients */
    short IconifyByUnmapping;	/* simply unmap windows when iconifying */
    short ShowIconManager;	/* display the window list */
    short IconManagerDontShow;	/* show nothing in the icon manager */
    short BackingStore;		/* use backing store for menus */
    short SaveUnder;		/* use save under's for menus */
    short RandomPlacement;	/* randomly place windows that no give hints */
    short OpaqueMove;		/* move the window rather than outline */
    short DoOpaqueMove;		/* move the window rather than outline */
    short OpaqueMoveThreshold;		/*  */
    short DoOpaqueResize;		/* resize the window rather than outline */
    short OpaqueResize;		/* resize the window rather than outline */
    short OpaqueResizeThreshold; /*  */
    short Highlight;		/* should we highlight the window borders */
    short StackMode;		/* should we honor stack mode requests */
    short TitleHighlight;	/* should we highlight the titlebar */
    short MoveDelta;		/* number of pixels before f.move starts */
    short ZoomCount;		/* zoom outline count */
    short SortIconMgr;		/* sort entries in the icon manager */
    short Shadow;		/* show the menu shadow */
    short InterpolateMenuColors;/* make pretty menus */
    short NoIconManagers;	/* Don't create any icon managers */
    short ClientBorderWidth;	/* respect client window border width */
    short SqueezeTitle;		/* make title as small as possible */
    short HaveFonts;		/* set if fonts have been loaded */
    short FirstTime;		/* first time we've read .twmrc */
    short CaseSensitive;	/* be case-sensitive when sorting names */
    short WarpUnmapped;		/* allow warping to unmapped windows */
    short DeIconifyToScreen;	/* if deiconified, should this goto the screen ? */
    short WarpWindows;		/* should windows or the screen be warped ? */
    short SnapRealScreen;       /* should the real screen snap to a pandistance grid ? */
    short GeometriesAreVirtual; /* should geometries be interpreted as virtual or real ? */
    short Virtual;		/* are we virtual ? (like, hey man....) */
    short HighlightDesktopFocus; /* do we muck about with the borders in the desktop */
    short NamesInVirtualDesktop;/* show names in virtual desktop display ? */
    short AutoRaiseDefault;   /* AutoRaise all windows if true *//*RAISEDELAY*/

    FuncKey FuncKeyRoot;

    TwmDoor *Doors;		/* a list of doors on this screen */
} ScreenInfo;

extern int MultiScreen;
extern int NumScreens;
extern ScreenInfo **ScreenList;
extern ScreenInfo *Scr;
extern int FirstScreen;
extern Window windowmask;

#define PPOS_OFF 0
#define PPOS_ON 1
#define PPOS_NON_ZERO 2
/* may eventually want an option for having the PPosition be the initial
   location for the drag lines */

#endif /* _SCREEN_ */
