ulib.c
来自「一份介绍在S3C2410上液晶屏驱动程序的实现」· C语言 代码 · 共 778 行 · 第 1/2 页
C
778 行
XSetForeground(gDisp,ctl->gc,(state==STATE_ON?fg:bg)); XDrawLine(gDisp,ctl->win,ctl->gc,x+2,y+2,x+w-3,y+h-3); XDrawLine(gDisp,ctl->win,ctl->gc,x+w-3,y+2,x+2,y+h-3); XSetForeground(gDisp,ctl->gc,fg); x = r.x + W_RADIO + 5; y = r.y + W_RADIO - A_RADIO; XDrawString(gDisp,ctl->win,ctl->gc,x,y,ctl->s,strlen(ctl->s));}static void draw_stext(uControlPtr ctl){uRect r;int x,y,w,h;static uColor fg,bg,mg;static BOOL first = true; if( first ) { fg = BlackPixel(gDisp,0); mg = WhitePixel(gDisp,0); bg = get_color(0xe000,0xe000,0xe000); first = false; } r = ctl->r;#ifdef USE_CHILD_WIN r.x = 0; r.y = 0;#else x = r.x; y = r.y;#endif XSetForeground(gDisp,ctl->gc,fg); w = get_text_width(ctl,ctl->s); h = get_char_height(ctl,'A'); switch( ctl->state ) { case STATE_LEFT: x = r.x; break; case STATE_CENTOR: x = r.x + (r.width/2) - (w/2); break; case STATE_RIGHT: x = r.x + r.width - w; break; } y = r.y + (r.height/2) + (h/2); XDrawString(gDisp,ctl->win,ctl->gc,x,y,ctl->s,strlen(ctl->s));}static void draw_line(uControlPtr ctl){uRect r;int x,y,w,h;static uColor fg,bg,mg;static BOOL first = true; if( first ) { fg = BlackPixel(gDisp,0); mg = WhitePixel(gDisp,0); bg = get_color(0xe000,0xe000,0xe000); first = false; } r = ctl->r;#ifdef USE_CHILD_WIN r.x = 0; r.y = 0;#else x = r.x; y = r.y;#endif XSetForeground(gDisp,ctl->gc,fg); XDrawLine(gDisp,ctl->win,ctl->gc,x,y,x+r.width,y+r.height);}/* * */int ctl_mouse_on(uControlPtr ctl[],int num,XEvent *ev){int i; for( i=0 ; i < num ; i++ ) { switch( ctl[i]->ctl_type ) { case PT_BUTTON: if( pt_in_rect(&ctl[i]->r,ev->xbutton.x,ev->xbutton.y) ) { ctl[i]->state = STATE_ON; draw_button(ctl[i],ctl[i]->state); return(i); } break; case PT_GBUTTON: case PT_RADIO: if( pt_in_rect(&ctl[i]->r,ev->xbutton.x,ev->xbutton.y) ) { if( ctl[i]->state == STATE_ON && ctl[i]->group > 0 ) return(-1); ctl[i]->state = ctl[i]->state == STATE_ON ? STATE_OFF : STATE_ON; if( ctl[i]->ctl_type == PT_RADIO ) draw_radio(ctl[i],ctl[i]->state); else draw_button(ctl[i],ctl[i]->state); if( ctl[i]->group > 0 ) same_group_off(ctl,num,ev,ctl[i]->group); return(i); } break; case PT_CKBOX: if( pt_in_rect(&ctl[i]->r,ev->xbutton.x,ev->xbutton.y) ) { ctl[i]->state = ctl[i]->state == STATE_ON ? STATE_OFF : STATE_ON; draw_ckbox(ctl[i],ctl[i]->state); return(i); } break; } } return(-1);}static void same_group_off(uControlPtr ctl[],int num,XEvent *ev,int group){int i; for( i=0 ; i < num ; i++ ) { switch( ctl[i]->ctl_type ) { case PT_GBUTTON: case PT_RADIO: if( ctl[i]->group == group && !pt_in_rect(&ctl[i]->r,ev->xbutton.x,ev->xbutton.y) ) { ctl[i]->state = STATE_OFF; if( ctl[i]->ctl_type == PT_RADIO ) draw_radio(ctl[i],ctl[i]->state); else draw_button(ctl[i],ctl[i]->state); } break; } }}int ctl_mouse_off(uControlPtr ctl[],int num,XEvent *ev){int i; for( i=0 ; i < num ; i++ ) { switch( ctl[i]->ctl_type ) { case PT_BUTTON: if( ctl[i]->state == STATE_ON ) { ctl[i]->state = STATE_OFF; draw_button(ctl[i],ctl[i]->state); if( pt_in_rect(&ctl[i]->r,ev->xbutton.x,ev->xbutton.y) ) return(i); } break; } } return(-1);}int set_radio_group_state(uControlPtr ctl[],int pt,int num){int i,g; g = ctl[pt]->group; ctl[pt]->state = STATE_ON;; for( i=0 ; i < num ; i++ ) { if( i == pt ) continue; switch( ctl[i]->ctl_type ) { case PT_GBUTTON: case PT_RADIO: if( ctl[i]->group == g ) ctl[i]->state = STATE_OFF; break; } } return(0);}int find_radio_group_on(uControlPtr ctl[],int num,int group){int i; for( i=0 ; i < num ; i++ ) { switch( ctl[i]->ctl_type ) { case PT_GBUTTON: case PT_RADIO: if( ctl[i]->group == group && ctl[i]->state == STATE_ON ) return(i); break; } } return(-1);}int draw_control(uControlPtr ctl[],int num){int i; for( i=0 ; i < num && ctl[i] ; i++ ) { switch( ctl[i]->ctl_type ) { case PT_BUTTON: draw_button(ctl[i],ctl[i]->state); break; case PT_GBUTTON: draw_button(ctl[i],ctl[i]->state); break; case PT_RADIO: draw_radio(ctl[i],ctl[i]->state); break; case PT_CKBOX: draw_ckbox(ctl[i],ctl[i]->state); break; case PT_STEXT: draw_stext(ctl[i]); break; case PT_LINE: draw_line(ctl[i]); break; } } return(0);}/*************************************************************************** * */int msgbox(char *title,char *msg,int type){uWindowPtr win;uControlPtr ctl[3];XEvent ev;uRect r;uColor fgcolor,bgcolor;int x,y,w,h,msg_y;int end,i,res,ctlnum; get_display_rect(&r); fgcolor = BlackPixel(gDisp,0); //bgcolor = WhitePixel(gDisp,0); bgcolor = get_color(0xe000,0xe000,0xe000); w = r.width; h = r.height; x = r.x + (w / 2) - 150; w = 300; y = r.y + (h / 5); h = 100; msg_y = 30; set_rect(&r,x,y,w,h); win = new_window(&r,title,fgcolor,bgcolor,false); XMoveWindow(gDisp,win->win,x,y); switch( type ) { case MB_OKCANCEL: set_rect(&r,(w-100-100)/2,msg_y+30,100,20); ctl[0] = new_control(win,PT_BUTTON,"OK",&r,false,0); set_rect(&r,(w-100-100)/2+110,msg_y+30,100,20); ctl[1] = new_control(win,PT_BUTTON,"Cancel",&r,false,0); ctl[2] = NULL; ctlnum = 2; break; case MB_OK: set_rect(&r,(w/2)-(100/2),msg_y+30,100,20); ctl[0] = new_control(win,PT_BUTTON,"OK",&r,false,0); ctl[1] = NULL; ctlnum = 1; break; } XFlush(gDisp); //XWarpPointer(gDisp,None,win->win,0,0,0,0,(w/2),(h/2)); XSelectInput(gDisp,win->win,NormalMask); XFlush(gDisp); for( res=0,end=false,ev.type=Expose ; !end ; ) { if( ev.type == Expose ) { draw_control(ctl,ctlnum); get_win_rect(&r,win); w = get_text_width(win,msg); x = (r.width/2) - (w/2); XDrawString(gDisp,win->win,win->gc,x,msg_y,msg,strlen(msg)); } XNextEvent(gDisp,&ev); switch( ev.type ) { case ButtonPress: ctl_mouse_on(ctl,ctlnum,&ev); break; case ButtonRelease: if( (i=ctl_mouse_off(ctl,ctlnum,&ev)) == 0 ) // OK end = true; else if( i == 1 ) // Cancel end = true; break; case Expose: /* = window draw */ break; case ClientMessage: if( ev.xclient.message_type == win->a1 && ev.xclient.data.l[0] == win->a2 ) end = true; break; case DestroyNotify: end = true; break; } } destroy_window(win); XFlush(gDisp); return(res);}int kbhit(){ return( io_rdy(fileno(stdin)) );}int io_rdy(int path){fd_set rfds;struct timeval tv;int ret; /* stdin (fd 0) を雌浑し、掐蜗があった眷圭に山绩する。*/ FD_ZERO(&rfds); FD_SET(path, &rfds); tv.tv_sec = 0; tv.tv_usec = 10*1000; ret = select(path+1, &rfds, NULL, NULL, &tv); return( ret <= 0 ? false : true );}int find_ps(char *str){char *av[3];int i,len,pid;int pfd;char c,s[256]; av[0] = "ps"; av[1] = "-A"; av[2] = 0; if( (pfd = do_exec(av,&pid)) < 0 ) return(false); for( i=0,len=0 ; ; ) { if( read(pfd,&c,1) <= 0 ) { close(pfd); return(false); } switch( c ) { case 0x0a: if( len > 0 ) { i++; if( find_str(str,s) ) return(true); } len = 0; s[len] = 0; break; case 0x0d: len = 0; s[len] = 0; break; default: if( len >= (256-10) ) break; s[len++] = c; s[len] = 0; break; } }}int find_str(char *str,char *s){int i; for( ; *s ; s++ ) { for( i=0 ; str[i] ; i++ ) { if( str[i] != s[i] ) break; } if( str[i] == 0 ) return(true); } return(false);}int do_exec(char *av[],int *pid){int pfd[2]; if( pipe(pfd) < 0 ) return(-1); if( (*pid = fork()) < 0 ) return(-1); if( *pid > 0 ) { close(pfd[1]); return(pfd[0]); } close(1); dup(pfd[1]); close(2); dup(pfd[1]); close(pfd[0]); close(pfd[1]); execvp(av[0],av); perror(av[0]); exit(1);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?