fix modifierbutton/keybd issues

This commit is contained in:
cxgeorge 2001-09-05 05:12:26 +00:00
parent 3dc74faa30
commit 6f4a6a75ab
1 changed files with 177 additions and 124 deletions

View File

@ -63,6 +63,13 @@ static char *OGLDrvStrings[3] = {"Software","MCD","ICD"};
LONG WINAPI static_window_proc(HWND hwnd, UINT msg, WPARAM wparam,LPARAM lparam);
extern char *ConvDDErrorToString(const HRESULT &error);
// because we dont have access to ModifierButtons, as a hack just synchronize state of these
// keys on get/lose keybd focus
#define NUM_MODIFIER_KEYS 16
unsigned int hardcoded_modifier_buttons[NUM_MODIFIER_KEYS]={VK_SHIFT,VK_MENU,VK_CONTROL,VK_SPACE,VK_TAB,
VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,VK_PRIOR,VK_NEXT,VK_HOME,VK_END,
VK_INSERT,VK_DELETE,VK_ESCAPE};
void PrintErrorMessage(DWORD msgID) {
LPTSTR pMessageBuffer;
@ -1393,52 +1400,62 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
return 0;
}
case WM_SYSKEYUP:
case WM_SYSKEYDOWN:
case WM_SYSCHAR:
case WM_CHAR:
case WM_CHAR: // shouldnt receive WM_CHAR unless WM_KEYDOWN stops returning 0 and passes on to DefWindProc
break;
case WM_SYSKEYDOWN:
case WM_KEYDOWN: {
POINT point;
GetCursorPos(&point);
ScreenToClient(hwnd, &point);
POINT point;
// handle Cntrl-V paste from clipboard
if(!((wparam=='V') && (GetKeyState(VK_CONTROL) < 0))) {
handle_keypress(lookup_key(wparam), point.x, point.y);
} else {
HGLOBAL hglb;
char *lptstr;
if (!IsClipboardFormatAvailable(CF_TEXT))
return 0;
if (!OpenClipboard(NULL))
return 0;
hglb = GetClipboardData(CF_TEXT);
if (hglb!=NULL) {
lptstr = (char *) GlobalLock(hglb);
if(lptstr != NULL) {
char *pChar;
for(pChar=lptstr;*pChar!=NULL;pChar++) {
handle_keypress(KeyboardButton::ascii_key((uchar)*pChar), point.x, point.y);
}
GlobalUnlock(hglb);
}
GetCursorPos(&point);
ScreenToClient(hwnd, &point);
#ifdef NDEBUG
handle_keypress(lookup_key(wparam), point.x, point.y);
#else
// handle Cntrl-V paste from clipboard
if(!((wparam=='V') && (GetKeyState(VK_CONTROL) < 0))) {
handle_keypress(lookup_key(wparam), point.x, point.y);
} else {
HGLOBAL hglb;
char *lptstr;
if (!IsClipboardFormatAvailable(CF_TEXT))
return 0;
if (!OpenClipboard(NULL))
return 0;
hglb = GetClipboardData(CF_TEXT);
if (hglb!=NULL) {
lptstr = (char *) GlobalLock(hglb);
if(lptstr != NULL) {
char *pChar;
for(pChar=lptstr;*pChar!=NULL;pChar++) {
handle_keypress(KeyboardButton::ascii_key((uchar)*pChar), point.x, point.y);
}
GlobalUnlock(hglb);
}
}
CloseClipboard();
}
CloseClipboard();
}
return 0;
#endif
// want to use defwindproc on Alt syskey so Alt-F4 works, etc
// but do want to bypass defwindproc F10 behavior (it activates the
// main menu, but we have none)
if((msg==WM_SYSKEYDOWN)&&(wparam!=VK_F10))
break;
else return 0;
}
case WM_SYSKEYUP:
case WM_KEYUP: {
// dont need x,y for this
handle_keyrelease(lookup_key(wparam));
break;
handle_keyrelease(lookup_key(wparam));
return 0;
}
case WM_LBUTTONDOWN:
button = 0;
case WM_MBUTTONDOWN:
@ -1498,20 +1515,44 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
}
break;
case WM_SETFOCUS:
SetCursor(_hMouseCursor);
if (mouse_entry_enabled()) {
make_current();
handle_mouse_entry(MOUSE_ENTERED);
}
break;
case WM_SETFOCUS: {
// wgldisplay_cat.info() << "got WM_SETFOCUS\n";
case WM_KILLFOCUS:
if (mouse_entry_enabled()) {
//make_current(); this doesnt make any sense, we're leaving our window
handle_mouse_entry(MOUSE_EXITED);
}
break;
if(_mouse_entry_enabled) {
make_current();
handle_mouse_entry(MOUSE_ENTERED);
}
POINT point;
GetCursorPos(&point);
ScreenToClient(hwnd, &point);
// this is a hack to make sure common modifier keys have proper state
// since at focus loss, app may never receive key-up event corresponding to
// a key-down. it would be better to know the exact set of ModifierButtons the
// user is using, since we may miss some here
int i;
for(i=0;i<NUM_MODIFIER_KEYS;i++) {
if(GetKeyState(hardcoded_modifier_buttons[i]) < 0)
handle_keypress(lookup_key(hardcoded_modifier_buttons[i]),point.x,point.y);
}
return 0;
}
case WM_KILLFOCUS: {
if(_mouse_entry_enabled)
handle_mouse_entry(MOUSE_EXITED);
int i;
for(i=0;i<NUM_MODIFIER_KEYS;i++) {
if(GetKeyState(hardcoded_modifier_buttons[i]) < 0)
handle_keyrelease(lookup_key(hardcoded_modifier_buttons[i]));
}
return 0;
}
break;
case WM_TIMER:
if((wparam==_PandaPausedTimer) && _window_inactive) {
@ -1533,87 +1574,99 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
// Access:
// Description:
////////////////////////////////////////////////////////////////////
ButtonHandle
wglGraphicsWindow::lookup_key(WPARAM wparam) const {
// probably would be faster with a map var
switch (wparam) {
case VK_BACK: return KeyboardButton::backspace();
case VK_TAB: return KeyboardButton::tab();
case VK_ESCAPE: return KeyboardButton::escape();
case VK_SPACE: return KeyboardButton::space();
case VK_UP: return KeyboardButton::up();
case VK_DOWN: return KeyboardButton::down();
case VK_LEFT: return KeyboardButton::left();
case VK_RIGHT: return KeyboardButton::right();
case VK_PRIOR: return KeyboardButton::page_up();
case VK_NEXT: return KeyboardButton::page_down();
case VK_HOME: return KeyboardButton::home();
case VK_END: return KeyboardButton::end();
case VK_F1: return KeyboardButton::f1();
case VK_F2: return KeyboardButton::f2();
case VK_F3: return KeyboardButton::f3();
case VK_F4: return KeyboardButton::f4();
case VK_F5: return KeyboardButton::f5();
case VK_F6: return KeyboardButton::f6();
case VK_F7: return KeyboardButton::f7();
case VK_F8: return KeyboardButton::f8();
case VK_F9: return KeyboardButton::f9();
case VK_F10: return KeyboardButton::f10();
case VK_F11: return KeyboardButton::f11();
case VK_F12: return KeyboardButton::f12();
case VK_INSERT: return KeyboardButton::insert();
case VK_DELETE: return KeyboardButton::del();
ButtonHandle wglGraphicsWindow::
lookup_key(WPARAM wparam) const {
switch(wparam) {
case VK_BACK: return KeyboardButton::backspace();
case VK_TAB: return KeyboardButton::tab();
case VK_ESCAPE: return KeyboardButton::escape();
case VK_SPACE: return KeyboardButton::space();
case VK_UP: return KeyboardButton::up();
case VK_DOWN: return KeyboardButton::down();
case VK_LEFT: return KeyboardButton::left();
case VK_RIGHT: return KeyboardButton::right();
case VK_PRIOR: return KeyboardButton::page_up();
case VK_NEXT: return KeyboardButton::page_down();
case VK_HOME: return KeyboardButton::home();
case VK_END: return KeyboardButton::end();
case VK_F1: return KeyboardButton::f1();
case VK_F2: return KeyboardButton::f2();
case VK_F3: return KeyboardButton::f3();
case VK_F4: return KeyboardButton::f4();
case VK_F5: return KeyboardButton::f5();
case VK_F6: return KeyboardButton::f6();
case VK_F7: return KeyboardButton::f7();
case VK_F8: return KeyboardButton::f8();
case VK_F9: return KeyboardButton::f9();
case VK_F10: return KeyboardButton::f10();
case VK_F11: return KeyboardButton::f11();
case VK_F12: return KeyboardButton::f12();
case VK_INSERT: return KeyboardButton::insert();
case VK_DELETE: return KeyboardButton::del();
case VK_CAPITAL: return KeyboardButton::caps_lock();
case VK_NUMLOCK: return KeyboardButton::num_lock();
case VK_SCROLL: return KeyboardButton::scroll_lock();
case VK_SNAPSHOT: return KeyboardButton::print_screen();
case VK_SHIFT:
case VK_LSHIFT:
case VK_RSHIFT:
return KeyboardButton::shift();
case VK_SHIFT:
case VK_LSHIFT:
case VK_RSHIFT:
return KeyboardButton::shift();
case VK_CONTROL:
case VK_LCONTROL:
case VK_RCONTROL:
return KeyboardButton::control();
case VK_CONTROL:
case VK_LCONTROL:
case VK_RCONTROL:
return KeyboardButton::control();
case VK_MENU:
case VK_LMENU:
case VK_RMENU:
return KeyboardButton::alt();
case VK_MENU:
case VK_LMENU:
case VK_RMENU:
return KeyboardButton::alt();
default:
int key = MapVirtualKey(wparam, 2);
if (isascii(key) && key != 0) {
if (GetKeyState(VK_SHIFT) >= 0)
key = tolower(key);
else {
switch (key) {
case '1': key = '!'; break;
case '2': key = '@'; break;
case '3': key = '#'; break;
case '4': key = '$'; break;
case '5': key = '%'; break;
case '6': key = '^'; break;
case '7': key = '&'; break;
case '8': key = '*'; break;
case '9': key = '('; break;
case '0': key = ')'; break;
case '-': key = '_'; break;
case '=': key = '+'; break;
case ',': key = '<'; break;
case '.': key = '>'; break;
case '/': key = '?'; break;
case ';': key = ':'; break;
case '\'': key = '"'; break;
case '[': key = '{'; break;
case ']': key = '}'; break;
case '\\': key = '|'; break;
case '`': key = '~'; break;
}
}
return KeyboardButton::ascii_key((uchar)key);
default:
int key = MapVirtualKey(wparam, 2);
if(isascii(key) && key != 0) {
bool bCapsLockDown=((GetKeyState(VK_CAPITAL) & 0x1)!=0);
bool bShiftUp = (GetKeyState(VK_SHIFT) >= 0);
if(bShiftUp) {
if(bCapsLockDown)
key = toupper(key);
else key = tolower(key);
} else {
switch(key) {
// these keys are unaffected by capslock
case '1': key = '!'; break;
case '2': key = '@'; break;
case '3': key = '#'; break;
case '4': key = '$'; break;
case '5': key = '%'; break;
case '6': key = '^'; break;
case '7': key = '&'; break;
case '8': key = '*'; break;
case '9': key = '('; break;
case '0': key = ')'; break;
case '-': key = '_'; break;
case '=': key = '+'; break;
case ',': key = '<'; break;
case '.': key = '>'; break;
case '/': key = '?'; break;
case ';': key = ':'; break;
case '\'': key = '"'; break;
case '[': key = '{'; break;
case ']': key = '}'; break;
case '\\': key = '|'; break;
case '`': key = '~'; break;
default:
if(bCapsLockDown)
key = tolower(key);
else key = toupper(key);
}
}
return KeyboardButton::ascii_key((uchar)key);
}
break;
}
break;
}
return ButtonHandle::none();
return ButtonHandle::none();
}
#if 0