6 # import <Carbon/Carbon.h>
27 GHOST_ImeStateFlagCocoa state_flag;
28 NSRect candidate_window_position;
33 std::string composite;
34 std::string combined_result;
61 ime.candidate_window_position = NSZeroRect;
62 ime.event.cursor_position = -1;
63 ime.event.target_start = -1;
64 ime.event.target_end = -1;
68 NSNotificationCenter *
center = [NSNotificationCenter defaultCenter];
69 [center addObserver:self
70 selector:@selector(ImeDidChangeCallback:)
71 name:NSTextInputContextKeyboardSelectionDidChangeNotification
76 - (
BOOL)acceptsFirstResponder
81 - (
BOOL)acceptsFirstMouse:(NSEvent *)event
87 - (
void)keyDown:(NSEvent *)event
90 [
self checkKeyCodeIsControlChar:event];
91 const bool ime_process = [
self isProcessedByIme];
93 const bool ime_process =
false;
101 if ([[event characters]
length] == 0 || [[event charactersIgnoringModifiers]
length] == 0 ||
106 [
self interpretKeyEvents:[NSArray arrayWithObject:event]];
108 #ifdef WITH_INPUT_IME
110 const int controlCharForKorean = (GHOST_IME_COMPOSITION_EVENT | GHOST_IME_RESULT_EVENT |
111 GHOST_IME_KEY_CONTROL_CHAR);
112 if (((ime.state_flag & controlCharForKorean) == controlCharForKorean)) {
116 ime.state_flag &= ~(GHOST_IME_COMPOSITION_EVENT | GHOST_IME_RESULT_EVENT);
118 ime.combined_result.clear();
125 - (
void)keyUp:(NSEvent *)event
130 - (
void)flagsChanged:(NSEvent *)event
135 - (
void)mouseDown:(NSEvent *)event
140 - (
void)mouseUp:(NSEvent *)event
145 - (
void)rightMouseDown:(NSEvent *)event
150 - (
void)rightMouseUp:(NSEvent *)event
155 - (
void)mouseMoved:(NSEvent *)event
160 - (
void)mouseDragged:(NSEvent *)event
165 - (
void)rightMouseDragged:(NSEvent *)event
170 - (
void)scrollWheel:(NSEvent *)event
175 - (
void)otherMouseDown:(NSEvent *)event
180 - (
void)otherMouseUp:(NSEvent *)event
185 - (
void)otherMouseDragged:(NSEvent *)event
190 - (
void)magnifyWithEvent:(NSEvent *)event
195 - (
void)smartMagnifyWithEvent:(NSEvent *)event
200 - (
void)rotateWithEvent:(NSEvent *)event
205 - (
void)tabletPoint:(NSEvent *)event
210 - (
void)tabletProximity:(NSEvent *)event
220 - (
void)drawRect:(NSRect)rect
222 if ([
self inLiveResize]) {
226 [
super drawRect:rect];
238 - (
void)composing_free
243 [composing_text release];
249 - (
void)insertText:(
id)chars replacementRange:(NSRange)replacementRange
251 [
self composing_free];
253 #ifdef WITH_INPUT_IME
254 if (ime.state_flag & GHOST_IME_ENABLED) {
255 if (!(ime.state_flag & GHOST_IME_COMPOSING)) {
256 [
self processImeEvent:GHOST_kEventImeCompositionStart];
260 if (ime.state_flag & GHOST_IME_RESULT_EVENT) {
261 ime.combined_result += [
self convertNSString:chars];
264 ime.combined_result = [
self convertNSString:chars];
267 [
self setImeResult:ime.combined_result];
271 if (![
self ime_did_composition]) {
272 [
self processImeEvent:GHOST_kEventImeComposition];
274 ime.state_flag |= GHOST_IME_RESULT_EVENT;
276 [
self processImeEvent:GHOST_kEventImeCompositionEnd];
277 ime.state_flag &= ~GHOST_IME_COMPOSING;
283 - (
void)setMarkedText:(
id)chars
284 selectedRange:(NSRange)range
285 replacementRange:(NSRange)replacementRange
287 [
self composing_free];
289 if ([chars
length] == 0) {
290 #ifdef WITH_INPUT_IME
292 if (ime.state_flag & GHOST_IME_COMPOSING) {
293 [
self setImeResult:std::string()];
294 [
self processImeEvent:GHOST_kEventImeComposition];
295 [
self processImeEvent:GHOST_kEventImeCompositionEnd];
296 ime.state_flag &= ~GHOST_IME_COMPOSING;
308 if ([chars isKindOfClass:[NSAttributedString
class]]) {
314 [
self composing_free];
316 #ifdef WITH_INPUT_IME
317 if (ime.state_flag & GHOST_IME_ENABLED) {
318 if (!(ime.state_flag & GHOST_IME_COMPOSING)) {
319 ime.state_flag |= GHOST_IME_COMPOSING;
320 [
self processImeEvent:GHOST_kEventImeCompositionStart];
323 [
self setImeComposition:composing_text selectedRange:range];
326 if (![
self ime_did_composition]) {
327 ime.state_flag |= GHOST_IME_COMPOSITION_EVENT;
328 [
self processImeEvent:GHOST_kEventImeComposition];
336 [
self composing_free];
339 - (
BOOL)hasMarkedText
344 - (
void)doCommandBySelector:(
SEL)selector
353 - (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)range
354 actualRange:(NSRangePointer)actualRange
356 return [[[NSAttributedString alloc] init] autorelease];
359 - (NSRange)markedRange
364 return NSMakeRange(0,
length);
366 return NSMakeRange(NSNotFound, 0);
369 - (NSRange)selectedRange
372 return NSMakeRange(0,
length);
376 - (NSRect)firstRectForCharacterRange:(NSRange)range actualRange:(NSRangePointer)actualRange
378 #ifdef WITH_INPUT_IME
379 if (ime.state_flag & GHOST_IME_ENABLED) {
380 return ime.candidate_window_position;
386 - (NSUInteger)characterIndexForPoint:(NSPoint)point
391 - (NSArray *)validAttributesForMarkedText
393 return [NSArray array];
396 #ifdef WITH_INPUT_IME
397 - (
void)checkImeEnabled
399 ime.state_flag &= ~GHOST_IME_ENABLED;
401 if (ime.state_flag & GHOST_IME_INPUT_FOCUSED) {
404 TISInputSourceRef currentKeyboardInputSource = TISCopyCurrentKeyboardInputSource();
405 bool ime_enabled = !CFBooleanGetValue((CFBooleanRef)TISGetInputSourceProperty(
406 currentKeyboardInputSource, kTISPropertyInputSourceIsASCIICapable));
407 CFRelease(currentKeyboardInputSource);
410 ime.state_flag |= GHOST_IME_ENABLED;
417 - (
void)ImeDidChangeCallback:(NSNotification *)notification
419 [
self checkImeEnabled];
426 ime.candidate_window_position = NSMakeRect((CGFloat)outX, (CGFloat)outY, (CGFloat)
w, (CGFloat)h);
431 ime.state_flag |= GHOST_IME_INPUT_FOCUSED;
432 [
self checkImeEnabled];
433 [
self setImeCandidateWinPos:x y:y w:w h:h];
440 ime.composite.clear();
443 [[NSTextInputContext currentInputContext] discardMarkedText];
458 - (
std::string)convertNSString:(NSString *)inString
460 NSAutoreleasePool *
pool = [[NSAutoreleasePool alloc] init];
461 std::string
str([inString UTF8String]);
466 - (
void)setImeComposition:(NSString *)inString selectedRange:(NSRange)range
468 ime.composite = [
self convertNSString:inString];
471 if (!(ime.state_flag & GHOST_IME_RESULT_EVENT)) {
477 char *front_string = (
char *)[[inString substringWithRange:NSMakeRange(0, range.location)]
479 char *selected_string = (
char *)[[inString substringWithRange:range] UTF8String];
480 ime.event.cursor_position = strlen(front_string);
481 ime.event.target_start = ime.event.cursor_position;
482 ime.event.target_end = ime.event.target_start + strlen(selected_string);
485 - (
void)setImeResult:(
std::
string)result
488 ime.composite.clear();
489 ime.event.cursor_position = -1;
490 ime.event.target_start = -1;
491 ime.event.target_end = -1;
494 - (
void)checkKeyCodeIsControlChar:(NSEvent *)event
496 ime.state_flag &= ~GHOST_IME_KEY_CONTROL_CHAR;
499 if ([event modifierFlags] & (NSEventModifierFlagCommand | NSEventModifierFlagControl)) {
500 ime.state_flag |= GHOST_IME_KEY_CONTROL_CHAR;
505 switch ([event keyCode]) {
506 case kVK_ANSI_KeypadEnter:
507 case kVK_ANSI_KeypadClear:
534 case kVK_ForwardDelete:
544 ime.state_flag |= GHOST_IME_KEY_CONTROL_CHAR;
549 - (
bool)ime_did_composition
551 return (ime.state_flag & GHOST_IME_COMPOSITION_EVENT) ||
552 (ime.state_flag & GHOST_IME_RESULT_EVENT);
557 - (
bool)isProcessedByIme
560 (ime.state_flag & GHOST_IME_ENABLED) &&
561 ((ime.state_flag & GHOST_IME_COMPOSING) || !(ime.state_flag & GHOST_IME_KEY_CONTROL_CHAR)));
NSNotificationCenter * center
void * GHOST_TUserDataPtr
@ GHOST_kEventWindowUpdate
#define COCOA_VIEW_BASE_CLASS
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
GHOST_TSuccess handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa *window)
GHOST_TSuccess handleMouseEvent(void *eventPtr)
GHOST_TSuccess handleKeyEvent(void *eventPtr)
GHOST_TSuccess handleTabletEvent(void *eventPtr, short eventType)
uint64_t getMilliSeconds() const
GHOST_TSuccess pushEvent(GHOST_IEvent *event)
bool getImmediateDraw(void) const
void clientToScreen(int32_t inX, int32_t inY, int32_t &outX, int32_t &outY) const
SyclQueue void void size_t num_bytes void
GHOST_SystemCocoa * systemCocoa
NSString * composing_text
GHOST_WindowCocoa * associatedWindow
T length(const vec_base< T, Size > &a)