IME support (and revamped text input support) semi-working.
parent
3c60fb24ca
commit
ad26f3c390
|
|
@ -15,9 +15,10 @@
|
|||
// Some nasty shovelling of LLOpenGLView from LLNativeBindings to prevent any C++ <-> Obj-C interop oddities.
|
||||
// Redraw callback handling removed (for now) due to being unneeded in the patch that preceeds this addition.
|
||||
|
||||
@interface LLOpenGLView : NSOpenGLView
|
||||
@interface LLOpenGLView : NSOpenGLView <NSTextInputClient>
|
||||
{
|
||||
std::string mLastDraggedUrl;
|
||||
unsigned int mModifiers;
|
||||
}
|
||||
- (id) initWithSamples:(NSUInteger)samples;
|
||||
- (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync;
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@
|
|||
|
||||
- (id) initWithFrame:(NSRect)frame withSamples:(NSUInteger)samples andVsync:(BOOL)vsync
|
||||
{
|
||||
[[self window] makeFirstResponder:self];
|
||||
[self registerForDraggedTypes:[NSArray arrayWithObject:NSURLPboardType]];
|
||||
[self initWithFrame:frame];
|
||||
|
||||
|
|
@ -199,6 +200,7 @@
|
|||
|
||||
- (void) mouseDown:(NSEvent *)theEvent
|
||||
{
|
||||
[self becomeFirstResponder];
|
||||
[_window mouseDown:theEvent];
|
||||
}
|
||||
|
||||
|
|
@ -234,7 +236,49 @@
|
|||
|
||||
- (void) keyDown:(NSEvent *)theEvent
|
||||
{
|
||||
[_window keyDown:theEvent];
|
||||
[[self inputContext] handleEvent:theEvent];
|
||||
uint keycode = [theEvent keyCode];
|
||||
|
||||
switch (keycode) {
|
||||
case 0x7b:
|
||||
case 0x7c:
|
||||
case 0x7d:
|
||||
case 0x7e:
|
||||
callKeyDown(keycode, mModifiers);
|
||||
break;
|
||||
|
||||
default:
|
||||
callKeyDown(keycode, mModifiers);
|
||||
NSString *chars = [theEvent characters];
|
||||
for (uint i = 0; i < [chars length]; i++) {
|
||||
// Enter and Return are special cases.
|
||||
unichar returntest = [chars characterAtIndex:i];
|
||||
if ((returntest == NSCarriageReturnCharacter || returntest == NSEnterCharacter) &&
|
||||
!([theEvent modifierFlags] & NSCommandKeyMask) &&
|
||||
!([theEvent modifierFlags] & NSAlternateKeyMask) &&
|
||||
!([theEvent modifierFlags] & NSControlKeyMask))
|
||||
{
|
||||
callUnicodeCallback(13, 0);
|
||||
} else {
|
||||
// The command key being pressed is also a special case.
|
||||
// Control + <character> produces an ASCII control character code.
|
||||
// Command + <character> produces just the character's code.
|
||||
// Check to see if the command key is pressed, then filter through the different character ranges that are relevant to control characters, and subtract the appropriate range.
|
||||
if ([theEvent modifierFlags] & NSCommandKeyMask)
|
||||
{
|
||||
if (returntest >= 64 && returntest <= 95)
|
||||
{
|
||||
callUnicodeCallback(returntest - 63, mModifiers);
|
||||
} else if (returntest >= 97 && returntest <= 122)
|
||||
{
|
||||
callUnicodeCallback(returntest - 96, mModifiers);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (void) mouseMoved:(NSEvent *)theEvent
|
||||
|
|
@ -242,9 +286,9 @@
|
|||
[_window mouseMoved:theEvent];
|
||||
}
|
||||
|
||||
- (void) flagsChanged:(NSEvent *)theEvent
|
||||
{
|
||||
[_window flagsChanged:theEvent];
|
||||
- (void)flagsChanged:(NSEvent *)theEvent {
|
||||
mModifiers = [theEvent modifierFlags];
|
||||
callModifier([theEvent modifierFlags]);
|
||||
}
|
||||
|
||||
- (void) mouseExited:(NSEvent *)theEvent
|
||||
|
|
@ -252,14 +296,9 @@
|
|||
[_window mouseExited:theEvent];
|
||||
}
|
||||
|
||||
- (BOOL) becomeFirstResponder
|
||||
- (BOOL) acceptsFirstResponder
|
||||
{
|
||||
return [_window becomeFirstResponder];
|
||||
}
|
||||
|
||||
- (BOOL) resignFirstResponder
|
||||
{
|
||||
return [_window resignFirstResponder];
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSDragOperation) draggingEntered:(id<NSDraggingInfo>)sender
|
||||
|
|
@ -305,6 +344,67 @@
|
|||
return true;
|
||||
}
|
||||
|
||||
- (BOOL)hasMarkedText
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSRange)markedRange
|
||||
{
|
||||
return NSMakeRange(NSNotFound, 0);
|
||||
}
|
||||
|
||||
- (NSRange)selectedRange
|
||||
{
|
||||
return NSMakeRange(NSNotFound, 0);
|
||||
}
|
||||
|
||||
- (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange
|
||||
{
|
||||
}
|
||||
|
||||
- (void)unmarkText
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
- (NSArray *)validAttributesForMarkedText
|
||||
{
|
||||
return [NSArray array];
|
||||
}
|
||||
|
||||
- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)insertText:(id)aString replacementRange:(NSRange)replacementRange
|
||||
{
|
||||
for (NSInteger i = 0; i < [aString length]; i++)
|
||||
{
|
||||
callUnicodeCallback([aString characterAtIndex:i], mModifiers);
|
||||
}
|
||||
}
|
||||
|
||||
- (NSUInteger)characterIndexForPoint:(NSPoint)aPoint
|
||||
{
|
||||
return NSNotFound;
|
||||
}
|
||||
|
||||
- (NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange
|
||||
{
|
||||
return NSZeroRect;
|
||||
}
|
||||
|
||||
- (void)doCommandBySelector:(SEL)aSelector
|
||||
{
|
||||
}
|
||||
|
||||
- (BOOL)drawsVerticallyForCharacterAtIndex:(NSUInteger)charIndex
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// We use a custom NSWindow for our event handling.
|
||||
|
|
@ -315,12 +415,13 @@
|
|||
|
||||
- (id) init
|
||||
{
|
||||
|
||||
[self makeFirstResponder:[self contentView]];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) keyDown:(NSEvent *)theEvent
|
||||
{
|
||||
|
||||
uint keycode = [theEvent keyCode];
|
||||
|
||||
switch (keycode) {
|
||||
|
|
@ -364,6 +465,7 @@
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (void) keyUp:(NSEvent *)theEvent {
|
||||
|
|
|
|||
|
|
@ -223,7 +223,10 @@ void callUnicodeCallback(wchar_t character, unsigned int mask)
|
|||
|
||||
void callFocus()
|
||||
{
|
||||
gWindowImplementation->getCallbacks()->handleFocus(gWindowImplementation);
|
||||
if (gWindowImplementation)
|
||||
{
|
||||
gWindowImplementation->getCallbacks()->handleFocus(gWindowImplementation);
|
||||
}
|
||||
}
|
||||
|
||||
void callFocusLost()
|
||||
|
|
@ -369,9 +372,12 @@ void callHandleDragDropped(std::string url)
|
|||
|
||||
void callQuitHandler()
|
||||
{
|
||||
if(gWindowImplementation->getCallbacks()->handleCloseRequest(gWindowImplementation))
|
||||
if (gWindowImplementation)
|
||||
{
|
||||
gWindowImplementation->getCallbacks()->handleQuit(gWindowImplementation);
|
||||
if(gWindowImplementation->getCallbacks()->handleCloseRequest(gWindowImplementation))
|
||||
{
|
||||
gWindowImplementation->getCallbacks()->handleQuit(gWindowImplementation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -2,7 +2,7 @@
|
|||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">1060</int>
|
||||
<string key="IBDocument.SystemVersion">12D76</string>
|
||||
<string key="IBDocument.SystemVersion">12D78</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
|
||||
<string key="IBDocument.AppKitVersion">1187.37</string>
|
||||
<string key="IBDocument.HIToolboxVersion">626.00</string>
|
||||
|
|
@ -775,24 +775,27 @@
|
|||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">888</int>
|
||||
<int key="maxID">940</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">LLAppDelegate</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<string key="NS.key.0">window</string>
|
||||
<string key="NS.object.0">LLNSWindow</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<string key="NS.key.0">window</string>
|
||||
<object class="IBToOneOutletInfo" key="NS.object.0">
|
||||
<dictionary class="NSMutableDictionary" key="outlets">
|
||||
<string key="glview">LLOpenGLView</string>
|
||||
<string key="window">LLNSWindow</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<object class="IBToOneOutletInfo" key="glview">
|
||||
<string key="name">glview</string>
|
||||
<string key="candidateClassName">LLOpenGLView</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="window">
|
||||
<string key="name">window</string>
|
||||
<string key="candidateClassName">LLNSWindow</string>
|
||||
</object>
|
||||
</object>
|
||||
</dictionary>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/LLAppDelegate.h</string>
|
||||
|
|
@ -806,6 +809,14 @@
|
|||
<string key="minorKey">./Classes/LLNSWindow.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">LLOpenGLView</string>
|
||||
<string key="superclassName">NSOpenGLView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/LLOpenGLView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
|
|
|
|||
Loading…
Reference in New Issue