/* ### ### This file is part of ### ### TurboLinux ZWinPro ### ### Copyright (C) 1999-2000 TurboLinux, Inc. ### All Rights Reserved ### Distributed under the terms of the GNU General Public License (GPL) ### ### ### Authors: TurboLinux Chinese Development Team: ### Justin Yu ### Sean Chen ### Daniel Fang ### */ /* Virtual Keyboard Implementated by Justin Yu */ #include "all.h" #include "layout.h" #define INC (x0 += KEY_WIDTH) #define HALFINC (x0 += KEY_WIDTH/2) static void set_key(int n, unsigned long keysym, int x, int y, int w, int h); static int in_keys(int x0, int y0); void HZinitServerVirtualKeyboard(int x, int y, int w, int h) { int i; int x0, y0; //geometry HZServer.hzVKwin.onflag = False; HZServer.hzVKwin.x = x; HZServer.hzVKwin.y = y; HZServer.hzVKwin.w = w; HZServer.hzVKwin.h = h; //for virtual keyboard keytype = KEYBOARD_DEFAULT; for(i=0; i= XK_F1 && vkkeys[i].s <= XK_F12){ char buf[4]; draw_button(dpy, win, dimgc, lightgc, vkkeys[i].x, vkkeys[i].y, vkkeys[i].x + vkkeys[i].w - 1, vkkeys[i].y + vkkeys[i].h - 1, True); sprintf(buf, "F%d", (int)(vkkeys[i].s - XK_F1 + 1)); MyXmbDrawString(dpy, win, fontset_gb, normalgc, vkkeys[i].x + 10 - strlen(buf)*3, vkkeys[i].y + 22, buf, strlen(buf)); } } } void HZprocVKWindow(int x0, int y0) { int i; char buf[2]; Display *dpy = HZServer.display; Window win = HZServer.window3; GC dimgc = HZServer.dimGC; GC lightgc = HZServer.lightGC; //check if a key pressed if((i = in_keys(x0, y0)) != -1){ if(vkkeys[i].s != XK_Return){ int another; another = -1; //shift, alt, control buttons has twins draw_button(dpy, win, dimgc, lightgc, vkkeys[i].x, vkkeys[i].y, vkkeys[i].x + vkkeys[i].w - 1, vkkeys[i].y + vkkeys[i].h - 1, False); if(vkkeys[i].s == XK_Shift_L) another = 52; if(vkkeys[i].s == XK_Shift_R) another = 41; if(vkkeys[i].s == XK_Control_L) another = 57; if(vkkeys[i].s == XK_Control_R) another = 53; if(vkkeys[i].s == XK_Alt_L) another = 56; if(vkkeys[i].s == XK_Alt_R) another = 54; if(another != -1){ draw_button(dpy, win, dimgc, lightgc, vkkeys[another].x, vkkeys[another].y, vkkeys[another].x+vkkeys[another].w-1, vkkeys[another].y+vkkeys[another].h-1, False); } } else { draw_button_return(dpy, win, dimgc, lightgc, vkkeys[i].x, vkkeys[i].y, KEY_WIDTH, KEY_HEIGHT, False); } wait_button_release(); //check the pointer ? if(vkkeys[i].s != XK_Return){ Bool flag; int another; //check flags, capslock, shift, alt, control keys //are in toggle mode flag = True; //default to popup another = -1; if(vkkeys[i].s == XK_Caps_Lock){ vkkeyboard[keytype].flag_capslock = !vkkeyboard[keytype].flag_capslock; flag = vkkeyboard[keytype].flag_capslock; } else if(vkkeys[i].s == XK_Shift_L || vkkeys[i].s == XK_Shift_R ){ vkkeyboard[keytype].flag_shift = !vkkeyboard[keytype].flag_shift; flag = vkkeyboard[keytype].flag_shift; //refresh again HZvkDrawWindow(); } else if(vkkeys[i].s == XK_Control_L || vkkeys[i].s == XK_Control_R){ vkkeyboard[keytype].flag_control = !vkkeyboard[keytype].flag_control; flag = vkkeyboard[keytype].flag_control; } else if(vkkeys[i].s == XK_Alt_L || vkkeys[i].s == XK_Alt_R ){ vkkeyboard[keytype].flag_alt = !vkkeyboard[keytype].flag_alt; flag = vkkeyboard[keytype].flag_alt; //refresh again HZvkDrawWindow(); } else { flag = False; } draw_button(dpy, win, dimgc, lightgc, vkkeys[i].x, vkkeys[i].y, vkkeys[i].x + vkkeys[i].w - 1, vkkeys[i].y + vkkeys[i].h - 1, !flag); //if has twins if(vkkeys[i].s == XK_Shift_L) another = 52; if(vkkeys[i].s == XK_Shift_R) another = 41; if(vkkeys[i].s == XK_Control_L) another = 57; if(vkkeys[i].s == XK_Control_R) another = 53; if(vkkeys[i].s == XK_Alt_L) another = 56; if(vkkeys[i].s == XK_Alt_R) another = 54; if(another != -1){ draw_button(dpy, win, dimgc, lightgc, vkkeys[another].x, vkkeys[another].y, vkkeys[another].x+vkkeys[another].w-1, vkkeys[another].y+vkkeys[another].h-1, !flag); } } else { draw_button_return(dpy, win, dimgc, lightgc, vkkeys[i].x, vkkeys[i].y, KEY_WIDTH, KEY_HEIGHT, True); } if(vkkeys[i].s == XK_BackSpace || vkkeys[i].s == XK_Escape || vkkeys[i].s == XK_Tab || vkkeys[i].s == XK_Return || (vkkeys[i].s >= XK_F1 && vkkeys[i].s <= XK_F12)){ //check which type of client //ic = (IC *)FindIC(last_icid); //XGetInputFocus(display, &twin, &revert_to_return); if(1) { /* if(vkkeys[i].s == XK_Tab) buf[0] = '\t'; else if(vkkeys[i].s == XK_Escape) buf[0] = 0x1b; else if(vkkeys[i].s == XK_BackSpace)buf[0] = '\b'; else if(vkkeys[i].s == XK_Return) buf[0] = '\n'; else buf[0] = '\0'; buf[1] = '\0'; ForwardString(buf, 1); */ //some clients will hang, so if(vkkeys[i].s == XK_BackSpace) return; ForwardEvent(vkkeys[i].s, vkkeyboard[keytype].flag_shift, vkkeyboard[keytype].flag_control, vkkeyboard[keytype].flag_alt); } else { SendKeysym(vkkeys[i].s, vkkeyboard[keytype].flag_shift, vkkeyboard[keytype].flag_control, vkkeyboard[keytype].flag_alt); } } else { //check which type of client //ic = (IC *)FindIC(last_icid); //XGetInputFocus(display, &twin, &revert_to_return); if(1){ //submit the char if(vkkeyboard[keytype].flag_shift)buf[0] = vkkeys[i].f; else buf[0] = vkkeys[i].c; buf[1] = '\0'; ForwardString(buf, 1); } else { if(vkkeyboard[keytype].flag_shift) SendEvent(vkkeys[i].f, vkkeyboard[keytype].flag_shift, vkkeyboard[keytype].flag_control, vkkeyboard[keytype].flag_alt); else SendEvent(vkkeys[i].c, vkkeyboard[keytype].flag_shift, vkkeyboard[keytype].flag_control, vkkeyboard[keytype].flag_alt); } } } else { //moving the window HZprocMoveWindow(); } } static int in_keys(int x0, int y0) { int i; //get for(i=0; i