Skip to content

Commit 73fdad8

Browse files
committed
Enable moving caret position by mouse click
1 parent ce9d544 commit 73fdad8

4 files changed

+62
-21
lines changed

SquirrelConfig.m

+8-8
Original file line numberDiff line numberDiff line change
@@ -189,15 +189,15 @@ - (NSColor*)colorFromString:(NSString*)string {
189189
sscanf(string.UTF8String, "0x%02x%02x%02x", &b, &g, &r);
190190
}
191191
if ([self.colorSpace isEqualToString:@"display_p3"]) {
192-
return [NSColor colorWithDisplayP3Red:r / 255.0
193-
green:g / 255.0
194-
blue:b / 255.0
195-
alpha:a / 255.0];
192+
return [NSColor colorWithDisplayP3Red:(CGFloat)r / 255.
193+
green:(CGFloat)g / 255.
194+
blue:(CGFloat)b / 255.
195+
alpha:(CGFloat)a / 255.];
196196
} else { // sRGB by default
197-
return [NSColor colorWithSRGBRed:r / 255.0
198-
green:g / 255.0
199-
blue:b / 255.0
200-
alpha:a / 255.0];
197+
return [NSColor colorWithSRGBRed:(CGFloat)r / 255.
198+
green:(CGFloat)g / 255.
199+
blue:(CGFloat)b / 255.
200+
alpha:(CGFloat)a / 255.];
201201
}
202202
}
203203

SquirrelInputController.h

+1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33

44
@interface SquirrelInputController : IMKInputController
55
- (BOOL)selectCandidate:(NSInteger)index;
6+
- (BOOL)moveCaret:(BOOL)forward;
67
- (BOOL)pageUp:(BOOL)up;
78
@end

SquirrelInputController.m

+18
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,24 @@ - (BOOL)pageUp:(BOOL)up {
253253
return handled;
254254
}
255255

256+
- (BOOL)moveCaret:(BOOL)forward {
257+
size_t current_caret_pos = rime_get_api()->get_caret_pos(_session);
258+
const char* input = rime_get_api()->get_input(_session);
259+
if (forward) {
260+
if (current_caret_pos <= 0) {
261+
return NO;
262+
}
263+
rime_get_api()->set_caret_pos(_session, current_caret_pos - 1);
264+
} else {
265+
if (current_caret_pos >= strlen(input)) {
266+
return NO;
267+
}
268+
rime_get_api()->set_caret_pos(_session, current_caret_pos + 1);
269+
}
270+
[self rimeUpdate];
271+
return YES;
272+
}
273+
256274
- (void)onChordTimer:(NSTimer*)timer {
257275
// chord release triggered by timer
258276
int processed_keys = 0;

SquirrelPanel.m

+35-13
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,10 @@ - (void)drawRect:(NSRect)dirtyRect {
829829
CGPathRef preeditPath = CGPathCreateMutable();
830830
SquirrelTheme* theme = self.currentTheme;
831831

832+
NSPoint textFieldOrigin = dirtyRect.origin;
833+
textFieldOrigin.y += theme.edgeInset.height;
834+
textFieldOrigin.x += theme.edgeInset.width;
835+
832836
// Draw preedit Rect
833837
NSRect backgroundRect = dirtyRect;
834838
NSRect containingRect = dirtyRect;
@@ -1026,9 +1030,13 @@ - (void)drawRect:(NSRect)dirtyRect {
10261030
}
10271031
[panelLayer addSublayer:layer];
10281032
}
1033+
[_textView
1034+
setTextContainerInset:NSMakeSize(textFieldOrigin.x, textFieldOrigin.y)];
10291035
}
10301036

