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 + -
显示快捷键?