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

📄 xcurse.c

📁 aee是一种易使用的文本编辑器。你可以不用说明书来使用它。它提供终端接口和本地的X-windows接口。它的特性包括即弹的菜单
💻 C
📖 第 1 页 / 共 3 页
字号:
	return(Ntemp);}void wmove(window, row, column)	/* move cursor to indicated position in window */WINDOW *window;int row, column;{	if ((row < window->Num_lines) && (column < window->Num_cols))	{		window->LX = column;		window->LY = row;	}}void clear_line(line, column, cols)struct _line *line;int column;int cols;{	int j;	if (column > line->last_char)	{		for (j = line->last_char; j < column; j++)		{			line->row[j] = ' ';			line->attributes[j] = (char) NULL;		}	}	line->last_char = column;	line->row[column] = (char) NULL;	line->attributes[column] = (char) NULL;	line->changed = TRUE;}void werase(window)			/* clear the specified window		*/WINDOW *window;{	int i;	struct _line *tmp;	window->SCROLL_CLEAR = CLEAR;	window->scroll_up = window->scroll_down = 0;	for (i = 0, tmp = window->first_line; i < window->Num_lines; i++, tmp = tmp->next_screen)		clear_line(tmp, 0, window->Num_cols);}void wclrtoeol(window)	/* erase from current cursor position to end of line */WINDOW *window;{	int column, row;	struct _line *tmp;	window->SCROLL_CLEAR = CHANGE;	column = window->LX;	row = window->LY;	for (row = 0, tmp = window->first_line; row < window->LY; row++)		tmp = tmp->next_screen;	clear_line(tmp, column, window->Num_cols);}void wrefresh(window)		/* flush all previous output		*/WINDOW *window;{	wnoutrefresh(window);	doupdate();	virtual_scr->SCROLL_CLEAR = FALSE;	virtual_scr->scroll_down = virtual_scr->scroll_up = 0;	XFlush(dp);}void touchwin(window)WINDOW *window;{	struct _line *user_line;	int line_counter = 0;	for (line_counter = 0, user_line = window->first_line; 		line_counter < window->Num_lines; line_counter++)	{		user_line->changed = TRUE;	}	window->SCROLL_CLEAR = TRUE;}void wnoutrefresh(window)WINDOW *window;{	struct _line *user_line;	struct _line *virtual_line;	int line_counter = 0;	int user_col = 0;	int virt_col = 0;	cursor(virtual_scr, virtual_scr->LY, virtual_scr->LX, TRUE, FALSE);	if (window->SR >= virtual_scr->Num_lines)		return;	user_line = window->first_line;	virtual_line = virtual_scr->first_line;	virtual_scr->SCROLL_CLEAR = window->SCROLL_CLEAR;	virtual_scr->LX = window->LX + window->SC;	virtual_scr->LY = window->LY + window->SR;	virtual_scr->scroll_up = window->scroll_up;	virtual_scr->scroll_down = window->scroll_down;	if ((last_window_refreshed == window) && (!window->SCROLL_CLEAR))		return;	for (line_counter = 0; line_counter < window->SR; line_counter++)	{		virtual_line = virtual_line->next_screen;	}	for (line_counter = 0; (line_counter < window->Num_lines)		&& ((line_counter + window->SR) < virtual_scr->Num_lines); 			line_counter++)	{		if ((last_window_refreshed != window) || (user_line->changed) || ((SCROLL | CLEAR) & window->SCROLL_CLEAR))		{			for (user_col = 0, virt_col = window->SC; 				(virt_col < virtual_scr->Num_cols) 				  && (user_col < user_line->last_char); 				  	virt_col++, user_col++)			{				virtual_line->row[virt_col] = user_line->row[user_col];				virtual_line->attributes[virt_col] = user_line->attributes[user_col];			}			for (user_col = user_line->last_char, 			     virt_col = window->SC + user_line->last_char; 				(virt_col < virtual_scr->Num_cols) 				  && (user_col < window->Num_cols); 				  	virt_col++, user_col++)			{				virtual_line->row[virt_col] = ' ';				virtual_line->attributes[virt_col] = (char) NULL;			}		}		if (virtual_scr->Num_cols != window->Num_cols)		{			if (virtual_line->last_char < (user_line->last_char + window->SC))			{				if (virtual_line->row[virtual_line->last_char] == (char) NULL)					virtual_line->row[virtual_line->last_char] = ' ';				virtual_line->last_char = 					min(virtual_scr->Num_cols, 					  (user_line->last_char + window->SC));			}		}		else			virtual_line->last_char = user_line->last_char;		virtual_line->row[virtual_line->last_char] = (char) NULL;		virtual_line->changed = user_line->changed;		virtual_line = virtual_line->next_screen;		user_line = user_line->next_screen;	}	window->SCROLL_CLEAR = FALSE;	window->scroll_up = window->scroll_down = 0;	last_window_refreshed = window;}void flushinp()			/* flush input				*/{}int wgetch(window)			/* get character from specified window	*/WINDOW *window;{	int status;	int in_value;	char temp;	KeySym keysym_return;	if ((status = XLookupString(keyevent, &temp, 1, &keysym_return, NULL)))		in_value = temp;	else if ((IsModifierKey(keysym_return)) || (IsMiscFunctionKey(keysym_return)))	{		in_value = 0;	}	else	{/*		key_code = XKeysymToKeycode(dp, keysym_return); */		in_value = look_up_key(keysym_return);	}	return(in_value);}intlook_up_key(key_code)		/* decode mapping of key		*/int key_code;{	int count;	count = 0;	while ((Key_vals[count] != 255) && (key_code != XKey_vals[count]))		count++;	if (XKey_vals[count] == key_code)		return(Key_vals[count]);	else	{#ifdef TEST		wmove(stdscr, 0, 0);		wclrtoeol(stdscr);		wprintw(stdscr, "unknown keycode = %o", key_code);		wrefresh(stdscr);#endif		return(0);	}}void waddch(window, c)	/* output the character in the specified window	*/WINDOW *window;int c;{	int column, j;	int shift;	/* number of spaces to shift if a tab		*/	struct _line *tmpline;	column = window->LX;	if (c == '\t')	{		shift = (column + 1) % 8;		if (shift == 0)			shift++;		else			shift = 9 - shift;		while (shift > 0)		{			shift--;			waddch(window, ' ');		}	}	else if ((!((window->LY >= (window->Num_lines - 1)) && (column >= (window->Num_cols - 1)))) && (column < window->Num_cols) && (window->LY < window->Num_lines))	{		if (( c != '\b') && (c != '\n') && (c != '\r'))		{			tmpline = window->first_line; 			tmpline = window->line_array[window->LY];			tmpline->changed = TRUE;			tmpline->row[column] = c;			tmpline->attributes[column] = window->Attrib;			if (column >= tmpline->last_char)			{				if (column > tmpline->last_char)					for (j = tmpline->last_char; j < column; j++)					{						tmpline->row[j] = ' ';						tmpline->attributes[j] = (char) NULL;					}				tmpline->row[column + 1] = (char) NULL;				tmpline->attributes[column + 1] = (char) NULL;				tmpline->last_char = column + 1;			}		}		if (c == '\n')		{			wclrtoeol(window);			window->LX = window->Num_cols;		}		else if (c == '\r')			window->LX = 0;		else if (c == '\b')			window->LX--;		else			window->LX++;	}	if (window->LX >= window->Num_cols)	{		window->LX = 0;		window->LY++;		if (window->LY >= window->Num_lines)		{			window->LY = window->Num_lines - 1;			wmove(window, 0, 0);			wdeleteln(window);			wmove(window, window->LY, 0);		}	}	window->SCROLL_CLEAR = CHANGE;}void winsertln(window)	/* insert a blank line into the specified window */WINDOW *window;{	int row, column;	struct _line *tmp;	struct _line *tmp1;	window->scroll_down += 1;	window->SCROLL_CLEAR = SCROLL;	column = window->LX;	row = window->LY;	for (row = 0, tmp = window->first_line; (row < window->Num_lines) && (tmp->next_screen != NULL); row++)		tmp = tmp->next_screen;	if (tmp->prev_screen != NULL)		tmp->prev_screen->next_screen = NULL;	tmp1 = tmp;	clear_line(tmp1, 0, window->Num_cols);	tmp1->number = -1;	for (row = 0, tmp = window->first_line; (row < window->LY) && (tmp->next_screen != NULL); row++)		tmp = tmp->next_screen;	if ((window->LY == (window->Num_lines - 1)) && (window->Num_lines > 1))	{		tmp1->next_screen = tmp->next_screen;		tmp->next_screen = tmp1;		tmp->next_screen->prev_screen = tmp;	}	else if (window->Num_lines > 1)	{		if (tmp->prev_screen != NULL)			tmp->prev_screen->next_screen = tmp1;		tmp1->prev_screen = tmp->prev_screen;		tmp->prev_screen = tmp1;		tmp1->next_screen = tmp;		tmp->scroll = DOWN;	}	if (window->LY == 0)		window->first_line = tmp1;	for (row = 0, tmp1 = window->first_line; 		row < window->Num_lines; row++)	{		window->line_array[row] = tmp1;		tmp1 = tmp1->next_screen;	}}void wdeleteln(window)	/* delete a line in the specified window */WINDOW *window;{	int row, column;	struct _line *tmp;	struct _line  *tmpline;	if (window->Num_lines > 1)	{		window->scroll_up += 1;		window->SCROLL_CLEAR = SCROLL;		column = window->LX;		row = window->LY;		for (row = 0, tmp = window->first_line; row < window->LY; row++)			tmp = tmp->next_screen;		if (window->LY == 0)			window->first_line = tmp->next_screen;		if (tmp->prev_screen != NULL)			tmp->prev_screen->next_screen = tmp->next_screen;		if (tmp->next_screen != NULL)		{			tmp->next_screen->scroll = UP;			tmp->next_screen->prev_screen = tmp->prev_screen;		}		tmpline = tmp;		clear_line(tmpline, 0, window->Num_cols);		tmpline->number = -1;		for (row = 0, tmp = window->first_line; tmp->next_screen != NULL; row++)		{			tmp = tmp->next_screen;		}		if (tmp != NULL)		{			tmp->next_screen = tmpline;			tmp->next_screen->prev_screen = tmp;			tmp = tmp->next_screen;		}		else			tmp = tmpline;		tmp->next_screen = NULL;		for (row = 0, tmp = window->first_line; row < window->Num_lines; row++)		{			window->line_array[row] = tmp;			tmp = tmp->next_screen;		}	}	else	{		clear_line(window->first_line, 0, window->Num_cols);	}}void wclrtobot(window)	/* delete from current position to end of the window */WINDOW *window;{	int row, column;	struct _line *tmp;	window->SCROLL_CLEAR |= CLEAR;	column = window->LX;	row = window->LY;	for (row = 0, tmp = window->first_line; row < window->LY; row++)		tmp = tmp->next_screen;	clear_line(tmp, column, window->Num_cols);	for (row = (window->LY + 1); row < window->Num_lines; row++)	{		tmp = tmp->next_screen;		clear_line(tmp, 0, window->Num_cols);	}	wmove(window, row, column);}void wstandout(window)	/* begin standout mode in window	*/WINDOW *window;{	window->Attrib |= A_STANDOUT;}void wstandend(window)	/* end standout mode in window	*/WINDOW *window;{	window->Attrib &= ~A_STANDOUT;}void waddstr(window, string)	/* write 'string' in window	*/WINDOW *window;char *string;{	char *wstring;	for (wstring = string; *wstring != (char) NULL; wstring++)		waddch(window, *wstring);}void clearok(window, flag)	/* erase screen and redraw at next refresh	*/WINDOW *window;int flag;{	Repaint_screen = TRUE;	clear_win = window;}void echo()			/* turn on echoing				*/{}void noecho()		/* turn off echoing				*/{}void raw()			/* set to read characters immediately		*/{}void noraw()			/* set to normal character read mode		*/{}void nl(){}void nonl(){}void saveterm(){}void fixterm(){}void resetterm(){}void nodelay(window, flag)WINDOW *window;int flag;{}void idlok(window, flag)WINDOW *window;int flag;{}void keypad(window, flag)WINDOW *window;int flag;{}void savetty()		/* save current tty stats			*/{}void resetty()		/* restore previous tty stats			*/{}void endwin()		/* end windows					*/{	keypad(stdscr, FALSE);	free(stdscr);	initialized = FALSE;}void delwin(window)		/* delete the window structure			*/WINDOW *window;{	int i;	for (i = 1; (i < window->Num_lines) && (window->first_line->next_screen != NULL); i++)	{		window->first_line = window->first_line->next_screen;		free(window->first_line->prev_screen->row);		free(window->first_line->prev_screen->attributes);		free(window->first_line->prev_screen);	}	if (window->first_line != NULL)	{		free(window->first_line->row);		free(window->first_line->attributes);		free(window->first_line);		free(window);	}}#ifndef __STDC__void wprintw(va_alist)va_dcl#else /* __STDC__ */void wprintw(WINDOW *window, const char *format, ...)#endif /* __STDC__ */{#ifndef __STDC__	WINDOW *window;	char *format;	va_list ap;#else	va_list ap;#endif	int value;	char *fpoint;	char *wtemp;#ifndef __STDC__	va_start(ap);	window = va_arg(ap, WINDOW *);	format = va_arg(ap, char *);#else /* __STDC__ */	va_start(ap, format);#endif /* __STDC__ */	fpoint = (char *) format;	while (*fpoint != (char) NULL)	{		if (*fpoint == '%')		{			fpoint++;			if (*fpoint == 'd')			{				value = va_arg(ap, int);				iout(window, value, 10);			}			else if (*fpoint == 'c')			{				value = va_arg(ap, int);				waddch(window, value);			}			else if (*fpoint == 's')			{				wtemp = va_arg(ap, char *);					waddstr(window, wtemp);			}			fpoint++;		}		else if (*fpoint == '\\')		{			fpoint++;			if (*fpoint == 'n')				waddch(window, '\n');			else if ((*fpoint >= '0') && (*fpoint <= '9'))			{

⌨️ 快捷键说明

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