1031-
- (BOOL)clickAtPoint:(NSPoint)_point index:(NSInteger*)_index {
1037+
- (BOOL)clickAtPoint:(NSPoint)_point
1038+
index:(NSInteger*)_index
1039+
preeditIndex:(NSInteger*)_preeditIndex {
10321040
if (CGPathContainsPoint(_shape.path, nil, _point, NO)) {
10331041
NSPoint point =
10341042
NSMakePoint(_point.x - self.textView.textContainerInset.width,
@@ -1047,11 +1055,20 @@ - (BOOL)clickAtPoint:(NSPoint)_point index:(NSInteger*)_index {
10471055
point = NSMakePoint(point.x - NSMinX(lineFragment.typographicBounds),
10481056
point.y - NSMinY(lineFragment.typographicBounds));
10491057
index += [lineFragment characterIndexForPoint:point];
1050-
for (NSUInteger i = 0; i < _candidateRanges.count; i += 1) {
1051-
NSRange range = [_candidateRanges[i] rangeValue];
1052-
if (index >= range.location && index < NSMaxRange(range)) {
1053-
*_index = i;
1054-
break;
1058+
if (index >= _preeditRange.location &&
1059+
index < NSMaxRange(_preeditRange)) {
1060+
if (_preeditIndex) {
1061+
*_preeditIndex = index;
1062+
}
1063+
} else {
1064+
for (NSUInteger i = 0; i < _candidateRanges.count; i += 1) {
1065+
NSRange range = [_candidateRanges[i] rangeValue];
1066+
if (index >= range.location && index < NSMaxRange(range)) {
1067+
if (_index) {
1068+
*_index = i;
1069+
}
1070+
break;
1071+
}
10551072
}
10561073
}
10571074
break;
@@ -1227,7 +1244,7 @@ - (void)sendEvent:(NSEvent*)event {
12271244
case NSEventTypeLeftMouseDown: {
12281245
NSPoint point = [self mousePosition];
12291246
NSInteger index = -1;
1230-
if ([_view clickAtPoint:point index:&index]) {
1247+
if ([_view clickAtPoint:point index:&index preeditIndex:nil]) {
12311248
if (index >= 0 && index < _candidates.count) {
12321249
_index = index;
12331250
}
@@ -1236,7 +1253,15 @@ - (void)sendEvent:(NSEvent*)event {
12361253
case NSEventTypeLeftMouseUp: {
12371254
NSPoint point = [self mousePosition];
12381255
NSInteger index = -1;
1239-
if ([_view clickAtPoint:point index:&index]) {
1256+
NSInteger preeditIndex = -1;
1257+
if ([_view clickAtPoint:point index:&index preeditIndex:&preeditIndex]) {
1258+
if (preeditIndex >= 0 && preeditIndex < _preedit.length) {
1259+
if (preeditIndex < _caretPos) {
1260+
[_inputController moveCaret:YES];
1261+
} else if (preeditIndex > _caretPos) {
1262+
[_inputController moveCaret:NO];
1263+
}
1264+
}
12401265
if (index >= 0 && index < _candidates.count && index == _index) {
12411266
[_inputController selectCandidate:index];
12421267
}
@@ -1261,7 +1286,7 @@ - (void)sendEvent:(NSEvent*)event {
12611286
case NSEventTypeMouseMoved: {
12621287
NSPoint point = [self mousePosition];
12631288
NSInteger index = -1;
1264-
if ([_view clickAtPoint:point index:&index]) {
1289+
if ([_view clickAtPoint:point index:&index preeditIndex:nil]) {
12651290
if (index >= 0 && index < _candidates.count && _cursorIndex != index) {
12661291
[self showPreedit:_preedit
12671292
selRange:_selRange
@@ -1459,12 +1484,9 @@ - (void)show {
14591484
[self.contentView setBoundsOrigin:NSMakePoint(0, 0)];
14601485
[_view.textView setBoundsOrigin:NSMakePoint(0, 0)];
14611486
}
1487+
BOOL translucency = theme.translucency;
14621488
[_view setFrame:self.contentView.bounds];
14631489
[_view.textView setFrame:self.contentView.bounds];
1464-
[_view.textView setTextContainerInset:NSMakeSize(theme.edgeInset.width,
1465-
theme.edgeInset.height)];
1466-
1467-
BOOL translucency = theme.translucency;
14681490
if (translucency) {
14691491
[_back setFrame:self.contentView.bounds];
14701492
_back.appearance = NSApp.effectiveAppearance;

0 commit comments

Comments
 (0)