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