mirror of
https://github.com/macvim-dev/macvim.git
synced 2026-06-07 15:37:14 +02:00
Mouse cursor is set to arrow when outside text view
git-svn-id: http://macvim.googlecode.com/svn/trunk@181 96c4425d-ca35-0410-94e5-3396d5c13a8f
This commit is contained in:
@@ -1249,6 +1249,10 @@ static int specialKeyToNSKey(int key);
|
||||
int col = *((int*)bytes); bytes += sizeof(int);
|
||||
|
||||
gui_mouse_moved(col, row);
|
||||
} else if (SetMouseShapeMsgID == msgid) {
|
||||
const void *bytes = [data bytes];
|
||||
int shape = *((int*)bytes); bytes += sizeof(int);
|
||||
update_mouseshape(shape);
|
||||
} else {
|
||||
NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid);
|
||||
}
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
@interface MMTextView : NSTextView {
|
||||
BOOL shouldDrawInsertionPoint;
|
||||
NSEvent *lastMouseDownEvent;
|
||||
//NSTrackingRectTag trackingRectTag;
|
||||
NSTrackingRectTag trackingRectTag;
|
||||
}
|
||||
|
||||
- (NSEvent *)lastMouseDownEvent;
|
||||
|
||||
+83
-15
@@ -18,6 +18,7 @@
|
||||
|
||||
@interface MMTextView (Private)
|
||||
- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column;
|
||||
- (NSRect)trackingRect;
|
||||
- (void)dispatchKeyEvent:(NSEvent *)event;
|
||||
- (MMVimController *)vimController;
|
||||
@end
|
||||
@@ -262,54 +263,85 @@
|
||||
|
||||
- (void)mouseMoved:(NSEvent *)event
|
||||
{
|
||||
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
|
||||
if (!ts) return;
|
||||
|
||||
NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil];
|
||||
int row, col;
|
||||
if (![self convertPoint:pt toRow:&row column:&col])
|
||||
return;
|
||||
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
// HACK! It seems impossible to get the tracking rects set up before the
|
||||
// view is visible, which means that the first mouseEntered: or
|
||||
// mouseExited: events are never received. This forces us to check if the
|
||||
// mouseMoved: event really happened over the text.
|
||||
int rows, cols;
|
||||
[ts getMaxRows:&rows columns:&cols];
|
||||
if (row >= 0 && row < rows && col >= 0 && col < cols) {
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
|
||||
[data appendBytes:&row length:sizeof(int)];
|
||||
[data appendBytes:&col length:sizeof(int)];
|
||||
[data appendBytes:&row length:sizeof(int)];
|
||||
[data appendBytes:&col length:sizeof(int)];
|
||||
|
||||
[[self vimController] sendMessage:MouseMovedMsgID data:data wait:NO];
|
||||
[[self vimController] sendMessage:MouseMovedMsgID data:data wait:NO];
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
- (void)mouseEntered:(NSEvent *)event
|
||||
{
|
||||
NSLog(@"%s", _cmd);
|
||||
//NSLog(@"%s", _cmd);
|
||||
[[self window] setAcceptsMouseMovedEvents:YES];
|
||||
}
|
||||
|
||||
- (void)mouseExited:(NSEvent *)event
|
||||
{
|
||||
NSLog(@"%s", _cmd);
|
||||
//NSLog(@"%s", _cmd);
|
||||
|
||||
int shape = 0;
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
|
||||
[[self window] setAcceptsMouseMovedEvents:NO];
|
||||
[[NSCursor arrowCursor] set];
|
||||
|
||||
[data appendBytes:&shape length:sizeof(int)];
|
||||
[[self vimController] sendMessage:SetMouseShapeMsgID data:data wait:NO];
|
||||
}
|
||||
|
||||
- (void)setFrame:(NSRect)frame
|
||||
{
|
||||
NSLog(@"%s", _cmd);
|
||||
//NSLog(@"%s", _cmd);
|
||||
|
||||
// NOTE: Set a tracking rect which covers the text view. While the mouse
|
||||
// cursor is in this rect the view will receive 'mouseMoved:' events so
|
||||
// that Vim can take care of updating the mouse cursor.
|
||||
// When the frame changes we also need to update the tracking rect.
|
||||
[super setFrame:frame];
|
||||
[self removeTrackingRect:trackingRectTag];
|
||||
trackingRectTag = [self addTrackingRect:frame owner:self userData:NULL
|
||||
assumeInside:YES];
|
||||
trackingRectTag = [self addTrackingRect:[self trackingRect] owner:self
|
||||
userData:NULL assumeInside:YES];
|
||||
}
|
||||
|
||||
- (void)viewDidMoveToWindow
|
||||
{
|
||||
//NSLog(@"%s (window=%@)", _cmd, [self window]);
|
||||
|
||||
// Set a tracking rect which covers the text.
|
||||
// NOTE: While the mouse cursor is in this rect the view will receive
|
||||
// 'mouseMoved:' events so that Vim can take care of updating the mouse
|
||||
// cursor.
|
||||
if ([self window]) {
|
||||
[[self window] setAcceptsMouseMovedEvents:YES];
|
||||
trackingRectTag = [self addTrackingRect:[self trackingRect] owner:self
|
||||
userData:NULL assumeInside:YES];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)viewWillMoveToWindow:(NSWindow *)newWindow
|
||||
{
|
||||
//NSLog(@"%s%@", _cmd, newWindow);
|
||||
|
||||
// Remove tracking rect if view moves or is removed.
|
||||
if ([self window] && trackingRectTag) {
|
||||
[self removeTrackingRect:trackingRectTag];
|
||||
trackingRectTag = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
- (NSMenu*)menuForEvent:(NSEvent *)event
|
||||
{
|
||||
@@ -444,6 +476,7 @@
|
||||
|
||||
- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column
|
||||
{
|
||||
#if 0
|
||||
NSLayoutManager *lm = [self layoutManager];
|
||||
NSTextContainer *tc = [self textContainer];
|
||||
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
|
||||
@@ -459,7 +492,42 @@
|
||||
if (row) *row = (int)(charIdx / mod);
|
||||
if (column) *column = (int)(charIdx % mod);
|
||||
|
||||
NSLog(@"convertPoint:%@ toRow:%d column:%d", NSStringFromPoint(point),
|
||||
*row, *column);
|
||||
|
||||
return YES;
|
||||
#else
|
||||
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
|
||||
NSSize cellSize = [ts cellSize];
|
||||
if (!(cellSize.width > 0 && cellSize.height > 0))
|
||||
return NO;
|
||||
NSPoint origin = [self textContainerOrigin];
|
||||
|
||||
if (row) *row = floor((point.y-origin.y-1) / cellSize.height);
|
||||
if (column) *column = floor((point.x-origin.x-1) / cellSize.width);
|
||||
|
||||
//NSLog(@"convertPoint:%@ toRow:%d column:%d", NSStringFromPoint(point),
|
||||
// *row, *column);
|
||||
|
||||
return YES;
|
||||
#endif
|
||||
}
|
||||
|
||||
- (NSRect)trackingRect
|
||||
{
|
||||
NSRect rect = [self frame];
|
||||
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
|
||||
int left = [ud integerForKey:MMTextInsetLeftKey];
|
||||
int top = [ud integerForKey:MMTextInsetTopKey];
|
||||
int right = [ud integerForKey:MMTextInsetRightKey];
|
||||
int bot = [ud integerForKey:MMTextInsetBottomKey];
|
||||
|
||||
rect.origin.x = left;
|
||||
rect.origin.y = top;
|
||||
rect.size.width -= left + right - 1;
|
||||
rect.size.height -= top + bot - 1;
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
- (void)keyDown:(NSEvent *)event
|
||||
|
||||
@@ -283,7 +283,7 @@ NSMutableArray *buildMenuAddress(NSMenu *menu)
|
||||
|
||||
[self addNewTabViewItem];
|
||||
|
||||
[[self window] setAcceptsMouseMovedEvents:YES];
|
||||
//[[self window] setAcceptsMouseMovedEvents:YES];
|
||||
|
||||
setupDone = YES;
|
||||
|
||||
|
||||
@@ -1097,6 +1097,7 @@ gui_mch_get_winpos(int *x, int *y)
|
||||
void
|
||||
gui_mch_getmouse(int *x, int *y)
|
||||
{
|
||||
//NSLog(@"gui_mch_getmouse()");
|
||||
}
|
||||
|
||||
|
||||
@@ -1248,6 +1249,7 @@ gui_mch_set_winpos(int x, int y)
|
||||
void
|
||||
gui_mch_setmouse(int x, int y)
|
||||
{
|
||||
//NSLog(@"gui_mch_setmouse(x=%d, y=%d)", x, y);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user