summaryrefslogtreecommitdiff
path: root/cocoa
diff options
context:
space:
mode:
authorSven Weidauer <sven.weidauer@gmail.com>2011-01-14 16:54:39 +0000
committerSven Weidauer <sven.weidauer@gmail.com>2011-01-14 16:54:39 +0000
commit30d9439781bc7429c414438b6ca140f90fd45223 (patch)
treed5cb713d09b3189037c6f6520e5e56f24ce7ea87 /cocoa
parentecc314c694d3fa735855d10d57770ba447332816 (diff)
downloadnetsurf-30d9439781bc7429c414438b6ca140f90fd45223.tar.gz
netsurf-30d9439781bc7429c414438b6ca140f90fd45223.tar.bz2
Better mouse handling for browser
svn path=/trunk/netsurf/; revision=11318
Diffstat (limited to 'cocoa')
-rw-r--r--cocoa/BrowserView.h3
-rw-r--r--cocoa/BrowserView.m42
2 files changed, 42 insertions, 3 deletions
diff --git a/cocoa/BrowserView.h b/cocoa/BrowserView.h
index 9598936c1..ca09e7e30 100644
--- a/cocoa/BrowserView.h
+++ b/cocoa/BrowserView.h
@@ -29,6 +29,9 @@
BOOL caretVisible;
BOOL hasCaret;
NSTimer *caretTimer;
+
+ BOOL isDragging;
+ NSPoint dragStart;
}
@property (readwrite, assign, nonatomic) struct browser_window *browser;
diff --git a/cocoa/BrowserView.m b/cocoa/BrowserView.m
index d26fc8bdd..e2112cf95 100644
--- a/cocoa/BrowserView.m
+++ b/cocoa/BrowserView.m
@@ -122,28 +122,64 @@ static inline NSRect cocoa_get_caret_rect( BrowserView *view )
return YES;
}
+static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
+{
+ browser_mouse_state result = 0;
+
+ NSUInteger flags = [evt modifierFlags];
+
+ if (flags & NSShiftKeyMask) result |= BROWSER_MOUSE_MOD_1;
+ if (flags & NSAlternateKeyMask) result |= BROWSER_MOUSE_MOD_2;
+
+ return result;
+}
+
- (void) mouseDown: (NSEvent *)theEvent;
{
NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
+ dragStart = location;
- browser_window_mouse_click( browser, BROWSER_MOUSE_PRESS_1, location.x, location.y );
+ browser_window_mouse_click( browser, BROWSER_MOUSE_PRESS_1 | cocoa_mouse_flags_for_event( theEvent ), location.x, location.y );
}
- (void) mouseUp: (NSEvent *)theEvent;
{
NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
+
+ browser_mouse_state modifierFlags = cocoa_mouse_flags_for_event( theEvent );
- browser_window_mouse_click( browser, BROWSER_MOUSE_CLICK_1, location.x, location.y );
+ if (isDragging) {
+ isDragging = NO;
+ browser_window_mouse_drag_end( browser, modifierFlags, location.x, location.y );
+ } else {
+ browser_window_mouse_click( browser, BROWSER_MOUSE_CLICK_1 | modifierFlags, location.x, location.y );
+ }
}
+#define squared(x) ((x)*(x))
+#define MinDragDistance (5.0)
+
- (void) mouseDragged: (NSEvent *)theEvent;
{
+ NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
+
+ if (!isDragging) {
+ const CGFloat distance = squared( dragStart.x - location.x ) + squared( dragStart.y - location.y );
+ if (distance >= squared( MinDragDistance)) isDragging = YES;
+ }
+
+ if (isDragging) {
+ browser_mouse_state modifierFlags = cocoa_mouse_flags_for_event( theEvent );
+ browser_window_mouse_click( browser, BROWSER_MOUSE_DRAG_1 | modifierFlags, location.x, location.y );
+ browser_window_mouse_track( browser, BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON | modifierFlags, location.x, location.y );
+ }
}
- (void) mouseMoved: (NSEvent *)theEvent;
{
NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
- browser_window_mouse_click( browser, 0, location.x, location.y );
+
+ browser_window_mouse_track( browser, cocoa_mouse_flags_for_event( theEvent ), location.x, location.y );
}
- (void) keyDown: (NSEvent *)theEvent;