|
From: John M M. <jo...@us...> - 2004-04-23 20:49:43
|
Update of /cvsroot/squeak/squeak/platforms/Mac OS/vm In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2998/squeak/platforms/Mac OS/vm Modified Files: sqMacUIEvents.c Log Message: 3.7.3b4 Rewrite Key Up handling, make it real. Alter how Key repeat is handled too. Resolve issues with Unicode being passed up to Smalltalk Index: sqMacUIEvents.c =================================================================== RCS file: /cvsroot/squeak/squeak/platforms/Mac OS/vm/sqMacUIEvents.c,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** sqMacUIEvents.c 19 Feb 2004 04:34:50 -0000 1.21 --- sqMacUIEvents.c 23 Apr 2004 20:49:34 -0000 1.22 *************** *** 24,28 **** * 3.7.0bx Nov 24th, 2003 JMM gCurrentVMEncoding * 3.7.1b3 Jan 29th, 2004 JMM return unicode for classic version versus virtual keyboard code ! notes: see incontent, I think it's a bug, click to bring to foreground signls mousedown. bad... IsUserCancelEventRef --- 24,28 ---- * 3.7.0bx Nov 24th, 2003 JMM gCurrentVMEncoding * 3.7.1b3 Jan 29th, 2004 JMM return unicode for classic version versus virtual keyboard code ! * 3.7.3b2 Apr 10th, 2004 JMM Tetsuya HAYASHI <te...@st...> alteration to unicode key capture notes: see incontent, I think it's a bug, click to bring to foreground signls mousedown. bad... IsUserCancelEventRef *************** *** 43,46 **** --- 43,58 ---- #include "aio.h" + enum { KeyMapSize= 32 }; + + typedef struct + { + int keyCode; + int keyChar; + int keyRepeated; + } KeyMapping; + + static KeyMapping keyMap[KeyMapSize]; + static int keyMapSize= 0; + pthread_mutex_t gEventQueueLock,gEventUILock; pthread_cond_t gEventUILockCondition; *************** *** 53,56 **** --- 65,76 ---- void signalAnyInterestedParties(void); Boolean gQuitNowRightNow=false; + sqKeyboardEvent *enterKeystroke (long type, long cc, long pc, long m); + + static int addToKeyMap(int keyCode, int keyChar); + static int findInKeyMap(int keyCode); + static int removeFromKeyMap(int keyCode); + static int indexInKeyMap(int keyCode); + static int findRepeatInKeyMap(int keyCode); + static void setRepeatInKeyMap(int keyCode); #endif *************** *** 1199,1207 **** { kEventClassMouse, kEventMouseDown}}; ! EventTypeSpec windEventKBList[] = {/*{ kEventClassKeyboard, kEventRawKeyDown}, { kEventClassKeyboard, kEventRawKeyUp}, ! { kEventClassKeyboard, kEventRawKeyRepeat},*/ { kEventClassKeyboard, kEventRawKeyModifiersChanged}}; EventTypeSpec appleEventEventList[] = {{ kEventClassAppleEvent, kEventAppleEvent}}; --- 1219,1228 ---- { kEventClassMouse, kEventMouseDown}}; ! EventTypeSpec windEventKBList[] = {{ kEventClassKeyboard, kEventRawKeyDown}, { kEventClassKeyboard, kEventRawKeyUp}, ! { kEventClassKeyboard, kEventRawKeyRepeat}, { kEventClassKeyboard, kEventRawKeyModifiersChanged}}; + EventTypeSpec appleEventEventList[] = {{ kEventClassAppleEvent, kEventAppleEvent}}; *************** *** 1243,1249 **** /* Installing the window event handler */ ! InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyWindowEventHandler), 3, windEventList, 0, NULL); InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyWindowEventMouseHandler), 5, windEventMouseList, 0, NULL); ! InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyWindowEventKBHandler), 1, windEventKBList, 0, NULL); InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyAppleEventEventHandler), 1, appleEventEventList, 0, NULL); InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyTextInputEventHandler), 1, textInputEventList, 0, NULL); --- 1264,1270 ---- /* Installing the window event handler */ ! InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyWindowEventHandler), 4, windEventList, 0, NULL); InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyWindowEventMouseHandler), 5, windEventMouseList, 0, NULL); ! InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyWindowEventKBHandler), 4, windEventKBList, 0, NULL); InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyAppleEventEventHandler), 1, appleEventEventList, 0, NULL); InstallWindowEventHandler(getSTWindow(), NewEventHandlerUPP(MyTextInputEventHandler), 1, textInputEventList, 0, NULL); *************** *** 1497,1503 **** EventRef event, void* userData) { ! UInt32 whatHappened; OSStatus result = eventNotHandledErr; /* report failure by default */ ! if (!windowActive) return result; --- 1518,1524 ---- EventRef event, void* userData) { ! UInt32 whatHappened,keyCode,key; OSStatus result = eventNotHandledErr; /* report failure by default */ ! if (!windowActive) return result; *************** *** 1505,1520 **** if(messageHook && ((result = doPreMessageHook(event)) != eventNotHandledErr)) return result; whatHappened = GetEventKind(event); switch (whatHappened) { ! /*case kEventRawKeyDown: case kEventRawKeyRepeat: ! recordKeyboardEventCarbon(event,EventKeyDown); ! result = noErr; break; case kEventRawKeyUp: ! recordKeyboardEventCarbon(event,EventKeyUp); ! result = noErr; ! break;*/ case kEventRawKeyModifiersChanged: /* ok in this case we fake a mouse event to deal with the modifiers changing */ --- 1526,1553 ---- if(messageHook && ((result = doPreMessageHook(event)) != eventNotHandledErr)) return result; + whatHappened = GetEventKind(event); + GetEventParameter (event, kEventParamKeyCode, typeUInt32,NULL, sizeof(typeUInt32), NULL, &keyCode); switch (whatHappened) { ! case kEventRawKeyDown: ! //fprintf(stdout,"\nrawkey down %i",ioMSecs()); ! addToKeyMap(keyCode, 0); ! result = eventNotHandledErr; ! break; case kEventRawKeyRepeat: ! //fprintf(stdout,"\nrawkey repeat %i",ioMSecs()); ! setRepeatInKeyMap(keyCode); ! result = eventNotHandledErr; break; case kEventRawKeyUp: ! //fprintf(stdout,"\nrawkey up %i",ioMSecs()); ! key = findInKeyMap(keyCode); ! if (key) { ! enterKeystroke ( EventTypeKeyboard,key, EventKeyUp, ModifierStateCarbon(event,0)); ! } ! removeFromKeyMap(keyCode); ! result = eventNotHandledErr; ! break; case kEventRawKeyModifiersChanged: /* ok in this case we fake a mouse event to deal with the modifiers changing */ *************** *** 1717,1729 **** void recordKeyboardEventCarbon(EventRef event) { ! int modifierBits, i; ! char macCharCode; UniCharCount uniCharCount; ! UniChar modifiedUniChar, *uniCharBufPtr, *uniCharBuf; ! sqKeyboardEvent *evt, *extra; ! OSErr err; ! UniChar text; ! UInt32 actualSize; ! EventRef actualEvent; // Tetsuya HAYASHI <te...@st...> supplied multiple unicode extraction --- 1750,1759 ---- void recordKeyboardEventCarbon(EventRef event) { ! int modifierBits, keyIndex, i, ISawRawKeyRepeat; UniCharCount uniCharCount; ! UniChar modifiedUniChar, *uniCharBufPtr, *uniCharBuf; ! OSErr err; ! UInt32 actualSize,macKeyCode,textEntryServices; ! EventRef actualEvent; // Tetsuya HAYASHI <te...@st...> supplied multiple unicode extraction *************** *** 1762,1765 **** --- 1792,1801 ---- typeUnicodeText, NULL, actualSize, NULL, uniCharBuf); + err = GetEventParameter (event, kEventParamTextInputSendComponentInstance, + typeComponentInstance, NULL, sizeof(UInt32), NULL, &textEntryServices); + + err = GetEventParameter( actualEvent, kEventParamKeyCode, + typeUInt32, NULL, sizeof(UInt32), NULL, &macKeyCode); + modifiedUniChar = *uniCharBufPtr; buttonState = modifierBits =ModifierStateCarbon(actualEvent,0); //Capture option states *************** *** 1771,1778 **** --- 1807,1820 ---- } + modifierBits = modifierBits >> 3; pthread_mutex_lock(&gEventQueueLock); /* Put sqKeyboardEvent in actualSize times */ uniCharCount = actualSize / sizeof(UniChar); + keyIndex = indexInKeyMap(macKeyCode); + ISawRawKeyRepeat = findRepeatInKeyMap(macKeyCode); + if (keyIndex >= 0) + keyMap[keyIndex].keyChar = modifiedUniChar; + for (i=0; i<uniCharCount; i++) { CFStringRef theString; *************** *** 1781,1842 **** theString = CFStringCreateWithCharacters (nil, &modifiedUniChar, (CFIndex) 1); ! CFStringGetCString (theString,&macRomanString,2, kCFStringEncodingMacRoman); macRomanCode = macRomanString[0]; CFRelease(theString); ! evt = (sqKeyboardEvent*) nextEventPut(); ! ! /* first the basics */ ! evt->type = EventTypeKeyboard; ! evt->timeStamp = ioMSecs() & 536870911; ! /* now the key code */ ! /* press code must differentiate */ ! evt->charCode = modifiedUniChar; ! evt->pressCode = EventKeyDown; ! evt->modifiers = modifierBits >> 3; ! /* clean up reserved */ ! evt->reserved1 = 0; ! evt->reserved2 = 0; ! /* generate extra character event */ ! extra = (sqKeyboardEvent*)nextEventPut(); ! extra->type = EventTypeKeyboard; ! extra->timeStamp = ioMSecs() & 536870911; ! extra->charCode = macRomanCode; ! extra->pressCode = EventKeyChar; ! extra->modifiers = modifierBits >> 3; - if(!inputSemaphoreIndex) { - int keystate; - - /* keystate: low byte is the ascii character; next 8 bits are modifier bits */ - keystate = (evt->modifiers << 8) | (unsigned char) macRomanCode; - if (keystate == getInterruptKeycode()) { - /* Note: interrupt key is "meta"; it not reported as a keystroke */ - setInterruptPending(true); - setInterruptCheckCounter(0); - } else { - keyBuf[keyBufPut] = keystate; - keyBufPut = (keyBufPut + 1) % KEYBUF_SIZE; - if (keyBufGet == keyBufPut) { - /* buffer overflow; drop the last character */ - keyBufGet = (keyBufGet + 1) % KEYBUF_SIZE; - keyBufOverflows++; - } - } - } /* Put the sqKeyboardEvent for KeyUp */ ! evt = (sqKeyboardEvent*) nextEventPut(); ! /* first the basics */ ! evt->type = EventTypeKeyboard; ! evt->timeStamp = ioMSecs() & 536870911; ! /* now the key code */ ! /* press code must differentiate */ ! evt->charCode = modifiedUniChar; ! evt->pressCode = EventKeyUp; ! evt->modifiers = modifierBits >> 3; ! /* clean up reserved */ ! evt->reserved1 = 0; ! evt->reserved2 = 0; uniCharBufPtr++; --- 1823,1840 ---- theString = CFStringCreateWithCharacters (nil, &modifiedUniChar, (CFIndex) 1); ! CFStringGetCString (theString,(char *)&macRomanString,2, kCFStringEncodingMacRoman); macRomanCode = macRomanString[0]; CFRelease(theString); ! /* Put the sqKeyboardEvent for KeyDown */ ! if (!ISawRawKeyRepeat) ! enterKeystroke ( EventTypeKeyboard, modifiedUniChar, EventKeyDown, modifierBits); ! /* generate extra character event */ ! enterKeystroke ( EventTypeKeyboard, (macRomanCode == '\0') ? modifiedUniChar : macRomanCode, EventKeyChar, modifierBits); /* Put the sqKeyboardEvent for KeyUp */ ! if (!ISawRawKeyRepeat && (uniCharCount> 1 || (keyIndex < 0))) ! enterKeystroke ( EventTypeKeyboard, modifiedUniChar, EventKeyUp, modifierBits); uniCharBufPtr++; *************** *** 1844,1848 **** } - free(uniCharBuf); pthread_mutex_unlock(&gEventQueueLock); --- 1842,1845 ---- *************** *** 1986,1988 **** --- 1983,2072 ---- } + + sqKeyboardEvent *enterKeystroke (long type, long cc, long pc, long m) { + sqKeyboardEvent *evt; + evt = (sqKeyboardEvent*) nextEventPut(); + + /* first the basics */ + //fprintf(stdout,"\nKeyStroke time %i Type %i Value %i",ioMSecs(),pc,cc); + evt->type = type; + evt->timeStamp = ioMSecs() & 536870911; + /* now the key code */ + /* press code must differentiate */ + evt->charCode = cc; + evt->pressCode = pc; + evt->modifiers = m; + /* clean up reserved */ + evt->reserved1 = 0; + evt->reserved2 = 0; + if(pc == EventKeyChar && !inputSemaphoreIndex) { + int keystate; + + /* keystate: low byte is the ascii character; next 8 bits are modifier bits */ + keystate = (evt->modifiers << 8) | (unsigned char) ((char) cc); + if (keystate == getInterruptKeycode()) { + /* Note: interrupt key is "meta"; it not reported as a keystroke */ + setInterruptPending(true); + setInterruptCheckCounter(0); + } else { + keyBuf[keyBufPut] = keystate; + keyBufPut = (keyBufPut + 1) % KEYBUF_SIZE; + if (keyBufGet == keyBufPut) { + /* buffer overflow; drop the last character */ + keyBufGet = (keyBufGet + 1) % KEYBUF_SIZE; + keyBufOverflows++; + } + } + } + return evt; + } + + + static int addToKeyMap(int keyCode, int keyChar) + { + //fprintf(stdout, "\nAddToKeyMap T %i c %i i %i",ioMSecs(),keyCode,keyMapSize); + if (keyMapSize > KeyMapSize) { fprintf(stderr, "keymap overflow\n"); return -1; } + keyMap[keyMapSize++]= (KeyMapping){ keyCode, keyChar, 0}; + return keyChar; + } + + static int indexInKeyMap(int keyCode) + { + int i; + for (i= 0; i < keyMapSize; ++i) + if (keyMap[i].keyCode == keyCode) + return i; + return -1; + } + + static int findInKeyMap(int keyCode) + { + int idx= indexInKeyMap(keyCode); + return (idx >= 0) ? keyMap[idx].keyChar : -1; + } + + static int findRepeatInKeyMap(int keyCode) + { + int idx= indexInKeyMap(keyCode); + return (idx >= 0) ? keyMap[idx].keyRepeated : 0; + } + + static void setRepeatInKeyMap(int keyCode) + { + int idx= indexInKeyMap(keyCode); + if (idx >= 0) keyMap[idx].keyRepeated = 1; + } + + static int removeFromKeyMap(int keyCode) + { + int idx= indexInKeyMap(keyCode); + int keyChar= -1; + //fprintf(stdout, "\nremoveFromKeyMap T %i c %i i %i",ioMSecs(),keyCode,keyMapSize-1); + if (idx < 0) { fprintf(stderr, "keymap underflow\n"); return -1; } + keyChar= keyMap[idx].keyChar; + for (; idx < keyMapSize - 1; ++idx) + keyMap[idx]= keyMap[idx + 1]; + --keyMapSize; + return keyChar; + } #endif \ No newline at end of file |