Un-ignored: the dev drive is the ground truth the restoration and emulator work constantly reference (DPL3/LIBDPL + VRENDER i860 renderer source, BT/RP live+dev game trees, VGL_LABS pod boot, scene/audio content). Kept in-repo for the pod-owner community. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
387 lines
8.5 KiB
Plaintext
387 lines
8.5 KiB
Plaintext
/*
|
|
** BRIEF -- Basic Reconfigurable Interactive Editing Facility
|
|
**
|
|
** Written by Dave Nanian and Michael Strickman.
|
|
*/
|
|
#include "win_ctrl.h"
|
|
|
|
/*
|
|
** windows.cb:
|
|
**
|
|
** This file contains all of the standard BRIEF macros for window
|
|
** manipulation.
|
|
*/
|
|
|
|
void display_file_name ();
|
|
|
|
int _zoom_buf; // Buffer zoom restore information is saved in.
|
|
|
|
/*
|
|
** change_window:
|
|
**
|
|
** This macro adds a file name display to the normal change_window
|
|
** function.
|
|
*/
|
|
|
|
replacement int change_window ()
|
|
{
|
|
if (inq_called () != "")
|
|
returns (change_window ());
|
|
else
|
|
{
|
|
int ret_code;
|
|
|
|
set_msg_level (0);
|
|
|
|
if ((ret_code = change_window ()) > 0)
|
|
display_file_name ();
|
|
|
|
returns (ret_code);
|
|
}
|
|
}
|
|
|
|
/*
|
|
** create_edge:
|
|
**
|
|
** This macro sets colors for newly created windows.
|
|
*/
|
|
|
|
replacement int create_edge ()
|
|
{
|
|
int ret_code;
|
|
|
|
if ((ret_code = create_edge ()) > 0)
|
|
window_color ();
|
|
|
|
returns (ret_code);
|
|
}
|
|
|
|
/* to_top:
|
|
**
|
|
** This function moves the current line to the top of the window.
|
|
*/
|
|
|
|
void to_top ()
|
|
{
|
|
int curr_line;
|
|
|
|
inq_position (curr_line);
|
|
set_top_left (curr_line);
|
|
}
|
|
|
|
/* to_bottom:
|
|
**
|
|
** This function moves the current line to the bottom of the window,
|
|
** or as close as it possibly can (line number one must stay at the top
|
|
** of the window).
|
|
*/
|
|
|
|
void to_bottom ()
|
|
{
|
|
int curr_line,
|
|
num_lines;
|
|
|
|
inq_position (curr_line);
|
|
inq_window_size (num_lines);
|
|
|
|
if (above_eq (curr_line, num_lines))
|
|
set_top_left (curr_line - (num_lines - 1));
|
|
else
|
|
set_top_left (1);
|
|
}
|
|
|
|
/*
|
|
** center_line:
|
|
**
|
|
** This macro attempts to center the given line in the current window.
|
|
** If the line cannot be centered because it is too close to the top of
|
|
** the window, it is left in the same place.
|
|
*/
|
|
|
|
void center_line ()
|
|
{
|
|
int curr_line,
|
|
num_lines,
|
|
top_line;
|
|
|
|
inq_position (curr_line);
|
|
inq_window_size (num_lines);
|
|
++num_lines;
|
|
num_lines /= 2;
|
|
top_line = curr_line - num_lines;
|
|
|
|
if (below (top_line, curr_line) && top_line != 0)
|
|
set_top_left (top_line);
|
|
else
|
|
set_top_left (1);
|
|
}
|
|
|
|
/*
|
|
** screen_up:
|
|
**
|
|
** This macro scrolls the screen up by one line, leaving the cursor on
|
|
** the same line, if possible.
|
|
*/
|
|
|
|
void screen_up ()
|
|
{
|
|
int curr_line,
|
|
top_line;
|
|
|
|
inq_top_left (top_line);
|
|
inq_position (curr_line);
|
|
|
|
move_abs (++top_line, 0);
|
|
|
|
if (!inq_position ())
|
|
{
|
|
if (above (top_line, curr_line))
|
|
curr_line = top_line;
|
|
|
|
set_top_left (top_line);
|
|
}
|
|
move_abs (curr_line, 0);
|
|
}
|
|
|
|
/*
|
|
** screen_down:
|
|
**
|
|
** This macro scrolls the screen down by one line, leaving the cursor
|
|
** on the same line, if possible.
|
|
*/
|
|
|
|
void screen_down ()
|
|
{
|
|
int curr_line,
|
|
top_line,
|
|
num_lines;
|
|
|
|
inq_top_left (top_line);
|
|
inq_position (curr_line);
|
|
inq_window_size (num_lines);
|
|
|
|
if (top_line != 1)
|
|
{
|
|
set_top_left (--top_line);
|
|
|
|
if (above_eq (curr_line, top_line + num_lines))
|
|
move_abs (top_line + num_lines - 1, 0);
|
|
}
|
|
}
|
|
|
|
/*
|
|
** left_side:
|
|
**
|
|
** This macro moves the cursor to the left side of the window.
|
|
*/
|
|
|
|
void left_side ()
|
|
{
|
|
int shift;
|
|
|
|
inq_window_size (NULL, NULL, shift);
|
|
move_abs (0, shift + 1);
|
|
}
|
|
|
|
/*
|
|
** right_side:
|
|
**
|
|
** This macro moves the cursor to the left side of the window.
|
|
*/
|
|
|
|
void right_side ()
|
|
{
|
|
int num_cols,
|
|
shift;
|
|
|
|
inq_window_size (NULL, num_cols, shift);
|
|
move_abs (0, num_cols + shift);
|
|
}
|
|
|
|
/*
|
|
** zoom_window:
|
|
**
|
|
** This function zooms and unzooms windows.
|
|
*/
|
|
|
|
void zoom_window (void)
|
|
{
|
|
/*
|
|
** Create the zoom buffer if we haven't already.
|
|
*/
|
|
|
|
if (!_zoom_buf)
|
|
_zoom_buf = create_buffer ("Zoom Buf", NULL, 1);
|
|
|
|
/*
|
|
** Note that we can't do anything when there's an overlapped window
|
|
** on the screen.
|
|
*/
|
|
|
|
if (!inq_window_info ())
|
|
{
|
|
int start_win_id = inq_window (),
|
|
curr_win_id = start_win_id,
|
|
old_buf_id = set_buffer (_zoom_buf),
|
|
curr_buf_id,
|
|
lx,
|
|
by,
|
|
rx,
|
|
ty,
|
|
cursor_line,
|
|
cursor_col,
|
|
top_line,
|
|
top_col,
|
|
bg_color;
|
|
|
|
string file_name;
|
|
|
|
/*
|
|
** If there's more than one window on the screen, we zoom it to
|
|
** full screen. Otherwise, we unzoom (if there's any zoom info).
|
|
*/
|
|
|
|
top_of_buffer ();
|
|
|
|
if (next_window () != curr_win_id)
|
|
{
|
|
/*
|
|
** Delete all the information in the buffer (previous zooms).
|
|
*/
|
|
|
|
drop_anchor ();
|
|
end_of_buffer ();
|
|
delete_block ();
|
|
|
|
/*
|
|
** Loop through each window, saving its window information
|
|
** if unzoom is done.
|
|
*/
|
|
|
|
do
|
|
{
|
|
inq_window_info (curr_win_id, curr_buf_id, lx, by, rx, ty);
|
|
|
|
if (curr_buf_id)
|
|
{
|
|
set_buffer (curr_buf_id);
|
|
inq_names (file_name);
|
|
inq_top_left (top_line, top_col, curr_win_id, cursor_line, cursor_col);
|
|
set_buffer (_zoom_buf);
|
|
insert ("file=%s %u %u %u %u %d %d %d %d %d\n", file_name,
|
|
top_col, top_line, cursor_col, cursor_line,
|
|
lx, by, rx, ty, inq_window_color (curr_win_id));
|
|
}
|
|
curr_win_id = next_window (curr_win_id);
|
|
}
|
|
while (curr_win_id != start_win_id);
|
|
|
|
/*
|
|
** Now, destroy and recreate the current window full screen.
|
|
*/
|
|
|
|
bg_color = inq_window_color (start_win_id);
|
|
inq_screen_size (by, rx);
|
|
display_windows (0);
|
|
curr_win_id = create_tiled_window (1, by - 3, rx - 2, 1, old_buf_id);
|
|
set_ctrl_state( ZOOM_BTN, SHOW_ZOOMED, curr_win_id );
|
|
window_color (bg_color, curr_win_id);
|
|
display_windows (1);
|
|
set_window (curr_win_id);
|
|
}
|
|
|
|
/*
|
|
** If there's information to unzoom, we restore the previous
|
|
** window layout.
|
|
*/
|
|
|
|
else if (trim (read ()) != "")
|
|
{
|
|
int loc,
|
|
curr_top_line,
|
|
curr_top_col,
|
|
curr_cursor_line,
|
|
curr_cursor_col,
|
|
window_to_select,
|
|
select_first;
|
|
|
|
string file_line,
|
|
curr_file_name;
|
|
|
|
/*
|
|
** First, we get information about the current buffer. If
|
|
** we've switched buffers, or if we've moved, we use this
|
|
** information to reposition/reselect the current window when
|
|
** we've unzoomed.
|
|
*/
|
|
|
|
set_buffer (old_buf_id);
|
|
inq_names (curr_file_name);
|
|
inq_top_left (curr_top_line, curr_top_col, curr_win_id, curr_cursor_line, curr_cursor_col);
|
|
set_buffer (_zoom_buf);
|
|
select_first = !search_fwd ("file=" + curr_file_name + " ", 0);
|
|
top_of_buffer ();
|
|
display_windows (0);
|
|
|
|
/*
|
|
** For each saved window, we recreate it and reattach the
|
|
** buffer that used to be there, if it's available.
|
|
*/
|
|
|
|
while ((file_line = trim (read ())) != "")
|
|
{
|
|
loc = rindex (file_line, " ");
|
|
bg_color = atoi (substr (file_line, loc + 1));
|
|
loc = rindex (substr (file_line, 1, loc - 1), " ");
|
|
ty = atoi (substr (file_line, loc + 1));
|
|
loc = rindex (substr (file_line, 1, loc - 1), " ");
|
|
rx = atoi (substr (file_line, loc + 1));
|
|
loc = rindex (substr (file_line, 1, loc - 1), " ");
|
|
by = atoi (substr (file_line, loc + 1));
|
|
loc = rindex (substr (file_line, 1, loc - 1), " ");
|
|
lx = atoi (substr (file_line, loc + 1));
|
|
file_line = substr (file_line, 1, loc - 1);
|
|
loc = rindex (file_line, " ");
|
|
cursor_line = atoi (substr (file_line, loc + 1));
|
|
loc = rindex (substr (file_line, 1, loc - 1), " ");
|
|
cursor_col = atoi (substr (file_line, loc + 1));
|
|
loc = rindex (substr (file_line, 1, loc - 1), " ");
|
|
top_line = atoi (substr (file_line, loc + 1));
|
|
loc = rindex (substr (file_line, 1, loc - 1), " ");
|
|
top_col = atoi (substr (file_line, loc + 1));
|
|
|
|
file_name = trim (ltrim (substr (file_line, 6, loc - 6)));
|
|
|
|
curr_buf_id = inq_buffer (file_name);
|
|
|
|
/*
|
|
** If we're working with the current buffer and haven't yet
|
|
** found the window that contains it, or we're dealing with a
|
|
** file that's no longer part of the set, we use the buffer
|
|
** that was current when we started the unzoom operation.
|
|
*/
|
|
|
|
if ((!window_to_select && (select_first || curr_buf_id == old_buf_id)) || curr_buf_id == 0)
|
|
{
|
|
top_line = curr_top_line;
|
|
top_col = curr_top_col;
|
|
cursor_line = curr_cursor_line;
|
|
cursor_col = curr_cursor_col;
|
|
curr_buf_id = old_buf_id;
|
|
}
|
|
curr_win_id = create_tiled_window (lx, by, rx, ty, curr_buf_id);
|
|
set_top_left (top_line, top_col, curr_win_id, cursor_line, cursor_col);
|
|
window_color (bg_color, curr_win_id);
|
|
|
|
if (!window_to_select && curr_buf_id == old_buf_id)
|
|
window_to_select = curr_win_id;
|
|
|
|
down ();
|
|
}
|
|
display_windows (1);
|
|
set_window (window_to_select);
|
|
}
|
|
set_buffer (old_buf_id);
|
|
}
|
|
}
|