?? window.c
字號:
#include "tdestr.h"
#include "common.h"
#include "define.h"
#include "tdefunc.h"
int initialize_window( void )
{
int top;
int bottom;
int start_col;
int end_col;
WINDOW *wp;
WINDOW *window;
register file_infos *fp;
register int rc;
line_list_ptr ll;
line_list_ptr temp_ll;
rc = OK;
window = g_status.current_window;
fp = g_status.current_file;
if (window == NULL) {
top = start_col = 0;
bottom = g_display.nlines;
end_col = g_display.ncols - 1;
} else {
top = window->top_line - 1;
bottom = window->bottom_line;
start_col = window->start_col;
end_col = window->end_col;
}
assert( top < bottom );
assert( start_col < end_col );
assert( fp != NULL );
if (create_window( &wp, top, bottom, start_col, end_col, fp ) == ERROR) {
error( WARNING, bottom, main4 );
if (fp->ref_count == 0) {
if (fp->prev != NULL)
fp->prev->next = fp->next;
else
g_status.file_list = fp->next;
if (fp->next != NULL)
fp->next->prev = fp->prev;
ll = fp->undo_top;
while (ll != NULL) {
temp_ll = ll->next;
if (ll->line != NULL)
my_free( ll->line );
my_free( ll );
ll = temp_ll;
}
ll = fp->line_list;
while (ll != NULL) {
temp_ll = ll->next;
if (ll->line != NULL)
my_free( ll->line );
my_free( ll );
ll = temp_ll;
}
#if defined( __MSC__ )
_fheapmin( );
#endif
free( fp );
wp = g_status.current_window;
if (wp != NULL && wp->visible)
g_status.current_file = wp->file_info;
else
g_status.stop = TRUE;
}
rc = ERROR;
}
if (rc != ERROR) {
wp->ccol = wp->start_col;
wp->rcol = wp->bcol = 0;
wp->rline = 1L;
wp->ll = fp->line_list;
wp->visible = TRUE;
wp->letter = fp->next_letter++;
if (window != NULL)
window->visible = FALSE;
g_status.current_window = wp;
}
return( rc );
}
int next_window( WINDOW *window )
{
register WINDOW *wp;
int change;
if (window != NULL) {
change = FALSE;
wp = window->next;
while (wp != NULL) {
if (wp->visible) {
change = TRUE;
break;
}
wp = wp->next;
}
if (!change) {
wp = g_status.window_list;
while (wp != window) {
if (wp->visible) {
change = TRUE;
break;
}
wp = wp->next;
}
}
if (change == TRUE) {
entab_linebuff( );
un_copy_line( window->ll, window, TRUE );
g_status.current_window = wp;
g_status.current_file = wp->file_info;
}
}
return( OK );
}
int prev_window( WINDOW *window )
{
register WINDOW *wp;
int change;
if (window != NULL) {
change = FALSE;
wp = window->prev;
while (wp != NULL) {
if (wp->visible) {
change = TRUE;
break;
}
wp = wp->prev;
}
if (!change) {
wp = window->next;
if (wp != NULL) {
while (wp->next != NULL)
wp = wp->next;
while (wp != window) {
if (wp->visible) {
change = TRUE;
break;
}
wp = wp->prev;
}
}
}
if (change == TRUE) {
entab_linebuff( );
un_copy_line( window->ll, window, TRUE );
g_status.current_window = wp;
g_status.current_file = wp->file_info;
}
}
return( OK );
}
/*
* 作用: 在光標處水平切分窗口
* 參數: window: 當前窗口的指針
*/
int split_horizontal( WINDOW *window )
{
register WINDOW *wp;
register WINDOW *win;
WINDOW *temp;
file_infos *file;
int rc;
rc = OK;
win = window;
if ( win != NULL) {
/*
* 檢查是否有空放置新窗口
*/
if (win->bottom_line - win->cline < 2) {
/*
* 向上引動光標
*/
error( WARNING, win->bottom_line, win1 );
rc = ERROR;
} else {
file = win->file_info;
assert( file != NULL );
if (create_window( &temp, win->cline+1, win->bottom_line,
win->start_col, win->end_col, file ) == ERROR) {
/*
* 內存不足
*/
error( WARNING, win->bottom_line, main4 );
rc = ERROR;
}
if (rc == OK && temp != NULL) {
entab_linebuff( );
un_copy_line( win->ll, win, TRUE );
wp = temp;
/*
* 記錄當前窗口因為創立新的窗口而丟生的行。
* 并且調整它的頁大小
*/
win->bottom_line = win->cline;
setup_window( win );
display_current_window( win );
/*
* 設置新的光標位置
*/
wp->rcol = win->rcol;
wp->ccol = win->ccol;
wp->bcol = win->bcol;
wp->rline = win->rline;
wp->bin_offset = win->bin_offset;
wp->ll = win->ll;
wp->cline = wp->cline + win->cline - (win->top_line + win->ruler);
if (wp->cline > wp->bottom_line)
wp->cline = wp->bottom_line;
wp->visible = TRUE;
wp->vertical = win->vertical;
wp->letter = file->next_letter++;
wp->ruler = mode.ruler;
/*
* 新的窗口變成了當前窗口
*/
g_status.current_window = wp;
show_window_count( g_status.window_count );
show_window_header( wp );
display_current_window( wp );
if (wp->vertical)
show_vertical_separator( wp );
make_ruler( wp );
show_ruler( wp );
rc = OK;
}
}
} else
rc = ERROR;
return( rc );
}
int split_vertical( WINDOW *window )
{
register WINDOW *wp;
register WINDOW *win;
WINDOW *temp;
file_infos *file;
int rc;
rc = OK;
win = window;
if (win != NULL) {
if (win->start_col + 15 > win->ccol) {
error( WARNING, win->bottom_line, win2 );
rc = ERROR;
} else if (win->end_col - 15 < win->ccol) {
error( WARNING, win->bottom_line, win3 );
rc = ERROR;
} else {
file = win->file_info;
assert( file != NULL );
if (create_window( &temp, win->top_line-1, win->bottom_line,
win->ccol+1, win->end_col, file ) == ERROR) {
error( WARNING, win->bottom_line, main4 );
rc = ERROR;
}
if (rc == OK && temp != NULL) {
entab_linebuff( );
un_copy_line( win->ll, win, TRUE );
wp = temp;
win->ccol = win->end_col = win->ccol - 1;
win->rcol--;
win->vertical = TRUE;
show_window_header( win );
show_vertical_separator( win );
display_current_window( win );
make_ruler( win );
show_ruler( win );
show_ruler_pointer( win );
wp->rcol = win->rcol;
wp->ccol = wp->start_col + win->ccol - win->start_col;
if (wp->ccol > wp->end_col)
wp->ccol = wp->end_col;
wp->bcol = win->bcol;
wp->rline = win->rline;
wp->bin_offset = win->bin_offset;
wp->ll = win->ll;
wp->cline = win->cline;
wp->visible = TRUE;
wp->vertical = TRUE;
wp->letter = file->next_letter++;
wp->ruler = mode.ruler;
g_status.current_window = wp;
check_virtual_col( wp, wp->rcol, wp->ccol );
wp->file_info->dirty = FALSE;
show_window_count( g_status.window_count );
show_window_header( wp );
display_current_window( wp );
make_ruler( wp );
show_ruler( wp );
}
}
} else
rc = ERROR;
return( rc );
}
void show_vertical_separator( WINDOW *window )
{
int i;
int line;
int col;
line = window->top_line - 1;
col = window->end_col + 1;
if (col < g_display.ncols - 1) {
i = window->bottom_line - line;
assert( i <= g_display.nlines );
while (i-- >= 0)
c_output( VERTICAL_CHAR, col, line++, g_display.head_color );
}
}
int size_window( WINDOW *window )
{
char line_buff[(MAX_COLS+1)*2];
int func;
int c;
int resize;
int show_above_ruler;
int old_bottom_line;
int old_top_line;
int new_bottom_line;
int new_top_line;
register WINDOW *above;
register WINDOW *win;
win = window;
if (win->top_line != 1 && !win->vertical) {
entab_linebuff( );
un_copy_line( win->ll, win, TRUE );
save_screen_line( 0, win->bottom_line, line_buff );
set_prompt( win4, win->bottom_line );
above = g_status.window_list;
while (above->bottom_line + 2 != win->top_line || !above->visible)
above = above->next;
if (above->vertical)
error( WARNING, win->bottom_line, win5 );
else {
old_top_line = win->top_line;
old_bottom_line = above->bottom_line;
show_above_ruler = FALSE;
for (func=0; func != AbortCommand && func != Rturn; ) {
c = getkey( );
func = getfunc( c );
if (c == RTURN || func == NextLine || func == BegNextLine)
func = Rturn;
else if (c == ESC)
func = AbortCommand;
resize = FALSE;
if (func == LineUp) {
if (above->bottom_line > above->top_line + above->ruler) {
if (win->rline == (win->cline - (win->top_line+win->ruler-1)))
--win->cline;
--win->top_line;
if (above->cline == above->bottom_line)
--above->cline;
--above->bottom_line;
resize = TRUE;
if (mode.ruler) {
if (win->ruler == FALSE) {
if (win->cline == win->top_line)
++win->cline;
if (win->cline > win->bottom_line)
win->cline = win->bottom_line;
win->ruler = TRUE;
}
}
}
} else if (func == LineDown) {
if (win->bottom_line > win->top_line + win->ruler) {
if (win->cline == win->top_line + win->ruler)
++win->cline;
++win->top_line;
++above->bottom_line;
resize = TRUE;
if (mode.ruler) {
if (above->ruler == FALSE) {
if (above->cline == above->top_line)
++above->cline;
if (above->cline > above->bottom_line)
above->cline = above->bottom_line;
above->ruler = TRUE;
make_ruler( above );
show_above_ruler = TRUE;
}
}
}
}
if (resize == TRUE) {
setup_window( above );
display_current_window( above );
if (show_above_ruler) {
show_ruler( above );
show_ruler_pointer( above );
show_above_ruler = FALSE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -