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

📄 keyboard.c

📁 基于microwindow的keyboard
💻 C
字号:
#define MWINCLUDECOLORS#include <nano-X.h>#include <sys/time.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "../common.h"#include "keyboard.h"extern int KbdWrite(int c);extern int KbdOpen(void);extern void KbdClose(void);struct timeval tv;struct timezone tz;static int old_asc_no;static long int time_us_new;static long int time_us_old;GR_IMAGE_ID loadimage(char *image_path){	GR_IMAGE_ID image_id;	if(!(image_id = GrLoadImageFromFile(image_path, 0))) 	{		fprintf(stderr, "Failed to load image file \"%s\"\n", image_path);		exit;	}	return image_id;}/****************************** init var *********************************/static void init(int ks_x,int ks_y,int k_w,int k_h){	flag_save=0;	flag_num=0;	flag_caps=0;	flag_c=0;	escpress=0;	curx=0,cury=0;	keyboard_input_sbuf[0]='\0';	keyboard_x=ks_x;	keyboard_y=ks_y;	keyboard_width=k_w;	keyboard_height=k_h;	BUTTON_WIDTH =  84.0/800*keyboard_width;	BUTTON_HEIGHT = 91.0/480*keyboard_height;	LED_WIDTH  = 113.0/800*keyboard_width;	LED_HEIGHT = 56.0/480*keyboard_height;	time_us_old=0;}/**************************** main program ****************************************/int main(int garc ,char **garv){	GR_EVENT	event;	//int fontsize=18;	//init(ks_x,ks_y,k_w,k_h);	init(8,312,784,280);	if (GrOpen() < 0) 	{		fprintf(stderr, "cannot open graphics\n");		exit(1);	}	if (KbdOpen() < 0)	{		fprintf(stderr, "nxkbd: cannot open kbd named pipe\n");	}	GR_CURSOR_ID  cursor1;	cursor1=GrNewCursor(32, 32, 16, 16,WINROOTCOLOR,WHITE, cursor8_bits, cursor9_bits);	GrSetWindowCursor(GR_ROOT_WINDOW_ID,cursor1);	/**************************** font infomation *************************************/	regFont=GrCreateFont("arial", 18, NULL);	regFont2=GrCreateFont("arial", 20, NULL);	GrSetFontAttr(regFont,GR_TFKERNING|GR_TFANTIALIAS,0);	GrSetFontAttr(regFont2,GR_TFKERNING|GR_TFANTIALIAS,0);		GrGetFontInfo(regFont, &fif);	char_count=550.0/800*keyboard_width/FONW;	wifi_keyboard_inputdisplay_gc = GrNewGC();	GrSetGCForeground(wifi_keyboard_inputdisplay_gc,GRAY);	GrSetGCUseBackground(wifi_keyboard_inputdisplay_gc,GR_FALSE);	GrSetGCFont(wifi_keyboard_inputdisplay_gc ,regFont2); 	/**************************** images infomation ***********************************/	keyboard_backimage = loadimage(IMAGEPATH"/keyboard.jpg");	key_down_image = loadimage(IMAGEPATH"/key_down.jpg");	key_up_image = loadimage(IMAGEPATH"/key_up.jpg");	led_image = loadimage(IMAGEPATH"/led.jpg");	GrGetImageInfo(keyboard_backimage, &iif_keyboard_backimage);	GrGetImageInfo(key_down_image, &iif_key_down_image);	GrGetImageInfo(key_up_image, &iif_key_up_image);	wifi_keyboard_wid = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE|GR_WM_PROPS_NOBACKGROUND,					  "keyboard",GR_ROOT_WINDOW_ID,keyboard_x,keyboard_y,keyboard_width,					  keyboard_height, GrGetSysColor(GR_COLOR_WINDOW));	pid_keyboard = GrNewPixmap(5*BUTTON_WIDTH, BUTTON_HEIGHT, NULL);    	keyboard_gc = GrNewGC();	keyboard_text_gc = GrNewGC(); 	pid_copy_gc = GrNewGC();	GrSetGCUseBackground(keyboard_gc,GR_FALSE);	GrSetGCForeground(keyboard_text_gc,GRAY);	GrSetGCUseBackground(keyboard_text_gc,GR_FALSE);	GrSetGCForeground(pid_copy_gc,WHITE);	GrSetGCFont(keyboard_text_gc ,regFont);	GrDrawImageToFit(pid_keyboard,pid_copy_gc,BUTTON_WIDTH,0,BUTTON_WIDTH,BUTTON_HEIGHT,			 key_down_image);	GrDrawImageToFit(pid_keyboard,pid_copy_gc,4*BUTTON_WIDTH,0,BUTTON_WIDTH,BUTTON_HEIGHT,			 key_up_image);	GrDrawImageToFit(pid_keyboard,pid_copy_gc,2*BUTTON_WIDTH,0,LED_WIDTH,			 LED_HEIGHT,led_image);	GrFreeImage(led_image);	GrFreeImage(key_up_image);	GrFreeImage(key_down_image);	GrSelectEvents(wifi_keyboard_wid, GR_EVENT_MASK_EXPOSURE			|GR_EVENT_MASK_BUTTON_UP					|GR_EVENT_MASK_BUTTON_DOWN					|GR_EVENT_MASK_KEY_DOWN					|GR_EVENT_MASK_CLOSE_REQ);	GrMapWindow(wifi_keyboard_wid);		while (1)	{		GrGetNextEvent(&event);		switch (event.type) 		{			case GR_EVENT_TYPE_EXPOSURE:				GrFlush();				do_exposure(&event.exposure);				break;							case GR_EVENT_TYPE_BUTTON_DOWN:			case GR_EVENT_TYPE_BUTTON_UP:				GrFlush();				do_button(&event.button);				break;							case GR_EVENT_TYPE_KEY_DOWN:				GrFlush();				do_key(event.keystroke.ch);				if(!flag_save)					break;							case GR_EVENT_TYPE_CLOSE_REQ:				GrDestroyCursor(cursor1);				GrDestroyFont(regFont);				GrDestroyFont(regFont2);				GrDestroyGC(keyboard_gc);				GrDestroyGC(keyboard_text_gc);				GrDestroyGC(pid_copy_gc);				GrDestroyGC(wifi_keyboard_inputdisplay_gc);				GrDestroyWindow(pid_keyboard);				GrDestroyWindow(wifi_keyboard_wid);				GrClose();				exit(0);				if(escpress!=1)				{					//strcpy(s,keyboard_input_sbuf);				}				return;		}	}	}static void do_exposure(GR_EVENT_EXPOSURE *ep){	if(ep->wid == wifi_keyboard_wid)	{		printf("keyboard exposure!!\n");		GrDrawImageToFit(wifi_keyboard_wid, keyboard_gc, 0, 0,keyboard_width,				 keyboard_height, keyboard_backimage);			GrCopyArea(wifi_keyboard_wid,pid_copy_gc,11.0/480*keyboard_height,			   12.0/480*keyboard_height,89.0/800*keyboard_width,			   17.0/480*keyboard_height,pid_keyboard,2*BUTTON_WIDTH,0,0);		GrCopyArea(wifi_keyboard_wid,pid_copy_gc,713.0/800*keyboard_width,			   13.0/480*keyboard_height,36.0/800*keyboard_width,29.0/480*keyboard_height,			   pid_keyboard,2*BUTTON_WIDTH,18.0/480*keyboard_height,0);					drawkey(10.0/800*keyboard_width,93.0/480*keyboard_height,4,1,0);		drawkey(120.0/800*keyboard_width,93.0/480*keyboard_height,28,7,4);		drawkey(706.0/800*keyboard_width,93.0/480*keyboard_height,4,1,32);		repaint();	}}static void drawkey(int x,int y,int count,int row_count,int k){	int i=0;	int row=0;	int px,py;	for(;i<count;i++)	{		if((i%row_count)==0&&i!=0)			row++;printf("eow=%d\n",row);		GrCopyArea(wifi_keyboard_wid,pid_copy_gc,x+(i-row_count*row)*BUTTON_WIDTH,			   y+row*BUTTON_HEIGHT,BUTTON_WIDTH,BUTTON_HEIGHT,			   pid_keyboard,4*BUTTON_WIDTH,0,0);		       			px=x+(i-row_count*row)*BUTTON_WIDTH-30.0/800*keyboard_width;//$$		py=y+row*BUTTON_HEIGHT-10.0/480*keyboard_height;//$$		GrText(wifi_keyboard_wid,keyboard_text_gc,px+BUTTON_WIDTH/2,py+BUTTON_HEIGHT/2,		       key[i+k].key_name,-1,GR_TFASCII);	}}static void do_button(GR_EVENT_BUTTON *bt){	int k=0;	int i=0,j=0;	if(bt->wid==wifi_keyboard_wid)	{		switch (bt->type)  		{ 			case GR_EVENT_TYPE_BUTTON_DOWN: 				if((k=read_key_position(bt))<0)					return;				printf("key\n");				printf("px=%d  py=%d\n",image_x,image_y);	    				GrCopyArea(pid_keyboard,pid_copy_gc,0,0,BUTTON_WIDTH,BUTTON_HEIGHT,					   wifi_keyboard_wid,image_x,image_y,0); 				GrCopyArea(wifi_keyboard_wid,pid_copy_gc,image_x,image_y,BUTTON_WIDTH,					   BUTTON_HEIGHT,pid_keyboard,BUTTON_WIDTH,0,0);	    				if(flag_num==1&&k>3&&k<32)//*$$					k=k+32;				if(flag_c==1&&k>3&&k<32)					k=k+47;				if(flag_caps==1&&k>3&&k<32)					k=k+75;	    				GrText(wifi_keyboard_wid,keyboard_text_gc,				       image_x+BUTTON_WIDTH/2-30.0/800*keyboard_width,				       image_y+BUTTON_HEIGHT/2-10.0/480*keyboard_height,				       key[k].key_name,-1,GR_TFASCII);				GrGetNextEvent(bt);				GrCopyArea(wifi_keyboard_wid,pid_copy_gc,image_x,image_y,BUTTON_WIDTH,					   BUTTON_HEIGHT,pid_keyboard,0,0,0);				ButtonNOToASC(k);				if(flag_save) 					return;//$$				break; 					case GR_EVENT_TYPE_BUTTON_UP: 				break;		} 	}}static int read_key_position(GR_EVENT_BUTTON *bt){	int px=10.0/800*keyboard_width;	int py=93.0/480*keyboard_height;	int k=0;	int key_no=0;	int row_x=0,row_y=0;    	/************************save_button down***************************************/	if((bt->x>705.0/800*keyboard_width&&bt->x<760.0/800*keyboard_width)&&		   (bt->y>7.0/480*keyboard_height&&bt->y<46.0/480*keyboard_height))	{		flag_save=1;		return -1;	}	/************************************ ss *************************************/	if(bt->x<px||((bt->x>px+BUTTON_WIDTH)&&(bt->x<120.0/800*keyboard_width))||		  (bt->x>(120.0/800*keyboard_width+8*BUTTON_WIDTH)))		return -1;	if(bt->y<py||bt->y>(py+4*BUTTON_HEIGHT))		return -1;	for(k=0;;k++)	{		if(bt->x<=px+BUTTON_WIDTH)			break;		if(k==0)			px=px+26.0/800*keyboard_width;			if(bt->x>px+BUTTON_WIDTH)		{			px=px+BUTTON_WIDTH;			row_x++;		}	}	for(k=0;;k++)	{		if(bt->y<=py+BUTTON_HEIGHT)			break;		else		{			py=py+BUTTON_HEIGHT;			row_y++;		}	}	image_x=px;	image_y=py;	if(row_x==0)		key_no=row_y;	if(row_x>0&&row_x<8)		key_no=3+row_y*7+row_x;	if(row_x==8)		key_no=32+row_y;    	if(flag_num==1&&key_no>18&&key_no<32)		return -1;	if(flag_c==1&&key_no>31&&key_no<32)		return -1;	if(flag_caps==1&&key_no>29&&key_no<32)		return -1;	return (key_no);}static void ButtonNOToASC(int k){	gettimeofday(&tv,&tz);	time_us_new=(tv.tv_sec%100)*1000000+tv.tv_usec;	if(old_asc_no==key[k].asc_no&&time_us_new-time_us_old<200000)//du p>500ms		return;	time_us_old=time_us_new;	old_asc_no=key[k].asc_no;	KbdWrite(old_asc_no);	return;}static void do_key(int k){	int i=0;	printf("<><><><<k=%d\n",k);	switch(k)	{		case 27:			flag_save=-1;			escpress=1;			return;	    		case 128:			if (flag_num==0)			{				flag_num=1;				flag_c=0;				flag_caps=0;				flag_chang(1);			}			else			{				flag_num=0;				flag_chang(0);			}			break;	    		case 129:			if (flag_c==0)			{				flag_c=1;				flag_num=0;				flag_caps=0;				flag_chang(2);			}			else			{				flag_c=0;				flag_chang(0);			}			break;	    		case 130:			if (flag_caps==0)			{				flag_caps=1;				flag_num=0;				flag_c=0;				flag_chang(3);			}			else			{				flag_caps=0;				flag_chang(0);			}			break;		case 8:			printf("backspace\n");			if(curx>0)			{						curx--;				keyboard_input_sbuf[curx]='\0';				printf("%s\n",keyboard_input_sbuf);				repaint();			}			//KbdWrite(k);			break;		case 13:			//flag_save=-1;			//return;			//KbdWrite(k);			break;		default:			if(curx<50)//(char_count*keyboard_width/800-1)			{				keyboard_input_sbuf[curx++]=k;				keyboard_input_sbuf[curx]='\0';			}			else			{				keyboard_input_sbuf[curx-1] = k;			}			repaint();	}}static void flag_chang(int k){	int pid_led_x=2*BUTTON_WIDTH+90.0/800*keyboard_width;	int pid_led_y=0;	int wid_led_x=(16.0+(k-1)*30)/800*keyboard_width;	int wid_led_y=18.0/480*keyboard_height;	int led_width=15.0/800*keyboard_width;	int led_height=7.0/480*keyboard_height;	GrFillRect(wifi_keyboard_wid,pid_copy_gc,120.0/800*keyboard_width,		   93.0/480*keyboard_height,7*BUTTON_WIDTH,4*BUTTON_HEIGHT);//clear keyboard	GrCopyArea(wifi_keyboard_wid,pid_copy_gc,11.0/480*keyboard_height,		   12.0/480*keyboard_height,89.0/800*keyboard_width,		   17.0/480*keyboard_height,pid_keyboard,2*BUTTON_WIDTH,0,0);	if(k==0)	{		drawkey(120.0/800*keyboard_width,93.0/480*keyboard_height,28,7,4);		return;	}	GrCopyArea(wifi_keyboard_wid,pid_copy_gc,wid_led_x,wid_led_y,led_width,led_height,		   pid_keyboard,pid_led_x,pid_led_y,0);//draw flag	switch(k)	{		case 1:			drawkey(120.0/800*keyboard_width,93.0/480*keyboard_height,15,7,36);//draw numborde			break;		case 2:			drawkey(120.0/800*keyboard_width,93.0/480*keyboard_height,28,7,51);//draw signborde			break;		case 3:			drawkey(120.0/800*keyboard_width,93.0/480*keyboard_height,26,7,79);			break;	}}static void repaint(){	GrFillRect(wifi_keyboard_wid,pid_copy_gc,138.0/800*keyboard_width,17.0/480*keyboard_height,		   543.0/800*keyboard_width,40.0/480*keyboard_height);	GrText(wifi_keyboard_wid,wifi_keyboard_inputdisplay_gc,	       140.0/800*keyboard_width,45.0/480*keyboard_height,	       keyboard_input_sbuf,-1,GR_TFASCII);}

⌨️ 快捷键说明

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