⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 windows.c

📁 aee是一种易使用的文本编辑器。你可以不用说明书来使用它。它提供终端接口和本地的X-windows接口。它的特性包括即弹的菜单
💻 C
字号:
/* |	windows.c | |	$Header: /home/hugh/sources/aee/RCS/windows.c,v 1.18 1999/01/01 23:14:51 hugh Exp $ *//* | |	Copyright (c) 1986 - 1988, 1991 - 1999 Hugh Mahon. | */#include "aee.h"void new_screen()		/* draw all of the new information on the screen */{	int i;	char *nchar;		/* temporary character pointer		*/	struct bufr *tb;	/* temp buffer for storage of current stats */	struct bufr *buff_holder;	/* tmp storage of curr_buff	*/	int temp_mark;		/* temporary mark flag			*/	if ((windows) && (num_of_bufs > 1))	{		buff_holder = curr_buff;		temp_mark = mark_text;		mark_text = FALSE;		tb = buf_alloc();		for (t_buff = first_buff; t_buff != NULL; t_buff = t_buff->next_buff)		{			werase(t_buff->footer);			wrefresh(t_buff->footer);			wmove(t_buff->footer, 0,0);			wstandout(t_buff->footer);			waddstr(t_buff->footer, "  ");			for (i = 2, nchar = t_buff->name; (i < COLS) && (*nchar != (char) NULL); i+=len_char(*nchar, i), nchar++)				waddch(t_buff->footer, *nchar);			for (; i < COLS; i++)				waddch(t_buff->footer, '-');			wstandend(t_buff->footer);			wrefresh(t_buff->footer);			werase(t_buff->win);			wrefresh(t_buff->win);			curr_buff = t_buff;			midscreen(curr_buff->scr_vert, curr_buff->position);			wrefresh(t_buff->win);		}		curr_buff = buff_holder;		wmove(curr_buff->footer, 0, 0);		wstandout(curr_buff->footer);		waddch(curr_buff->footer, '*');		wstandend(curr_buff->footer);		wrefresh(curr_buff->footer);		free(tb);		mark_text = temp_mark;		if (mark_text)		{			midscreen(curr_buff->scr_vert, curr_buff->position);		}	}	else	{		werase(curr_buff->win);		wrefresh(curr_buff->win);		midscreen(curr_buff->scr_vert, curr_buff->position);	}	wrefresh(curr_buff->win);}struct bufr *add_buf(ident)		/* add a new buffer to the list */char *ident;{	struct bufr *t;			/* temporary pointer		*/	t = NULL;	if (windows && (num_of_bufs >= ((LINES - 1)/2)))	{		no_windows();	}	if ((windows) && (num_of_bufs > 1))	{		wmove(curr_buff->footer, 0, 0);		wstandout(curr_buff->footer);		waddch(curr_buff->footer, ' ');		wstandend(curr_buff->footer);		wrefresh(curr_buff->footer);	}	t = first_buff;	while (t->next_buff != NULL)		t = t->next_buff;	curr_buff = t->next_buff = buf_alloc();	curr_buff->num_of_lines = 1;	curr_buff->absolute_lin = 1;	t = t->next_buff;	t->name = xalloc(strlen(ident) + 1);	copy_str(ident, t->name);	curr_buff->curr_line = curr_buff->first_line = txtalloc();	t->next_buff = NULL;	curr_buff->pointer = curr_buff->curr_line->line = curr_buff->first_line->line = xalloc(10);	*t->first_line->line = (char) NULL;	t->first_line->vert_len = t->first_line->line_number = t->first_line->line_length = 1;	t->first_line->max_length = 10;	t->first_line->prev_line = NULL;	t->first_line->next_line = NULL;	t->footer = NULL;	t->position = 1;	curr_buff->scr_pos = curr_buff->abs_pos = curr_buff->scr_vert = curr_buff->scr_horz = 0;	t->win = NULL;	num_of_bufs++;	if (!windows)	{		t->window_top = first_buff->window_top;		t->lines = first_buff->lines;		t->last_line = first_buff->last_line;		t->last_col = first_buff->last_col;		t->win = first_buff->win;	}	else		redo_win();	new_screen();	return(t);}void chng_buf(name)	/* move to the named buffer, if it doesn't exist, create it */char *name;{	struct bufr *tmp;	char *test;	clr_cmd_line = TRUE;	test = next_word(name);	if ((*test == (char) NULL) && (!mark_text))	{		wrefresh(curr_buff->win);		if (curr_buff->curr_line->changed && curr_buff->journalling)			write_journal(curr_buff, curr_buff->curr_line);		tmp = first_buff;		while ((tmp != NULL) && (strcmp(name, tmp->name)))			tmp = tmp->next_buff;		if (tmp == NULL)			tmp = add_buf(name);		else		{			if ((windows) && (num_of_bufs > 1))			{				wmove(curr_buff->footer, 0, 0);				wstandout(curr_buff->footer);				waddch(curr_buff->footer, ' ');				wstandend(curr_buff->footer);				wrefresh(curr_buff->footer);			}			curr_buff = tmp;			if (!windows)				new_screen();			else if (num_of_bufs > 1)			{				wmove(curr_buff->footer, 0, 0);				wstandout(curr_buff->footer);				waddch(curr_buff->footer, '*');				wstandend(curr_buff->footer);				wrefresh(curr_buff->footer);			}			wmove(com_win,0,0);			wclrtoeol(com_win);			wprintw(com_win, buff_msg, curr_buff->name);			wrefresh(com_win);			wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz);		}	}	else if (mark_text)	{		wmove(com_win,0,0);		wclrtoeol(com_win);		wprintw(com_win, cant_chng_while_mark_msg);		wrefresh(com_win);		wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz);	}	else	{		wmove(com_win,0,0);		wclrtoeol(com_win);		wprintw(com_win, too_many_parms_msg);		wrefresh(com_win);		wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz);	}}int del_buf()			/* delete current buffer		*/{	struct bufr *garb;	int choice;	if (!mark_text)	{		if ((curr_buff->edit_buffer) && (curr_buff->changed))		{			choice = menu_op(del_buff_menu);			if ((choice == 0) || (choice == 2))				return(FALSE);			if ((choice == 1) && (!file_write_success()))				return(FALSE);		}		if (curr_buff->journalling)			/* if writing to recover file, delete it */		{			remove_journal_file(curr_buff);		}		curr_buff->curr_line = curr_buff->first_line->next_line;		while (curr_buff->curr_line != NULL)		{			free(curr_buff->curr_line->prev_line->line);			free(curr_buff->curr_line->prev_line);			curr_buff->curr_line = curr_buff->curr_line->next_line;		}		garb = first_buff;		while (garb->next_buff != curr_buff)			garb = garb->next_buff;		garb->next_buff = curr_buff->next_buff;		if (windows)		{			werase(curr_buff->win);			wrefresh(curr_buff->win);			delwin(curr_buff->win);			werase(curr_buff->footer);			wrefresh(curr_buff->footer);			delwin(curr_buff->footer);			curr_buff->footer = NULL;		}		free(curr_buff);		num_of_bufs--;		if (windows)			redo_win();		curr_buff = first_buff;		new_screen();		wmove(com_win,0,0);		wclrtoeol(com_win);		wprintw(com_win, buff_is_main_msg);		wrefresh(com_win);		wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz);		clr_cmd_line = TRUE;	}	else	{		wmove(com_win, 0, 0);		werase(com_win);		wprintw(com_win, cant_del_while_mark);		wrefresh(com_win);		return(FALSE);	}	return(TRUE);}void redo_win()	/* adjust windows to allow for new/deleted windows	*/{	int total_lines;	int num_of_lines;		/* number of lines in windows	*/	int counter;			/* temporary counter		*/	int iter;			/* iteration counter		*/	int remainder;			/* remainder of lines		*/	int temp_mark;			/* temporary mark flag		*/	int offset;			/* offset from top		*/	struct bufr *tt;		/* temporary pointer		*/	struct text *tmp_tx;		/* temporary text pointer	*/	if (window_resize)	{		werase(com_win);		delwin(com_win);		com_win = newwin(1, COLS, LINES-1, 0);		curr_buff->last_col = COLS - 1;	}	if (!windows)	{		if ((info_window) && (info_win == 0))		{			delwin(curr_buff->win);			info_win = newwin(info_win_height, COLS, 0, 0);			paint_information();			first_buff->win = curr_buff->win = newwin(LINES - info_win_height - 1, COLS, info_win_height, 0);			first_buff->last_line = LINES - info_win_height - 2;			first_buff->lines = LINES - info_win_height - 1;			first_buff->window_top = info_win_height;		}		else if ((!info_window) && (info_win != 0))		{			delwin(curr_buff->win);			delwin(info_win);			first_buff->last_line = LINES - 2;			first_buff->lines = LINES - 1;			first_buff->win = curr_buff->win = newwin(LINES - 1, COLS, 0, 0);			first_buff->window_top = 0;			info_win = FALSE;		}		else if ((info_window) && (window_resize))		{			delwin(info_win);			delwin(curr_buff->win);			info_win = newwin(info_win_height, COLS, 0, 0);			paint_information();			first_buff->win = curr_buff->win = newwin(LINES - info_win_height - 1, COLS, info_win_height, 0);			first_buff->last_line = LINES - info_win_height - 2;			first_buff->lines = LINES - info_win_height - 1;		}		else		{			offset = 0;			if (info_window)			{				delwin(info_win);				info_win = newwin(info_win_height, COLS, 0, 0);				paint_information();				offset = info_win_height;			}			delwin(curr_buff->win);			first_buff->win = curr_buff->win = newwin(LINES - 1, COLS, offset, 0);			first_buff->last_line = LINES - 2;			first_buff->lines = LINES - 1;		}		first_buff->last_col = COLS - 1;		if (num_of_bufs > 1)		{			tt = first_buff->next_buff;			while (tt != NULL)			{				tt->lines = first_buff->lines;				tt->last_line = first_buff->last_line;				tt->last_col = first_buff->last_col;				tt->win = first_buff->win;				tt = tt->next_buff;			}		}		tt = first_buff;		while (tt != NULL)		{			/*			 |	if a resize, re-calculate the 			 |	vertical length lines of text			 */			if (local_COLS != COLS)			{				for (tmp_tx = tt->first_line; tmp_tx != NULL; 				        tmp_tx = tmp_tx->next_line)				{					tmp_tx->vert_len = (scanline(tmp_tx, 					     tmp_tx->line_length) / COLS) + 1;				}			}			tt->window_top = first_buff->window_top;			tt = tt->next_buff;		}		window_resize = FALSE;		return;	}	temp_mark = mark_text;	mark_text = FALSE;	{		if ((!info_window) && (info_win != 0))		{			delwin(info_win);			info_win = 0;		}		else if ((info_window) && (info_win == 0))		{			info_win = newwin(info_win_height, COLS, 0, 0);			paint_information();		}		else if ((info_window) && (window_resize))		{			delwin(info_win);			info_win = newwin(info_win_height, COLS, 0, 0);			paint_information();		}		else if (info_window)		{			delwin(info_win);			info_win = newwin(info_win_height, COLS, 0, 0);			paint_information();		}		if (info_window)			total_lines = (LINES - 1) - info_win_height;		else			total_lines = LINES - 1;		num_of_lines = total_lines/num_of_bufs;		remainder = total_lines % num_of_bufs;		if (info_window)			counter = info_win_height;		else			counter = 0;		for (iter=0, tt=first_buff; (tt != NULL) ; iter++)		{			tt->last_col = COLS - 1;			tt->lines = num_of_lines;			if (remainder > 0)			{				tt->lines++;				remainder--;			}			if (tt->win != NULL)			{				werase(tt->win);				wrefresh(tt->win);				delwin(tt->win);				tt->win = NULL;			}			if (num_of_bufs > 1)				tt->lines--;			if (tt->scr_vert > (tt->lines - 1))				tt->scr_vert = tt->lines - 1;			/*			 |	if a resize, re-calculate the vertical length 			 |	lines of text			 */			if (local_COLS != COLS)			{				for (tmp_tx = tt->first_line; tmp_tx != NULL; 				     tmp_tx = tmp_tx->next_line)				{					tmp_tx->vert_len = (scanline(tmp_tx, 					     tmp_tx->line_length) / COLS) + 1;									}			}			tt->last_line = tt->lines - 1;			tt->win = newwin(tt->lines,COLS,counter,0);			tt->window_top = counter;			counter += tt->lines;			if (tt->footer != NULL)			{				werase(tt->footer);				wrefresh(tt->footer);				delwin(tt->footer);				tt->footer = NULL;			}			if (num_of_bufs > 1)			{				tt->footer = newwin(1, COLS, counter, 0);				counter++;			}			keypad(tt->win, TRUE);			nodelay(tt->win, FALSE);			idlok(tt->win, TRUE);			tt = tt->next_buff;		}	}	mark_text = temp_mark;	window_resize = FALSE;}void resize_check(){	/*	 |	if screen size has not changed, return immediately	 */	if ((LINES == local_LINES) && (COLS == local_COLS))		return;	/*	 |	if the screen size has changed, save buffer information, 	 |	resize windows accordingly, save new size, then repaint screen	 */	window_resize = TRUE;	clearok(stdscr, TRUE);	redo_win();	local_LINES = LINES;	local_COLS = COLS;	curr_buff->last_line = curr_buff->lines - 1;	/*	 |	repaint the screen with all buffers (if applicable)	 */	new_screen();	if (info_win != NULL)		paint_info_win();}void set_up_term()		/* set up the terminal for operating with ae	*/{#ifndef XAE	initscr();#else	initscr(win_width, win_height);	event_init();#endif	savetty();	saveterm();	noecho();	raw();	nonl();	local_LINES = LINES;	local_COLS = COLS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -