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

📄 vk.c

📁 LINUX X11 16 key 中文简单输入源代码
💻 C
字号:
#include "ui.h"
#include "vk.h"
#include "all.h"
#include "py.h"

int 		iClear = 0;
int 		iNum_VK = VK_NUM;
int	   	iCur_VK = 2;
int		iCur_PYW= 0;
int		iCur_PYS= 0;
int 		iCur_ZHW= 0;
int		iCur_PUTS= 0;
int		iCur_SCW= 0;
char		Cur_py_win[PY_WIN_NUM][STR_SIZE];
char 		Cur_zh_buf[PY_NUM][ZH_NUM][STR_SIZE];
char		Cur_put_win[PUT_WIN_NUM][STR_SIZE];
extern char 		Cur_input_buf[STR_SIZE];
extern char 		Cur_py_buf[PY_NUM][STR_SIZE];
extern int		iCur_X;
extern int		iCur_Y;
extern int		iPrev_X;
extern int		iPrev_Y;
extern pid_t           VK_ID;
extern XftFont         *ListWinFont;
extern XftFont         *VKLabelFont;
extern XftFont         *PYListWinFont;
extern XftFont         *ZHListWinFont;

VKS     vks[] = {
                {{"Abc"}, {{"","abcABC","defDEF",""},{"ghiGHI","jklJKL","nmoNMO",""},
				{"pqrsPQRS","tuvTUV","wxyzWXYZ",""},{"*"," ","",""}}},
                {{"123"}, {{"1","2","3",""},{"4","5","6",""},{"7","8","9",""},{"*","0 ","",""}}},
                {{"简体"}, {{"1","2","3",""},{"4","5","6",""},{"7","8","9",""},{""," ","",""}}},
		  {{"繁体"}, {{"1","2","3",""},{"4","5","6",""},{"7","8","9",""},{""," ","",""}}}
                };
char    *vk_sc[4]= {"`~!@#$%^","&*()-=\\|","+_][';/.",",{}:\">?<"};

int check_strarr_len(int max_len, char buf[][STR_SIZE])
{
	int i=0;
	for(;buf[i][0]!='\0';i++);
	if (i >= max_len)
		i=max_len;
	return i;
}

void clear_py_zh(void)
{
	iCur_PYS = 0;
        iCur_PYW = 0;
        iCur_ZHW=0;
        bzero(Cur_input_buf,sizeof(Cur_input_buf));
        bzero(Cur_py_buf,sizeof(Cur_py_buf));
        bzero(Cur_zh_buf,sizeof(Cur_zh_buf));
        bzero(Cur_py_win,sizeof(Cur_py_win));	
	bzero(Cur_put_win,sizeof(Cur_put_win));
}

void get_str_arr(char str[],char str_arr[][STR_SIZE])
{
	int i,n=0;
    	for(i=0;str[i] != '\0';i++){
	 	if(str[i] > 0xffffff80 ) {
			str_arr[n][0] = str[i++];
			str_arr[n][1] = str[i];
			str_arr[n][2] = '\0';
			n++;
    		}else{
			str_arr[n][0] = str[i];
			str_arr[n][1] = '\0';
			n++;
    		}
    	}
}

void get_win_str(char buf_str[][STR_SIZE], char win_str[][STR_SIZE], int win_start, int win_max)
{
    int i;
    for(i=0;i<win_max;i++){
        if(buf_str[win_start+i][0] == '\0'){
                break;
	}else{
                strcpy(win_str[i],buf_str[win_start+i]);
	}
    }
}

void str_to_tradition(char put_win[][STR_SIZE])
{
	int i=0;
	int n;
	i = check_strarr_len(PUT_WIN_NUM, Cur_put_win);
	for(n=0;n<i;n++){
		strcpy(Cur_put_win[n],simple_to_tradition(Cur_put_win[n]));
	}
}

void get_py_zh_win(void)
{
	bzero(Cur_py_win,sizeof(Cur_py_win));
        bzero(Cur_put_win,sizeof(Cur_put_win));
        get_win_str(Cur_py_buf, Cur_py_win, iCur_PYW, PY_WIN_NUM);
        get_win_str(Cur_zh_buf[iCur_PYW+iCur_PYS], Cur_put_win, iCur_ZHW, PUT_WIN_NUM);
	if (iCur_VK == 3)
		str_to_tradition(Cur_put_win);
}

Bool vk_key_handler (int x, int y)
{
    int xindex = -1,yindex = -1;
    char *cmd=NULL;
    
    if(y >0 && y <= TOP_BAR_HEIGHT){
	if(iCur_VK >= 2 && check_strarr_len(PY_WIN_NUM,Cur_py_win) > 0){
		if(y >TOP_BAR_HEIGHT/2 && y <= TOP_BAR_HEIGHT ){
			if(x>300 && x<320){//next or prev button
				iCur_ZHW=iCur_ZHW+PUT_WIN_NUM;
				if(iCur_ZHW>=check_strarr_len(ZH_NUM,Cur_zh_buf[iCur_PYW+iCur_PYS]))
					iCur_ZHW=0;
				get_py_zh_win();
				rescan_vk_window();	
			}else if(x>ZH_WIN_X && x<(ZH_WIN_X+index_to_point(check_strarr_len(PUT_WIN_NUM,Cur_put_win),
                           ZH_WIDTH, Cur_put_win, ZHListWinFont, 1))){
				iCur_PUTS = point_to_index(x-ZH_WIN_X,ZH_WIDTH,Cur_put_win,PUT_WIN_NUM,ZHListWinFont);
				get_py_zh_win();
				out_put_str(iCur_PUTS);
				iClear = 1;
			}
		}else{
			if(x>PY_WIN_X && x<(PY_WIN_X+index_to_point(check_strarr_len(PY_WIN_NUM,Cur_py_win),
			   PY_WIDTH, Cur_py_win, PYListWinFont, 1))){
				iCur_ZHW = 0;
				iCur_PYS = point_to_index(x-PY_WIN_X,PY_WIDTH,Cur_py_win,PY_WIN_NUM,PYListWinFont);
				get_py_zh_win();
				rescan_vk_window();			
			}
		}
	}else if(x>WIN_X && x<(WIN_X+index_to_point(check_strarr_len(PUT_WIN_NUM,Cur_put_win),
                           CHAR_WIDTH, Cur_put_win, ListWinFont, 1))){
		iCur_PUTS = point_to_index(x-WIN_X,CHAR_WIDTH, Cur_put_win, PUT_WIN_NUM, ListWinFont);
		out_put_str(iCur_PUTS);
	}
    }else if (y > TOP_BAR_HEIGHT && y <= VK_WINDOW_HEIGHT) {
	if (x < 0 || x > VK_WINDOW_WIDTH)
		return False;
    	yindex = (y-TOP_BAR_HEIGHT)/BUTTON_HEIGHT;
    	xindex = x/BUTTON_WIDTH;
    	if (xindex > 4)
		xindex = 3;
    	if (yindex > 4)
		yindex = 3;
	//key: *
	if (xindex == 0 && yindex == 3) {
		if (iCur_VK >= 2){
			iCur_PYS = 0;
                        iCur_PYW = 0;
                        iCur_ZHW=0;
			bzero(Cur_input_buf,sizeof(Cur_input_buf));
			bzero(Cur_py_buf,sizeof(Cur_py_buf));
			bzero(Cur_zh_buf,sizeof(Cur_zh_buf));
			bzero(Cur_py_win,sizeof(Cur_py_win));
		}
		bzero(Cur_put_win,sizeof(Cur_put_win));
		get_str_arr(vk_sc[iCur_SCW],Cur_put_win);
		iPrev_X = -1;
		iPrev_Y = -1;
		if (iCur_SCW >= 3)
			iCur_SCW = 0;
		else 
			iCur_SCW++;
		rescan_vk_window();
		return True;
	}
	//key: #
    	if (xindex == 2 && yindex == 3) {
		iCur_SCW = 0;	
		iCur_VK++;
		if (iCur_VK  >= iNum_VK)
                      iCur_VK = 0 ;
		if (iCur_VK >= 2){
			iCur_PYS = 0;
			iCur_PYW = 0;
			iCur_ZHW=0;
			bzero(Cur_input_buf,sizeof(Cur_input_buf));
			bzero(Cur_py_buf,sizeof(Cur_py_buf)); 
			bzero(Cur_py_win,sizeof(Cur_py_win));
		}
		bzero(Cur_put_win,sizeof(Cur_put_win));
		rescan_vk_window();
		return True;
    	}
	//key: 0-9
	if (xindex != 3){
		if (iCur_VK >= 2){
			if (iClear == 1){
				clear_py_zh();	
				iClear = 0;
			}	
			py_get_zh(vks[iCur_VK].strSymbol[yindex][xindex]);
			get_py_zh_win();
		}else {
                	iPrev_X = xindex;
                	iPrev_Y = yindex;
			bzero(Cur_put_win,sizeof(Cur_put_win));
			get_str_arr(vks[iCur_VK].strSymbol[iPrev_Y ][iPrev_X],Cur_put_win);
			if(check_strarr_len(PUT_WIN_NUM,Cur_put_win) == 1){
                        	out_put_str(0);
				return True;
			}
		}
		rescan_vk_window();
	}
	//key:Del
	if (xindex == 3 && yindex <= 2) {
		if (iCur_VK>=2 && strlen(Cur_input_buf)>0){
			Cur_input_buf[strlen(Cur_input_buf)-1] = '\0';
			iCur_PYW = 0;
			iCur_PYS  = 0;
			iCur_ZHW = 0;
			py_get_str();
			get_py_zh_win();
			rescan_vk_window();
		}else {
			bzero(Cur_put_win,sizeof(Cur_put_win));
			iCur_SCW = 0;
			rescan_vk_window();	
		}
		return False;// move the VK window
        }
	//key:EXIT
	if (xindex == 3 && yindex == 3){
		sprintf(cmd,"kill %d",VK_ID);
		execvp(cmd, NULL);
	}
    }    
return True;
}

⌨️ 快捷键说明

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