348 lines
13 KiB
C
348 lines
13 KiB
C
/*
|
|
* windows.h --
|
|
*
|
|
* Interface definitions for Magic's window manager. This
|
|
* package manages a set of overlapping windows.
|
|
*
|
|
* *********************************************************************
|
|
* * Copyright (C) 1985, 1990 Regents of the University of California. *
|
|
* * 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. The University of California *
|
|
* * makes no representations about the suitability of this *
|
|
* * software for any purpose. It is provided "as is" without *
|
|
* * express or implied warranty. Export of this software outside *
|
|
* * of the United States of America may require an export license. *
|
|
* *********************************************************************
|
|
*
|
|
* rcsid $Header$
|
|
*
|
|
*/
|
|
|
|
#ifndef _MAGIC__WINDOWS__WINDOWS_H
|
|
#define _MAGIC__WINDOWS__WINDOWS_H
|
|
|
|
#include "utils/magic.h"
|
|
#include "utils/geometry.h"
|
|
|
|
/* SUBPIXELBITS represents a fixed-point shift for representing the */
|
|
/* scale factor between the screen and the layout. It is only */
|
|
/* necessary that the screen resolution * SUBPIXEL does not overflow */
|
|
/* type (int). The original value of 12 has become too small for */
|
|
/* large chips on nanometer grids, so it has been upped to 16. */
|
|
|
|
#define SUBPIXELBITS 16
|
|
#define SUBPIXEL (1 << SUBPIXELBITS)
|
|
#define HSUBPIXEL (1 << (SUBPIXELBITS - 1))
|
|
|
|
typedef ClientData WindClient; /* A unique ID of a client of the
|
|
* window package. The value 'NULL' is
|
|
* indicates an invalid value.
|
|
*/
|
|
|
|
/*
|
|
* The following structure describes a window. Windows are overlapping
|
|
* rectangles. Each window contains a 'surface', whose contents are maintained
|
|
* by a client of the window package. The client is responsible for redrawing
|
|
* the surface when requested. The window package maintains the transform
|
|
* from surface coordinates to screen coordinates and also controls which
|
|
* portion of the surface is currently visable in the window. See the
|
|
* comments in windMain.c and above the proc 'WindAddClient' for more info.
|
|
*
|
|
* To see an example of a simple window client, look at the colormap window
|
|
* located in 'cmwind/CMWmain.c'. A more complex window is the layout window,
|
|
* located in 'dbwind/DBWprocs.c'.
|
|
*
|
|
* The following key letters in parens after a field indicate who should
|
|
* read & write it:
|
|
*
|
|
* P - Private (window package use only).
|
|
* R - Read-only (clients should not modify this, but may read it).
|
|
* W - Writable by client at any time.
|
|
* C - Writable by the client only during window creation time (in the
|
|
* create proc passed to WindAddClient) and readable at all times.
|
|
* L - Writable by the client at creation time and when the window is
|
|
* loaded with a new surface.
|
|
* G - Private to the graphics module.
|
|
*
|
|
* The comments below often mention a procedure that sets a given field. This
|
|
* is the normal procedure used to set the field, but there may be other seldom
|
|
* used procs in the window package that set the field.
|
|
*/
|
|
typedef struct WIND_S1 {
|
|
struct WIND_S1 *w_nextWindow; /* A doubly-linked list (P) */
|
|
struct WIND_S1 *w_prevWindow; /* A doubly-linked list (P) */
|
|
ClientData w_clientData; /* Used by the client an any manner (W) */
|
|
WindClient w_client; /* The client of this window (R) */
|
|
char *w_caption; /* The caption at the top of the window. (R)
|
|
* Set via WindCaption().
|
|
*/
|
|
ClientData w_surfaceID; /* A unique ID for this surface, other than
|
|
* NULL. (R)
|
|
* Set via WindLoad().
|
|
*/
|
|
Rect w_allArea; /* The entire area of the window in the screen
|
|
* coordinates for the window, including the
|
|
* border and obscured areas. (R)
|
|
*
|
|
* If we are using Magic's window package,
|
|
* then this field is equal to w_frameArea
|
|
* since all windows share the same coordinate
|
|
* system. In SunWindows, the lower-left
|
|
* corner of this area is at (0, 0) because
|
|
* each Sun window has it's own coordinate
|
|
* system with the origin in the lower left
|
|
* corner.
|
|
*
|
|
* This field is recomputed by WindReframe().
|
|
*/
|
|
Rect w_frameArea; /* The location of the window on the screen (C)
|
|
* If a window's create proc modifies this, it
|
|
* needs to set w_allArea and w_screenArea by
|
|
* calling WindSetWindowAreas().
|
|
*
|
|
* Also, see comments for w_allArea.
|
|
*
|
|
* This field is initialized to a reasonable
|
|
* value at window creation time, but the
|
|
* 'reposition' proc passed to WindAddClient
|
|
* has a way of overriding it.
|
|
*/
|
|
Rect w_screenArea; /* The area of the window in the screen
|
|
* coordinates of the window -- not including
|
|
* the border but including obscured areas. (R)
|
|
*
|
|
* This field is recomputed by WindReframe().
|
|
*/
|
|
Rect w_surfaceArea; /* An area in surface coordinates that
|
|
* is large enough to contain everything
|
|
* displayed in w_screenArea plus at least
|
|
* one pixel of border on all sides. (R)
|
|
* This field, and w_origin and w_scale below,
|
|
* are modified by procedures that move and
|
|
* scroll windows, e.g. WindMove and WindScroll.
|
|
*/
|
|
Point w_origin; /* This screen point, in 1/SUBPIXEL pixels,
|
|
* corresponds to w_surfaceArea.r_ll.
|
|
* Used to transform between surface and screen
|
|
* coordinates. (R)
|
|
*/
|
|
int w_scale; /* Defines how many 1/SUBPIXEL of a pixel
|
|
* correspond to 1 world unit. Used to
|
|
* transform between surface and screen
|
|
* coordinates. (R)
|
|
*/
|
|
LinkedRect *w_clipAgainst; /* A linked list of areas which obscure
|
|
* portions of this window. (R)
|
|
* Normally clients just pass this down to the
|
|
* graphics package.
|
|
* Changed via WindOver(), WindUnder(), and
|
|
* WindFullScreen().
|
|
*/
|
|
Point w_stippleOrigin; /* A point that serves as the origin (in screen
|
|
* coordinates) of stipple patterns within
|
|
* this window. (R)
|
|
* This field is maintained for the benifit of
|
|
* device drivers, but is often unused.
|
|
*/
|
|
int w_flags; /* A collection of flag bits:
|
|
*
|
|
* WIND_SCROLLABLE (C)
|
|
* WIND_SCROLLBARS (C)
|
|
* WIND_CAPTION (C)
|
|
* WIND_BORDER (C)
|
|
* WIND_COMMANDS (C)
|
|
* WIND_FULLSCREEN (P)
|
|
* WIND_OFFSCREEN (P)
|
|
* WIND_ISICONIC (P)
|
|
* WIND_REDRAWICON (P)
|
|
* WIND_OBSCURED (G)
|
|
*
|
|
* Note: It is an error for a client to set
|
|
* WIND_SCROLLBARS but not WIND_SCROLLABLE.
|
|
* If WIND_SCROLLABLE is set, then the client
|
|
* must fill in the pointer w_bbox;
|
|
*/
|
|
Rect w_oldArea; /* If the window has been blown up to full-
|
|
* screen size, this records its old area so
|
|
* it can be shrunk back later. (P)
|
|
*/
|
|
int w_oldDepth; /* If the window is full-screen, this records
|
|
* its old depth on the list of windows, so
|
|
* it can be put back where it came from. (P)
|
|
*/
|
|
Rect *w_bbox; /* A pointer to the bounding box of the stuff
|
|
* in this window. Used for WindView() and for
|
|
* scroll bars. (L)
|
|
* This MUST be set if WIND_SCROLLABLE is set.
|
|
*/
|
|
int w_wid; /* The window ID for this window. Windows are
|
|
* assigned small non-negative integers for
|
|
* easy reference. (R)
|
|
* Set at window creation time.
|
|
*/
|
|
ClientData w_grdata; /* Data private to the graphics package. (G)
|
|
* Generally references an X11 or Tk window.
|
|
*/
|
|
ClientData w_grdata2; /* Data private to the graphics packsge. (G)
|
|
* Used to contain per-window information
|
|
* other than the window itself, since
|
|
* various parts of the code have w_grdata
|
|
* hard-coded to the window pointer.
|
|
*/
|
|
ClientData w_backingStore; /* Specific data private to the graphics
|
|
* package. Used to save and restore the
|
|
* image under the cursor for fast redraw.
|
|
*/
|
|
char *w_iconname; /* Short name for the icon. */
|
|
ClientData w_redrawAreas; /* List of areas that need to be redrawn. (P)
|
|
* Set by WindAreaChanged(), cleared by
|
|
* WindUpdate(). Initialized by
|
|
* WindSeparateRedisplay().
|
|
*/
|
|
} MagWindow;
|
|
|
|
|
|
/* Window flags, for w->w_flags */
|
|
#define WIND_FULLSCREEN 0x001 /* Set if the window has been blown up to
|
|
* full-screen size.
|
|
*/
|
|
#define WIND_OFFSCREEN 0x002 /* Set if the window is to be rendered off-
|
|
* screen (i.e., onto a pixmap)
|
|
*/
|
|
#define WIND_COMMANDS 0x004 /* Set if the window accepts the standard
|
|
* set of window commands
|
|
*/
|
|
#define WIND_SCROLLABLE 0x008 /* Set if the window can scroll & zoom. */
|
|
#define WIND_SCROLLBARS 0x010 /* Set if the window has scroll bars. */
|
|
#define WIND_CAPTION 0x020 /* Set if the window displays its own caption. */
|
|
#define WIND_BORDER 0x040 /* Set if the window should display a border
|
|
* (includes scrollbars and caption area)
|
|
*/
|
|
#define WIND_ISICONIC 0x080 /* Set if the window is closed down to an
|
|
* icon (on Suns only)
|
|
*/
|
|
#define WIND_REDRAWICON 0x100 /* The icon needs to be redrawn. */
|
|
#define WIND_OBSCURED 0x200 /* The window is partially or fully obscured */
|
|
|
|
|
|
/* Special values for Window IDs. Some procedures that expect a Window ID will
|
|
* also accept one of these flags instead.
|
|
*/
|
|
#define WIND_UNKNOWN_WINDOW -2 /* We should pick one by looking at
|
|
* the location of the point.
|
|
*/
|
|
#define WIND_NO_WINDOW -3 /* Use NULL for the window */
|
|
|
|
/* utility procs & special stuff */
|
|
extern MagWindow *WindCreate();
|
|
extern WindClient WindGetClient();
|
|
extern WindClient WindNextClient();
|
|
extern WindClient WindAddClient();
|
|
extern char *WindGetClientName();
|
|
extern void WindInit();
|
|
extern void WindUpdate();
|
|
extern void WindDrawBorder();
|
|
extern void WindOutToIn();
|
|
extern void WindInToOut();
|
|
extern void WindSetWindowAreas();
|
|
extern void windFixSurfaceArea();
|
|
extern int WindExecute();
|
|
extern void WindAddCommand();
|
|
extern int WindReplaceCommand();
|
|
extern const char * const *WindGetCommandTable();
|
|
extern int windCheckOnlyWindow(MagWindow **, WindClient);
|
|
|
|
|
|
/* searching procs */
|
|
extern int WindSearch();
|
|
extern MagWindow *WindSearchWid();
|
|
extern MagWindow *WindSearchData();
|
|
|
|
|
|
/* procs for moving the surface inside of a window (changing the view) */
|
|
extern void WindZoom();
|
|
extern void WindMove();
|
|
extern void WindView();
|
|
extern void WindScroll();
|
|
|
|
|
|
/* procs for moving the window itself */
|
|
extern void WindOver();
|
|
extern void WindUnder();
|
|
extern void WindReframe();
|
|
extern void WindFullScreen();
|
|
|
|
|
|
/* procs to transform into and out of screen coordinates */
|
|
|
|
extern void WindScreenToSurface();
|
|
extern void WindSurfaceToScreen();
|
|
extern void WindPointToSurface();
|
|
extern void WindPointToScreen();
|
|
extern void WindSurfaceToScreenNoClip();
|
|
|
|
/* procs to change things or inform the window manager about changes */
|
|
extern void WindCaption();
|
|
extern void WindAreaChanged();
|
|
extern void WindIconChanged();
|
|
extern bool WindLoad();
|
|
extern void WindSeparateRedisplay();
|
|
|
|
/* handler for window buttons in the scrollbar/zoom (non-wrapper) frame */
|
|
extern bool WindButtonInFrame();
|
|
|
|
/* C99 compat */
|
|
extern bool WindDelete();
|
|
extern void WindScale();
|
|
extern void WindTranslate();
|
|
extern void WindUnload();
|
|
extern void WindRedisplay();
|
|
extern void windUnlink();
|
|
extern void windReClip();
|
|
extern void windFree();
|
|
extern int WindSendCommand();
|
|
|
|
/* interface variables */
|
|
extern int WindDefaultFlags; /* Mask of properties applied to new windows */
|
|
extern int WindNewButtons; /* A mask of the buttons that are down now. */
|
|
extern int WindOldButtons; /* The buttons that were down on the previous
|
|
* command.
|
|
*/
|
|
extern Point WindCommandPoint; /* The point for the current command. */
|
|
extern bool WindAnotherUpdatePlease; /* Set by a client during redisplay if it
|
|
* discovers that more stuff needs to be
|
|
* displayed, and wants the window package
|
|
* to do another WindUpdate(). Used by
|
|
* dbwind in dbwhlRedrawFunc() when it suddenly
|
|
* discovers that drawing feedback areas
|
|
* requires that all the mask geometry be
|
|
* redrawn.
|
|
*/
|
|
|
|
/* Macro to set the maximum number of windows */
|
|
#define WIND_MAX_WINDOWS(x) (windMaxWindows = MIN(windMaxWindows, (x)))
|
|
extern int windMaxWindows; /* Use above macro, never increase this! */
|
|
|
|
/* The type of windows that we will implement. This variable must be set by
|
|
* the graphics package before WindInit() is called.
|
|
*/
|
|
extern int WindPackageType;
|
|
#define WIND_MAGIC_WINDOWS 0
|
|
#define WIND_X_WINDOWS 1
|
|
|
|
/* Scroll bar width.
|
|
* May be set by the graphics package before WindInit() is called.
|
|
* If the width is XX, the window package tries to load glyphs from
|
|
* the file 'windowsXX.glyphs' located in $CAD_ROOT/magic/sys. This file
|
|
* contains the arrow for the scroll bars, and those icons should be of
|
|
* this width.
|
|
*/
|
|
extern int WindScrollBarWidth;
|
|
|
|
/* Global identifier for the window client structure */
|
|
extern WindClient windClientID;
|
|
|
|
#endif /* _MAGIC__WINDOWS__WINDOWS_H */
|