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

📄 mginit.c

📁 这是一个MINITGUI2。0的应用程序
💻 C
字号:
/* ** $Id: mginit.c,v 1.20 2006/06/12 06:40:35 weiym Exp $**** Listing 31.1**** mginit.c: Sample program for MiniGUI Programming Guide**      A simple mginit program.**** Copyright (C) 2003 ~ 2006 Feynman Software.**** License: GPL*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <signal.h>#include <time.h>#include <sys/types.h>#include <sys/wait.h>#include <sys/ipc.h>#include <sys/msg.h>#include <minigui/common.h>#include <minigui/minigui.h>#include <minigui/gdi.h>#include <minigui/window.h>#include "tryttys1.c"static BOOL quit = FALSE;static void on_new_del_client (int op, int cli){           	static int nr_clients = 0;    	if (op == LCO_NEW_CLIENT) {        	nr_clients ++;    	}       	else if (op == LCO_DEL_CLIENT) {        	nr_clients --;        	if (nr_clients == 0) {            		printf ("There is no any client, I will quit.\n");            		quit = TRUE;        	}                       	else if (nr_clients < 0) {            	printf ("Serious error: nr_clients less than zero.\n");             	}    	}    	else        	printf ("Serious error: incorrect operations.\n");}static pid_t exec_app (const char* file_name, const char* app_name){    	pid_t pid = 0;    	if ((pid = vfork ()) > 0) {        	fprintf (stderr, "new child, pid: %d.\n", pid);    	}    	else if (pid == 0) {        	execl (file_name, app_name, NULL);        	perror ("execl");        	_exit (1);    	}    	else {        	perror ("vfork");    	}    	return pid;}static unsigned int old_tick_count;static pid_t pid_scrnsaver = 0;//这个钩子没有什么用但是现在不想删除它,static int my_event_hook (PMSG msg){    	old_tick_count = GetTickCount ();    	if (pid_scrnsaver) {        	kill (pid_scrnsaver, SIGINT);        	ShowCursor (TRUE);        	pid_scrnsaver = 0;    	}    	if (msg->message == MSG_KEYDOWN) {        	switch (msg->wParam) {            	case SCANCODE_F1:               		exec_app ("./edit", "edit");               	break;            	case SCANCODE_F2:               		exec_app ("./timeeditor", "timeeditor");               	break;            	case SCANCODE_F3:               		exec_app ("./propsheet", "propsheet");               	break;            	case SCANCODE_F4:               		exec_app ("./bmpbkgnd", "bmpbkgnd");               	break;		}    	}    	return HOOK_GOON;}static int ttys_pipe[2];//扫描枪进程与主进程之间管道的管道号static char c[15];   //主进程从扫描枪中得到的数据存到这里static void child_wait (int sig){    	int pid;    	int status;    	while ((pid = waitpid (-1, &status, WNOHANG)) > 0) {        	if (WIFEXITED (status))            		printf ("--pid=%d--status=%x--rc=%d---\n", pid, status, WEXITSTATUS(status));        	else if (WIFSIGNALED(status))            		printf ("--pid=%d--signal=%d--\n", pid, WTERMSIG (status));    	}} static void mes_wait (int sig){	//这个信号什么也没有干,它的数据没有跟主进程共享,	//留着以后用吧。}/*--------------------------------------------------------*///打开一个进程,用来检测扫描枪的数据输入,发数据通过管道发送到主进程/*监听串口,有数据发送相关信号*/static pid_t listenttys(void){	pid_t pid = 0;	if ((pid = fork ()) > 0) {        	fprintf (stderr, "new child, pid: %d.\n", pid);    	}    	else if (pid == 0) {   //进入扫描枪监听进程		int ttys1_fb;		int ret,res;		char buf[15];	//	int fb;//real_wnum;		struct sigaction siga_mes;	//	unsigned int num = 0;		fd_set rds;		siga_mes.sa_handler = mes_wait;    		siga_mes.sa_flags  = 0;    		memset (&siga_mes.sa_mask, 0, sizeof(sigset_t));    		sigaction (SIGUSR1, &siga_mes, NULL);		ttys1_fb = initttyS1();                //完成串口的初始化						while(1){				//开始监听数据了,			FD_ZERO(&rds);			FD_SET(ttys1_fb, &rds);			ret = select(ttys1_fb + 1, &rds, NULL, NULL, NULL);			if (ret < 0) {                           //这个接受有些问题,扫描枪把数据通过4次发送,				perror("select");		//所以这里的阻塞在读入一个条码的时候,会不冲开				exit(1);			//4次,幸好linux系统很健壮,呵呵			}					if (ret == 0) { 				printf("Timeout.\n");			}			else if (FD_ISSET(ttys1_fb, &rds)) {           				res = read(ttys1_fb,buf,15);				buf[res] = 0;				if(write(ttys_pipe[1],buf,15) < 0){					printf("ttys write err\n");				}				else{					//printf("ttys write okok \n");				}				raise(SIGUSR1);               //这个信号什么也没有干,它的数据没有跟主进程共享,			}					//留着以后用吧。	     	}        	_exit (1);    	}    	else {        	perror ("fork");    	}	return pid;	}/*------------------------------------------------------*/// 一个简单的码制转换函数,将输入的数制转换成minigui可以识别的按键码/*------------------------------------------------------*/static int pers(int x){	int data[10] = {82,79,80,81,75,76,77,71,72,73};	return data[x-48];	} int MiniGUIMain (int args, const char* arg[]){		int fb;	MSG msg;    	struct sigaction siga;	siga.sa_handler = child_wait;    	siga.sa_flags  = 0;    	memset (&siga.sa_mask, 0, sizeof(sigset_t));    	sigaction (SIGCHLD, &siga, NULL);    	OnNewDelClient = on_new_del_client;    	if (!ServerStartup (0 , 0 , 0)) {        	fprintf (stderr, "Can not start the server of MiniGUI-Processes: mginit.\n");        return 1;    	}    	SetServerEventHook (my_event_hook);    	if (args > 1) {        	if (exec_app (arg[1], arg[1]) == 0)            	return 3;    	}    	else {        	if (exec_app ("./helloword", "helloworld") == 0)            	return 3;    	}    	old_tick_count = GetTickCount ();	if(pipe(ttys_pipe) == -1){                   //打开扫描枪的与主进程的管道,主进程只是接受数据,扫面枪		printf("open pipe error\n");		//监听程序只是发送。		return -1;	}	listenttys();  //打开串口监听进程	while (!quit && GetMessage (&msg, HWND_DESKTOP)) {		int len;				if(len = read(ttys_pipe[0],&c,15) < 0){  //从扫描枪监听程序的管道中接受数据,如果管道中没有数据							//将返回小于0 的数,程序将什么也不读取,幸运			//printf("read err\n");		}		else{			for(len = 0;len < 4;len ++){				printf (" %d",c[len]);				if ((c[len]!=10) && (c[len]!=0)){					printf(".");					SendMessage(HWND_DESKTOP, MSG_KEYDOWN, pers(c[len]), 131200);				}			}		}		TranslateMessage(&msg);		DispatchMessage (&msg);    	}    return 0;}

⌨️ 快捷键说明

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