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

📄 menu.c

📁 UNIX 界面程序
💻 C
字号:
#include <stdio.h>
#include <signal.h>
#include "menu.h"
#include "mytools.h"
#include "def_menu.h"
#include "color.h"

extern	G_maxy, G_maxx, G_begy, G_begx;

extern char loper[3];
extern int sql_run(), misc_audit();

extern	int	G_start_menu_no;

void killed();

WINDOW	*pHeaderWin;
WINDOW	*pTailWin;
WINDOW	*pMenuWin;

InitMenuDisp()
{
	int	i;

	/* 菜单显示在标准窗口上 */
	pMenuWin = stdscr;
	pHeaderWin = stdscr;
	pTailWin = stdscr;
	DispFrame(pMenuWin);

}

DealMenu(iStartMenuNo, pMenuFp)
int	iStartMenuNo;
FILE	*pMenuFp;
{
	int iRet, i, iMenu0, iMenu1 , iMenuItemQue, iLocateItem;
	int	iFMenuNo, iFLocateItem;
	WINDOW	*pWin;
	char	cFuncError = 0;
	char	sTmpBuf[128];

	InitMenuDisp();

	/*
	 * 菜单均显示在指定窗口区域内
	 */
	pWin = pMenuWin;
	touchwin( pWin );
	wrefresh( pWin );

	GetWinParam( pWin );

	for ( i = 0; i < iMenuCount; i++ ) {
		iRet = 0;
		while ( 1 ) {
			iLocateItem = SMenu[i].iMenuItemSet[iRet];
			if ( iLocateItem == -1 ) {
				iRet = -1;
				break;
			}
			if ( SMenuItem[iLocateItem].iPower ) break;
			iRet++;
		}
		SMenuActiveStatus[i].iItem = iRet;

		SMenu[i].iLocateY = SMenu[i].iLocateY - G_begy;
		SMenu[i].iLocateX = SMenu[i].iLocateX - G_begx;
	}
	G_start_menu_no = iStartMenuNo;
	iMenu0 = iStartMenuNo;
	SMenuActiveStatus[iMenu0].iFatherMenu = -1;
	iLocateItem = SMenuActiveStatus[iMenu0].iItem;
	while (1) {
		iRet = DispMenu( pWin, iMenu0, &iLocateItem, pMenuFp);
		if ( iRet == ERR_MENU ) 
			break;
		if ( iRet == CLOSE ) {
			i = 0;
			while (1) {
				iLocateItem = SMenu[iMenu0].iMenuItemSet[i];
				if (iLocateItem == -1) {
					i = -1;
					break;
				}
				if (SMenuItem[iLocateItem].iPower) break;
				i++;
			}
			SMenuActiveStatus[iMenu0].iItem = i;
			iMenu0 = SMenuActiveStatus[iMenu0].iFatherMenu;
			iLocateItem = SMenuActiveStatus[iMenu0].iItem ;

			if (iMenu0 == 0)
				continue;

			/* 解决菜单重叠显示恢复问题 */
			iFMenuNo = SMenuActiveStatus[iMenu0].iFatherMenu;
			iFLocateItem = SMenuActiveStatus[iFMenuNo].iItem ;
			RedrawMenu(pWin, iFMenuNo, &iFLocateItem, pMenuFp);
			continue;
		}
		if ( iRet == OPEN_RIGHT ) {
			SMenuActiveStatus[iMenu0].iItem = iLocateItem;
			iMenu0 = SMenuActiveStatus[iMenu0].iFatherMenu;
			iLocateItem = SMenuActiveStatus[iMenu0].iItem ;
			while (1) {
			    iLocateItem++;
			    if (SMenu[iMenu0].iMenuItemSet[iLocateItem] == -1)
				iLocateItem = 0;
			    i = SMenu[iMenu0].iMenuItemSet[iLocateItem];
			    if (SMenuItem[i].iPower) break;
			}
			DispMenuItem0( pWin, iMenu0, iLocateItem );
		} else if ( iRet == OPEN_LEFT ) {
			SMenuActiveStatus[iMenu0].iItem = iLocateItem;
			iMenu0 = SMenuActiveStatus[iMenu0].iFatherMenu;
			iLocateItem = SMenuActiveStatus[iMenu0].iItem ;
			while (1) {
			  if (iLocateItem == 0)
			    while
			      (SMenu[iMenu0].iMenuItemSet[iLocateItem + 1] != -1)
				iLocateItem++;
			  else
			    iLocateItem--;
			  i = SMenu[iMenu0].iMenuItemSet[iLocateItem];
			  if (SMenuItem[i].iPower) break;
			}
			DispMenuItem0( pWin, iMenu0, iLocateItem );
		}
		iMenuItemQue = SMenu[iMenu0].iMenuItemSet[iLocateItem];
		cFuncError = 0;
		/*
		 * 调用指针函数, 菜单项操作前的预处理
		 */
		if ( SMenuItem[iMenuItemQue].preprog) {
			if (SMenuItem[iMenuItemQue].preprog(iMenuItemQue) < 0) {
				cFuncError = 1;
			}
		}

		if (cFuncError == 0) {
			/*
			 * 激活菜单项操作
			 */
			if (SMenuItem[iMenuItemQue].cProcType == 'F') {
				/*
				 * 调用系统预设函数
				 */
				if ( SMenuItem[iMenuItemQue].mproc) {
					if (SMenuItem[iMenuItemQue].mproc(iMenuItemQue))
						cFuncError = 1;
					else
						misc_audit( SMenuItem[iMenuItemQue].sName, NULL, 0, 0 );
				}
			} else if (SMenuItem[iMenuItemQue].cProcType == 'X') {
				/*
			 	 * 执行shell程序
				 */
				if ( SMenuItem[iMenuItemQue].sShell[0] != '\0') {
					if (ExecuteShell(iMenuItemQue, SMenuItem[iMenuItemQue].sShell, SMenuItem[iMenuItemQue].sParam ) ) 
						cFuncError = 1;
					else{
						/*
						memset( sTmpBuf, 0, 128 );
						sprintf(sTmpBuf, "%s %s", SMenuItem[iMenuItemQue].sShell, SMenuItem[iMenuItemQue].sParam );
						*/
						misc_audit( SMenuItem[iMenuItemQue].sName, NULL, 0, 0 );
					}
				}
			} else {
				/*
				 * 调用系统预设函数, cProcType == 'M' "disp_table_screen"
				 */
				if ( SMenuItem[iMenuItemQue].mproc) {
					if (SMenuItem[iMenuItemQue].mproc(iMenuItemQue) < 0)
						cFuncError = 1;
				}
			}
		}
		switch ( SMenuItem[iMenuItemQue].cProcType ) {
		    case 'E':  /* 返回上级菜单 */
			i = 0;
			while (1) {
			    iLocateItem = SMenu[iMenu0].iMenuItemSet[i];
			    if (iLocateItem == -1) {
				i = -1;
				break;
			    }
			    if (SMenuItem[iLocateItem].iPower) break;
			    i++;
			}
			SMenuActiveStatus[iMenu0].iItem = i;
			iMenu0 = SMenuActiveStatus[iMenu0].iFatherMenu;
			iLocateItem = SMenuActiveStatus[iMenu0].iItem ;
			touchwin(pWin);
			wrefresh(pWin);
			break;
		    case 'F':   /* 无下级菜单 */
			break;
		    case 'M':   /* 下级菜单 */
			if (cFuncError == 1)
				break;
			SMenuActiveStatus[iMenu0].iItem = iLocateItem;
			iMenu1 = SMenuItem[iMenuItemQue].iChildMenu;
			SMenuActiveStatus[iMenu1].iFatherMenu = iMenu0;
			iLocateItem = SMenuActiveStatus[iMenu1].iItem;
			iMenu0 = iMenu1;       /* iMenu1 为新的菜单号 */
			break;
		    default:  /*  */
			break;
		}

		if ( iMenuItemQue == 0 ) 
			break; /* 选择项 0 退出 */
	}
	return cFuncError;
}

