📄 mginit.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 + -