This is slwind.c in view mode; [Download] [Up]
/* Intrinsic functions */
#include "config.h"
#include <stdio.h>
#include "slang.h"
#include "_slang.h"
#define MAX_WINDOWS 256
static int Resize_Window_Msg = 0;
static int Redraw_Window_Msg = 1;
static int Destroy_Window_Msg = 2;
#define MAX_WINDOW_PROCS 3
typedef struct Window_Type
{
int handle;
int xmin, xmax, ymin, ymax;
float64 wxmin, wxmax, wymin, wymax; /* world coord system */
unsigned long flags;
struct Window_Type *child, *sister;
SLang_Name_Type *win_proc[MAX_WINDOW_PROCS]; /* window procedures */
}
Window_Type;
Window_Type *Windows[MAX_WINDOWS];
void execute_window_proc (Window_Type *w, int msg)
{
SLang_Name_Type *n;
if (SLang_Error) return;
if (NULL == (n = w->win_proc[msg]))
{
/* default procedure */
return;
}
SLexecute_function (n);
}
int SLang_pop_4_integers (int *a, int *b, int *c, int *d)
{
if (SLang_pop_integer (d)
|| SLang_pop_integer (c)
|| SLang_pop_integer (b)
|| SLang_pop_integer (a))
return 1;
return 0;
}
int SLang_pop_4_floats (float64 *a, float64 *b, float64 *c, float64 *d)
{
int p2, p3;
if (SLang_pop_float (d, &p2, &p3)
|| SLang_pop_float (c, &p2, &p3)
|| SLang_pop_float (b, &p2, &p3)
|| SLang_pop_float (a, &p2, &p3))
return 1;
return 0;
}
Window_Type *validate_window_handle(int handle)
{
char err[] = "Window handle invalid.";
Window_Type *w;
if ((handle < 0) || (handle >= MAX_WINDOWS)
|| (NULL == (w = Windows[handle])))
{
SLang_doerror (err);
return NULL;
}
return w;
}
/* define a window and returns a handle to the window. Points are clipped
* within the window
*/
int create_window (void)
{
int xmin, xmax, ymin, ymax;
Window_Type *w;
int i;
if (SLang_pop_4_integers(&xmin, &ymin, &xmax, &ymax)) return -1;
for (i = 0; i < MAX_WINDOWS; i++)
{
if (Windows[i] == NULL) break;
}
if (i == MAX_WINDOWS) return -1;
if (NULL == (w = (Window_Type *) SLMALLOC (sizeof(Window_Type))))
{
SLang_Error = SL_MALLOC_ERROR;
return -1;
}
Windows[i] = w;
/* zero the structure */
SLMEMSET (w, 0, sizeof (Window_Type));
w->handle = i;
w->ymin = ymin;
w->ymax = ymax;
if (xmax < xmin)
{
w->xmax = xmin;
w->xmin = xmax;
}
else
{
w->xmin = xmin;
w->xmax = xmax;
}
if (ymax < ymin)
{
w->ymax = ymin;
w->ymin = ymax;
}
else
{
w->ymax = ymin;
w->ymin = ymax;
}
w->wxmin = (float64) w->xmin;
w->wymin = (float64) w->ymin;
w->wxmax = (float64) w->xmax;
w->wymax = (float64) w->ymax;
return w->handle;
}
/* destroy window associated with handle */
void delete_window (void)
{
int handle;
Window_Type *w;
if (SLang_pop_integer (&handle)) return;
if (NULL == (w = validate_window_handle(handle))) return;
/* need to delete child windows */
execute_window_proc (w, Destroy_Window_Msg);
/* send message to all windows this one obscures to update their contents */
Windows[handle] = NULL;
SLFREE (w);
return;
}
/* associates a world coordinate system with the window */
void define_world (void)
{
int handle;
float64 xmin, xmax, ymin, ymax;
Window_Type *w;
if (SLang_pop_integer (&handle) ||
SLang_pop_4_floats (&xmin, &ymin, &xmax, &ymax)) return;
if (NULL == (w = validate_window_handle(handle))) return;
w->wxmin = xmin;
w->wxmax = xmax;
w->wymin = ymin;
w->wymax = ymax;
}
void define_window_procedure (int *handle, int *msg, char *proc)
{
SLang_Name_Type *n;
Window_Type *w;
if ((*msg < 0) || (*msg >= MAX_WINDOW_PROCS))
{
SLang_doerror ("Invalid window message.");
return;
}
if (NULL == (n = SLang_get_function (proc)))
{
SLang_doerror ("Undefined function.");
return;
}
if (NULL == (w = validate_window_handle(*handle))) return;
w->win_proc[*msg] = n;
}
void show_window (int *handle)
{
Window_Type *w;
if (NULL == (w = validate_window_handle(*handle))) return;
execute_window_proc (w, Resize_Window_Msg);
execute_window_proc (w, Redraw_Window_Msg);
}
static SLang_Name_Type slwindow_table[] =
{
MAKE_INTRINSIC(".create_window", create_window, INT_TYPE, 0),
MAKE_INTRINSIC(".delete_window", delete_window, VOID_TYPE, 0),
MAKE_INTRINSIC(".define_world", define_world, VOID_TYPE, 0),
MAKE_INTRINSIC(".show_window", show_window, VOID_TYPE, 1),
MAKE_INTRINSIC(".define_window_procedure", define_window_procedure, VOID_TYPE, 3),
MAKE_VARIABLE(".RESIZE_WINDOW_MSG", &Resize_Window_Msg, INT_TYPE, 1),
MAKE_VARIABLE(".REDRAW_WINDOW_MSG", &Redraw_Window_Msg, INT_TYPE, 1),
MAKE_VARIABLE(".DESTROY_WINDOW_MSG", &Destroy_Window_Msg, INT_TYPE, 1),
SLANG_END_TABLE
};
int init_SLwindows ()
{
return SLang_add_table(slwindow_table, "_Windows");
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.