int	ExecuteShell(iItem, pCmd, pParam )
int	iItem;
char	*pCmd;
char	*pParam;
{
	char sFileName[128];
	char sCommandBuf[1024];
	struct	termio stdin_term;
	struct	termio stdout_term;
	int		iRet;

	db_close();

	ioctl(0, TCGETA, &stdin_term);
	ioctl(1, TCGETA, &stdout_term);

	system("clear;stty sane");

	signal(SIGINT, SIG_DFL);

	sprintf(sFileName, "/tmp/.shell.%d", getpid());
	scr_dump(sFileName);

	sprintf(sCommandBuf, "%s %s", pCmd, pParam ); 
	iRet = system( sCommandBuf );
	if ( iRet < 0 ){
		errcall( ERROR, "execute [%s] fail !!!", sCommandBuf );
	}

	signal(SIGINT, SIG_IGN);

	ioctl(0, TCSETAW, &stdin_term);
	ioctl(1, TCSETAW, &stdout_term);

	if (db_open() == -1) {
		printf("Error Open Database!\n");
		exit(-1);
	}

	scr_restore(sFileName);
	unlink(sFileName);
	touchwin(curscr);
	wrefresh(curscr);
	if ( iRet < 0 ) return( -1 );
	return(0);
}

/*
 * 在屏幕处理中执行一个系统Shell命令(与屏幕及数据库无关)
 */
int	ExecuteCommand(pCmd)
char	*pCmd;
{
#define	SHELL_LOG	"/tmp/shell.log"
	char	sFileName[128];
	char	sCommand[128];
	FILE	*fp;

	sprintf(sFileName, "/tmp/.shell.%d", getpid());
	if ((fp = fopen(sFileName, "w+")) == NULL)
		return(-1);
	fprintf(fp, "echo\n");
	fprintf(fp, "echo \"Start %s at  `date`\"\n", pCmd);
	fprintf(fp, "%s\n", pCmd);
	fprintf(fp, "echo \"End %s at  `date`\"\n", pCmd);
	fprintf(fp, "echo\n");
	fclose(fp);

	sprintf(sCommand, "sh %s > %s 2>&1", sFileName, SHELL_LOG);
	if (system(sCommand)) {
		unlink(sFileName);
		return(-1);
	}

	unlink(sFileName);
	return(0);
}

⌨️ 快捷键说明

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