This is window.c in view mode; [Download] [Up]
/*
* Copyright (c) 1992, 1995 John E. Davis (davis@space.mit.edu)
* All Rights Reserved.
*/
#include <config.h>
#include <stdio.h>
#include <string.h>
#include "buffer.h"
#include "window.h"
#include "screen.h"
#include "misc.h"
#include "ledit.h"
#include "sysdep.h"
#include "display.h"
#include "paste.h"
Window_Type *JWindow;
extern Window_Type *The_MiniWindow;
int Top_Window_Row = 2;
Window_Type *create_window(int top, int rows, int col, int width)
{
Window_Type *w;
if (NULL == (w = (Window_Type *) SLMALLOC(sizeof(Window_Type))))
{
exit_error("create_window: malloc error.", 0);
}
MEMSET ((char *) w, 0, sizeof (Window_Type));
if (top < 1) top = 1;
w->top = top;
if (rows < 1) rows = 1;
w->rows = rows;
if (width < 1) width = 1;
w->width = width;
w->column = col;
return(w);
}
void window_buffer(Buffer *b)
{
if (JWindow == NULL)
{
JWindow = create_window(Top_Window_Row,
*tt_Screen_Rows - 2 - (Top_Window_Row - 1),
1, *tt_Screen_Cols);
JWindow->next = JWindow;
}
touch_window();
JWindow->beg.line = JWindow->mark.line = b->line;
JWindow->beg.point = JWindow->mark.point = b->point;
JWindow->beg.n = JWindow->mark.n = b->linenum + b->nup;
JWindow->buffer = b;
JWindow->trashed = 1;
}
#ifdef HAS_SUBPROCESSES
void move_window_marks (int all)
{
Window_Type *w = JWindow;
if (w == NULL) return;
do
{
if (w->buffer == CBuf)
{
w->mark.point = Point;
w->mark.line = CLine;
w->mark.n = LineNum + CBuf->nup;
if (all == 0) break;
}
w = w->next;
}
while (w != JWindow);
}
#endif
int other_window()
{
switch_to_buffer(JWindow->buffer);
/* CBuf->line = CLine;
CBuf->point = Point; */
JWindow->mark.point = Point;
JWindow->mark.line = CLine;
JWindow->mark.n = LineNum + CBuf->nup;
/* JWindow->buffer = CBuf; */
JWindow = JWindow->next;
switch_to_buffer(JWindow->buffer);
/* CBuf = JWindow->buffer; */
Point = JWindow->mark.point;
CLine = JWindow->mark.line;
LineNum = JWindow->mark.n - CBuf->nup;
return(1);
}
static int find_screen_line(void)
{
int i;
for (i = 0; i < *tt_Screen_Rows - 2; i++)
{
if (JScreen[i].line == CLine) return(i + 1);
}
return(0);
}
int split_window()
{
int n, top, width, row;
Window_Type *w, *neew;
Line *l;
if (JWindow->rows < 5)
{
msg_error("Window too small.");
return(0);
}
switch_to_buffer(JWindow->buffer);
n = JWindow->rows / 2;
top = JWindow->top + n + 1;
width = JWindow->width;
n = JWindow->rows - n - 1;
JWindow->rows = JWindow->rows / 2;
if (NULL == (JWindow->beg.line = find_top()))
JWindow->beg.line = CLine;
w = JWindow->next;
JWindow->next = neew = create_window(top, n, JWindow->column, width);
neew->next = w;
neew->buffer = CBuf;
neew->mark.point = Point;
neew->mark.line = CLine;
neew->mark.n = LineNum + CBuf->nup;
other_window();
touch_window();
l = JWindow->beg.line = find_top();
n = 0;
while (l != CLine)
{
l = l->next;
n++;
}
JWindow->beg.n = LineNum + CBuf->nup - n;
/* Try to leave Point on same line of display if possible */
if ((row = find_screen_line()) > 0)
{
w = JWindow;
do
{
if ((JWindow->buffer == CBuf) && (JWindow->top <= row)
&& (JWindow->top + JWindow->rows > row)) break;
other_window();
}
while (w != JWindow);
}
return(1);
}
int one_window()
{
Window_Type *w, *next, *mini;
Buffer *b;
mini = NULL;
if (JWindow->top == *tt_Screen_Rows) return(0); /* mini-buffer */
w = JWindow->next;
b = JWindow->buffer;
while(w != JWindow)
{
next = w->next;
if (w != The_MiniWindow)
{
if (w->buffer != b) touch_window_hard (w, 0);
SLFREE(w);
}
else mini = w;
w = next;
}
if (mini == NULL) mini = JWindow;
JWindow->next = mini;
mini->next = JWindow;
JWindow->top = Top_Window_Row;
JWindow->rows = *tt_Screen_Rows - 2 - (Top_Window_Row - 1);
touch_window();
return(1);
}
int enlarge_window()
{
Window_Type *w, *w1;
int min = 2;
if (JWindow == The_MiniWindow) return(0);
/* if (IS_MINIBUFFER) return(0); */
if (JWindow == JWindow->next) return(0);
w = JWindow->next;
while(w->rows <= min) w = w->next;
if (w == JWindow) return(0);
if (w->top < JWindow->top)
{
w->rows -= 1;
JWindow->rows += 1;
do
{
w = w->next;
w->top -= 1;
}
while (w != JWindow);
}
else
{
JWindow->rows += 1;
w1 = JWindow;
while(w1 != w)
{
w1 = w1->next;
w1->top += 1;
}
w->rows -= 1;
}
w = JWindow;
do
{
touch_window();
JWindow = JWindow->next;
}
while (w != JWindow);
return(1);
}
static void adjust_windows(int height)
{
Window_Type *w = JWindow;
int rows;
do
{
if (w->rows + w->top + 1 == *tt_Screen_Rows)
{
rows = height - 1 - w->top;
if (rows > 1)
{
w->rows = rows;
return;
}
while(JWindow->top != Top_Window_Row) other_window();
one_window();
JWindow->rows = height - 2 - (Top_Window_Row - 1);
if (JWindow->rows < 1) JWindow->rows = 1;
return;
}
w = w->next;
}
while (w != JWindow);
/* not reached! */
}
#ifdef COLOR_COLUMNS
static void adjust_buffer_column_attributes (int width)
{
Buffer *b = CBuf;
unsigned char *p, ch, *pmax;
int old_width = *tt_Screen_Cols;
if (old_width <= 0) return;
do
{
if (NULL != (p = b->column_colors))
{
p = b->column_colors = (unsigned char *) SLREALLOC (p, width);
if (p != NULL)
{
pmax = p + width;
p += old_width;
ch = *(p - 1);
while (p < pmax) *p++ = ch;
}
}
b = b->next;
}
while (b != CBuf);
}
#endif
void change_screen_size(int width, int height)
{
Window_Type *w;
if (JWindow == NULL) return;
if (height < 5) height = 5;
if (width < 5) width = 5;
if (height != *tt_Screen_Rows)
{
adjust_windows(height);
}
#ifdef COLOR_COLUMNS
adjust_buffer_column_attributes (width);
#endif
reset_display();
*tt_Screen_Cols = width;
*tt_Screen_Rows = height;
init_display(0);
w = JWindow;
do
{
JWindow->width = width;
/* touch_window(); */
JWindow = JWindow->next;
}
while(w != JWindow);
if (The_MiniWindow != NULL)
{
The_MiniWindow->top = height;
The_MiniWindow->width = width;
}
/* cls();
update((Line*) NULL); */
redraw_screen (1);
}
int buffer_visible(Buffer *b)
{
Window_Type *w = JWindow;
int n = 0;
if (b == NULL) return 0;
do
{
if (w->buffer == b) n++;
w = w->next;
}
while (w != JWindow);
return n;
}
int delete_window()
{
Window_Type *tthis, *prev, *next;
int nr1;
tthis = JWindow;
next = tthis->next;
if ((MiniBuffer_Active && ((tthis == The_MiniWindow) || (tthis == next->next)))
|| (tthis == next)) return(0);
nr1 = tthis->top + tthis->rows + 1;
if (nr1 != *tt_Screen_Rows)
{
while (JWindow->top != nr1) other_window();
JWindow->top = tthis->top;
}
else
{
while(JWindow->top + JWindow->rows + 1 != tthis->top) other_window();
}
JWindow->rows += tthis->rows + 1;
touch_window();
prev = next;
while(prev->next != tthis) prev = prev->next;
prev->next = next;
SLFREE(tthis);
return(1);
}
void touch_window_hard(Window_Type *w, int all)
{
int i;
Window_Type *wsave = w;
do
{
for (i = 0; i < w->rows; i++)
{
JScreen[i + w->top - 1].flags = 1;
JScreen[i + w->top - 1].line = NULL;
}
w->trashed = 1;
w = w->next;
}
while (all && (w != wsave));
}
void touch_screen_for_buffer(Buffer *b)
{
Window_Type *w;
w = JWindow;
do
{
if (w->buffer == b)
{
touch_window_hard (w, 0);
}
w = w->next;
}
while(w != JWindow);
}
int is_line_visible (int lnum)
{
int n = JWindow->rows;
Line *l, *beg = JWindow->beg.line;
push_spot ();
goto_line (&lnum);
l = CLine;
pop_spot ();
while (n && (l != NULL))
{
if (l == beg) return 1;
l = l->prev;
n--;
}
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.