Merged trunk 46229 (NOTE: CVS) inside #if 0 pending research into how to do it in an ABI-compatible way:
Implement mouse entered, exited, and synthesize move events while the mouse is inside. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@47792 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -37,6 +37,9 @@ public:
|
|||||||
virtual wxWindow* GetWxWindow() const
|
virtual wxWindow* GetWxWindow() const
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
virtual void Cocoa_FrameChanged(void) = 0;
|
virtual void Cocoa_FrameChanged(void) = 0;
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
virtual void Cocoa_synthesizeMouseMoved(void) = 0;
|
||||||
|
#endif
|
||||||
virtual bool Cocoa_acceptsFirstMouse(bool &acceptsFirstMouse, WX_NSEvent theEvent)
|
virtual bool Cocoa_acceptsFirstMouse(bool &acceptsFirstMouse, WX_NSEvent theEvent)
|
||||||
{ return false; }
|
{ return false; }
|
||||||
virtual bool Cocoa_drawRect(const NSRect &rect)
|
virtual bool Cocoa_drawRect(const NSRect &rect)
|
||||||
@@ -67,6 +70,12 @@ public:
|
|||||||
{ return false; }
|
{ return false; }
|
||||||
virtual bool Cocoa_resetCursorRects()
|
virtual bool Cocoa_resetCursorRects()
|
||||||
{ return false; }
|
{ return false; }
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
virtual bool Cocoa_viewDidMoveToWindow()
|
||||||
|
{ return false; }
|
||||||
|
virtual bool Cocoa_viewWillMoveToWindow(WX_NSWindow newWindow)
|
||||||
|
{ return false; }
|
||||||
|
#endif
|
||||||
virtual ~wxCocoaNSView() { }
|
virtual ~wxCocoaNSView() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -37,6 +37,8 @@
|
|||||||
- (void)otherMouseDragged:(NSEvent *)theEvent;
|
- (void)otherMouseDragged:(NSEvent *)theEvent;
|
||||||
- (void)otherMouseUp:(NSEvent *)theEvent;
|
- (void)otherMouseUp:(NSEvent *)theEvent;
|
||||||
- (void)resetCursorRects;
|
- (void)resetCursorRects;
|
||||||
|
- (void)viewDidMoveToWindow;
|
||||||
|
- (void)viewWillMoveToWindow:(NSWindow *)newWindow;
|
||||||
@end // WXNSView
|
@end // WXNSView
|
||||||
WX_DECLARE_GET_OBJC_CLASS(WXNSView,NSView)
|
WX_DECLARE_GET_OBJC_CLASS(WXNSView,NSView)
|
||||||
|
|
||||||
|
38
include/wx/cocoa/trackingrectmanager.h
Normal file
38
include/wx/cocoa/trackingrectmanager.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: wx/cocoa/trackingrectmanager.h
|
||||||
|
// Purpose: wxCocoaTrackingRectManager
|
||||||
|
// Notes: Source in window.mm
|
||||||
|
// Author: David Elliott <dfe@cox.net>
|
||||||
|
// Modified by:
|
||||||
|
// Created: 2007/05/02
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 2007 Software 2000 Ltd.
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#ifndef __WX_COCOA_TRACKINGRECTMANAGER_H__
|
||||||
|
#define __WX_COCOA_TRACKINGRECTMANAGER_H__
|
||||||
|
|
||||||
|
#include <CoreFoundation/CFRunLoop.h>
|
||||||
|
|
||||||
|
class wxCocoaTrackingRectManager
|
||||||
|
{
|
||||||
|
DECLARE_NO_COPY_CLASS(wxCocoaTrackingRectManager)
|
||||||
|
public:
|
||||||
|
wxCocoaTrackingRectManager(wxWindow *window);
|
||||||
|
void ClearTrackingRect();
|
||||||
|
void BuildTrackingRect();
|
||||||
|
void RebuildTrackingRect();
|
||||||
|
bool IsOwnerOfEvent(NSEvent *anEvent);
|
||||||
|
~wxCocoaTrackingRectManager();
|
||||||
|
void BeginSynthesizingEvents();
|
||||||
|
void StopSynthesizingEvents();
|
||||||
|
protected:
|
||||||
|
wxWindow *m_window;
|
||||||
|
bool m_isTrackingRectActive;
|
||||||
|
int m_trackingRectTag;
|
||||||
|
CFRunLoopObserverRef m_runLoopObserver;
|
||||||
|
private:
|
||||||
|
wxCocoaTrackingRectManager();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ndef __WX_COCOA_TRACKINGRECTMANAGER_H__
|
@@ -22,6 +22,7 @@ DECLARE_WXCOCOA_OBJC_CLASS(NSAffineTransform);
|
|||||||
|
|
||||||
class wxWindowCocoaHider;
|
class wxWindowCocoaHider;
|
||||||
class wxWindowCocoaScrollView;
|
class wxWindowCocoaScrollView;
|
||||||
|
class wxCocoaTrackingRectManager;
|
||||||
|
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
// wxWindowCocoa
|
// wxWindowCocoa
|
||||||
@@ -33,6 +34,7 @@ class WXDLLEXPORT wxWindowCocoa: public wxWindowBase, protected wxCocoaNSView
|
|||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
friend wxWindow *wxWindowBase::GetCapture();
|
friend wxWindow *wxWindowBase::GetCapture();
|
||||||
friend class wxWindowCocoaScrollView;
|
friend class wxWindowCocoaScrollView;
|
||||||
|
friend class wxCocoaTrackingRectManager;
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// initialization
|
// initialization
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@@ -93,6 +95,11 @@ protected:
|
|||||||
void InitMouseEvent(wxMouseEvent &event, WX_NSEvent cocoaEvent);
|
void InitMouseEvent(wxMouseEvent &event, WX_NSEvent cocoaEvent);
|
||||||
virtual wxWindow* GetWxWindow() const;
|
virtual wxWindow* GetWxWindow() const;
|
||||||
virtual void Cocoa_FrameChanged(void);
|
virtual void Cocoa_FrameChanged(void);
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
virtual void Cocoa_synthesizeMouseMoved(void);
|
||||||
|
#else
|
||||||
|
void Cocoa_synthesizeMouseMoved(void);
|
||||||
|
#endif
|
||||||
virtual bool Cocoa_drawRect(const NSRect &rect);
|
virtual bool Cocoa_drawRect(const NSRect &rect);
|
||||||
virtual bool Cocoa_mouseDown(WX_NSEvent theEvent);
|
virtual bool Cocoa_mouseDown(WX_NSEvent theEvent);
|
||||||
virtual bool Cocoa_mouseDragged(WX_NSEvent theEvent);
|
virtual bool Cocoa_mouseDragged(WX_NSEvent theEvent);
|
||||||
@@ -107,11 +114,18 @@ protected:
|
|||||||
virtual bool Cocoa_otherMouseDragged(WX_NSEvent theEvent);
|
virtual bool Cocoa_otherMouseDragged(WX_NSEvent theEvent);
|
||||||
virtual bool Cocoa_otherMouseUp(WX_NSEvent theEvent);
|
virtual bool Cocoa_otherMouseUp(WX_NSEvent theEvent);
|
||||||
virtual bool Cocoa_resetCursorRects();
|
virtual bool Cocoa_resetCursorRects();
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
virtual bool Cocoa_viewDidMoveToWindow();
|
||||||
|
virtual bool Cocoa_viewWillMoveToWindow(WX_NSWindow newWindow);
|
||||||
|
#endif
|
||||||
void SetNSView(WX_NSView cocoaNSView);
|
void SetNSView(WX_NSView cocoaNSView);
|
||||||
WX_NSView m_cocoaNSView;
|
WX_NSView m_cocoaNSView;
|
||||||
wxWindowCocoaHider *m_cocoaHider;
|
wxWindowCocoaHider *m_cocoaHider;
|
||||||
wxWindowCocoaScrollView *m_wxCocoaScrollView;
|
wxWindowCocoaScrollView *m_wxCocoaScrollView;
|
||||||
bool m_isInPaint;
|
bool m_isInPaint;
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
wxCocoaTrackingRectManager *m_visibleTrackingRectManager;
|
||||||
|
#endif
|
||||||
static wxWindow *sm_capturedWindow;
|
static wxWindow *sm_capturedWindow;
|
||||||
virtual void CocoaReplaceView(WX_NSView oldView, WX_NSView newView);
|
virtual void CocoaReplaceView(WX_NSView oldView, WX_NSView newView);
|
||||||
void SetInitialFrameRect(const wxPoint& pos, const wxSize& size);
|
void SetInitialFrameRect(const wxPoint& pos, const wxSize& size);
|
||||||
|
@@ -166,6 +166,24 @@ void wxCocoaNSView::DisassociateNSView(WX_NSView cocoaNSView)
|
|||||||
[super resetCursorRects];
|
[super resetCursorRects];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)viewDidMoveToWindow
|
||||||
|
{
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
wxCocoaNSView *win = wxCocoaNSView::GetFromCocoa(self);
|
||||||
|
if( !win || !win->Cocoa_viewDidMoveToWindow() )
|
||||||
|
#endif
|
||||||
|
[super viewDidMoveToWindow];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewWillMoveToWindow:(NSWindow *)newWindow
|
||||||
|
{
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
wxCocoaNSView *win = wxCocoaNSView::GetFromCocoa(self);
|
||||||
|
if( !win || !win->Cocoa_viewWillMoveToWindow(newWindow) )
|
||||||
|
#endif
|
||||||
|
[super viewWillMoveToWindow:newWindow];
|
||||||
|
}
|
||||||
|
|
||||||
@end // implementation WXNSView
|
@end // implementation WXNSView
|
||||||
WX_IMPLEMENT_GET_OBJC_CLASS(WXNSView,NSView)
|
WX_IMPLEMENT_GET_OBJC_CLASS(WXNSView,NSView)
|
||||||
|
|
||||||
@@ -178,6 +196,7 @@ WX_IMPLEMENT_GET_OBJC_CLASS(WXNSView,NSView)
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)notificationFrameChanged: (NSNotification *)notification;
|
- (void)notificationFrameChanged: (NSNotification *)notification;
|
||||||
|
- (void)synthesizeMouseMovedForView: (NSView *)theView;
|
||||||
@end // interface wxNSViewNotificationObserver
|
@end // interface wxNSViewNotificationObserver
|
||||||
WX_DECLARE_GET_OBJC_CLASS(wxNSViewNotificationObserver,NSObject)
|
WX_DECLARE_GET_OBJC_CLASS(wxNSViewNotificationObserver,NSObject)
|
||||||
|
|
||||||
@@ -190,6 +209,15 @@ WX_DECLARE_GET_OBJC_CLASS(wxNSViewNotificationObserver,NSObject)
|
|||||||
win->Cocoa_FrameChanged();
|
win->Cocoa_FrameChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)synthesizeMouseMovedForView: (NSView *)theView
|
||||||
|
{
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
wxCocoaNSView *win = wxCocoaNSView::GetFromCocoa(theView);
|
||||||
|
wxCHECK_RET(win,wxT("synthesizeMouseMovedForView received but no wxWindow exists"));
|
||||||
|
win->Cocoa_synthesizeMouseMoved();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
@end // implementation wxNSViewNotificationObserver
|
@end // implementation wxNSViewNotificationObserver
|
||||||
WX_IMPLEMENT_GET_OBJC_CLASS(wxNSViewNotificationObserver,NSObject)
|
WX_IMPLEMENT_GET_OBJC_CLASS(wxNSViewNotificationObserver,NSObject)
|
||||||
|
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include "wx/cocoa/string.h"
|
#include "wx/cocoa/string.h"
|
||||||
#include "wx/cocoa/autorelease.h"
|
#include "wx/cocoa/autorelease.h"
|
||||||
|
#include "wx/cocoa/trackingrectmanager.h"
|
||||||
#include "wx/cocoa/objc/objc_uniquifying.h"
|
#include "wx/cocoa/objc/objc_uniquifying.h"
|
||||||
|
|
||||||
#import <AppKit/NSControl.h>
|
#import <AppKit/NSControl.h>
|
||||||
@@ -46,6 +47,8 @@
|
|||||||
- (void)otherMouseDragged:(NSEvent *)theEvent;
|
- (void)otherMouseDragged:(NSEvent *)theEvent;
|
||||||
- (void)otherMouseUp:(NSEvent *)theEvent;
|
- (void)otherMouseUp:(NSEvent *)theEvent;
|
||||||
- (void)resetCursorRects;
|
- (void)resetCursorRects;
|
||||||
|
- (void)viewDidMoveToWindow;
|
||||||
|
- (void)viewWillMoveToWindow:(NSWindow *)newWindow;
|
||||||
@end // wxNonControlNSControl
|
@end // wxNonControlNSControl
|
||||||
WX_DECLARE_GET_OBJC_CLASS(wxNonControlNSControl,NSControl)
|
WX_DECLARE_GET_OBJC_CLASS(wxNonControlNSControl,NSControl)
|
||||||
|
|
||||||
@@ -171,6 +174,24 @@ WX_DECLARE_GET_OBJC_CLASS(wxNonControlNSControl,NSControl)
|
|||||||
[super resetCursorRects];
|
[super resetCursorRects];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)viewDidMoveToWindow
|
||||||
|
{
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
wxCocoaNSView *win = wxCocoaNSView::GetFromCocoa(self);
|
||||||
|
if( !win || !win->Cocoa_viewDidMoveToWindow() )
|
||||||
|
#endif
|
||||||
|
[super viewDidMoveToWindow];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewWillMoveToWindow:(NSWindow *)newWindow
|
||||||
|
{
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
wxCocoaNSView *win = wxCocoaNSView::GetFromCocoa(self);
|
||||||
|
if( !win || !win->Cocoa_viewWillMoveToWindow(newWindow) )
|
||||||
|
#endif
|
||||||
|
[super viewWillMoveToWindow:newWindow];
|
||||||
|
}
|
||||||
|
|
||||||
@end // wxNonControlNSControl
|
@end // wxNonControlNSControl
|
||||||
WX_IMPLEMENT_GET_OBJC_CLASS(wxNonControlNSControl,NSControl)
|
WX_IMPLEMENT_GET_OBJC_CLASS(wxNonControlNSControl,NSControl)
|
||||||
|
|
||||||
@@ -199,6 +220,11 @@ bool wxControl::Create(wxWindow *parent, wxWindowID winid,
|
|||||||
m_parent->CocoaAddChild(this);
|
m_parent->CocoaAddChild(this);
|
||||||
SetInitialFrameRect(pos,size);
|
SetInitialFrameRect(pos,size);
|
||||||
|
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
// Controls should have a viewable-area tracking rect by default
|
||||||
|
m_visibleTrackingRectManager = new wxCocoaTrackingRectManager(this);
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,8 +22,10 @@
|
|||||||
|
|
||||||
#include "wx/cocoa/autorelease.h"
|
#include "wx/cocoa/autorelease.h"
|
||||||
#include "wx/cocoa/string.h"
|
#include "wx/cocoa/string.h"
|
||||||
|
#include "wx/cocoa/trackingrectmanager.h"
|
||||||
|
|
||||||
#import <Foundation/NSArray.h>
|
#import <Foundation/NSArray.h>
|
||||||
|
#import <Foundation/NSRunLoop.h>
|
||||||
#include "wx/cocoa/objc/NSView.h"
|
#include "wx/cocoa/objc/NSView.h"
|
||||||
#import <AppKit/NSEvent.h>
|
#import <AppKit/NSEvent.h>
|
||||||
#import <AppKit/NSScrollView.h>
|
#import <AppKit/NSScrollView.h>
|
||||||
@@ -123,6 +125,7 @@ protected:
|
|||||||
wxWindowCocoa *m_owner;
|
wxWindowCocoa *m_owner;
|
||||||
WX_NSView m_dummyNSView;
|
WX_NSView m_dummyNSView;
|
||||||
virtual void Cocoa_FrameChanged(void);
|
virtual void Cocoa_FrameChanged(void);
|
||||||
|
// virtual void Cocoa_synthesizeMouseMoved(void) {}
|
||||||
#ifdef WXCOCOA_FILL_DUMMY_VIEW
|
#ifdef WXCOCOA_FILL_DUMMY_VIEW
|
||||||
virtual bool Cocoa_drawRect(const NSRect& rect);
|
virtual bool Cocoa_drawRect(const NSRect& rect);
|
||||||
#endif //def WXCOCOA_FILL_DUMMY_VIEW
|
#endif //def WXCOCOA_FILL_DUMMY_VIEW
|
||||||
@@ -148,6 +151,7 @@ protected:
|
|||||||
wxWindowCocoa *m_owner;
|
wxWindowCocoa *m_owner;
|
||||||
WX_NSScrollView m_cocoaNSScrollView;
|
WX_NSScrollView m_cocoaNSScrollView;
|
||||||
virtual void Cocoa_FrameChanged(void);
|
virtual void Cocoa_FrameChanged(void);
|
||||||
|
// virtual void Cocoa_synthesizeMouseMoved(void) {}
|
||||||
private:
|
private:
|
||||||
wxWindowCocoaScrollView();
|
wxWindowCocoaScrollView();
|
||||||
};
|
};
|
||||||
@@ -331,6 +335,9 @@ void wxWindowCocoa::Init()
|
|||||||
m_isBeingDeleted = false;
|
m_isBeingDeleted = false;
|
||||||
m_isInPaint = false;
|
m_isInPaint = false;
|
||||||
m_shouldBeEnabled = true;
|
m_shouldBeEnabled = true;
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
m_visibleTrackingRectManager = NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
@@ -391,6 +398,12 @@ void wxWindowCocoa::CocoaRemoveFromParent(void)
|
|||||||
|
|
||||||
void wxWindowCocoa::SetNSView(WX_NSView cocoaNSView)
|
void wxWindowCocoa::SetNSView(WX_NSView cocoaNSView)
|
||||||
{
|
{
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
// Clear the visible area tracking rect if we have one.
|
||||||
|
delete m_visibleTrackingRectManager;
|
||||||
|
m_visibleTrackingRectManager = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
bool need_debug = cocoaNSView || m_cocoaNSView;
|
bool need_debug = cocoaNSView || m_cocoaNSView;
|
||||||
if(need_debug) wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxWindowCocoa=%p::SetNSView [m_cocoaNSView=%p retainCount]=%d"),this,m_cocoaNSView,[m_cocoaNSView retainCount]);
|
if(need_debug) wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxWindowCocoa=%p::SetNSView [m_cocoaNSView=%p retainCount]=%d"),this,m_cocoaNSView,[m_cocoaNSView retainCount]);
|
||||||
DisassociateNSView(m_cocoaNSView);
|
DisassociateNSView(m_cocoaNSView);
|
||||||
@@ -509,18 +522,69 @@ bool wxWindowCocoa::Cocoa_mouseMoved(WX_NSEvent theEvent)
|
|||||||
{
|
{
|
||||||
wxMouseEvent event(wxEVT_MOTION);
|
wxMouseEvent event(wxEVT_MOTION);
|
||||||
InitMouseEvent(event,theEvent);
|
InitMouseEvent(event,theEvent);
|
||||||
wxLogTrace(wxTRACE_COCOA,wxT("Mouse Drag @%d,%d"),event.m_x,event.m_y);
|
wxLogTrace(wxTRACE_COCOA,wxT("wxWindow=%p::Cocoa_mouseMoved @%d,%d"),this,event.m_x,event.m_y);
|
||||||
return GetEventHandler()->ProcessEvent(event);
|
return GetEventHandler()->ProcessEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxWindowCocoa::Cocoa_synthesizeMouseMoved()
|
||||||
|
{
|
||||||
|
wxMouseEvent event(wxEVT_MOTION);
|
||||||
|
NSWindow *window = [GetNSView() window];
|
||||||
|
NSPoint locationInWindow = [window mouseLocationOutsideOfEventStream];
|
||||||
|
NSPoint cocoaPoint = [m_cocoaNSView convertPoint:locationInWindow fromView:nil];
|
||||||
|
|
||||||
|
NSPoint pointWx = CocoaTransformBoundsToWx(cocoaPoint);
|
||||||
|
// FIXME: Should we be adjusting for client area origin?
|
||||||
|
const wxPoint &clientorigin = GetClientAreaOrigin();
|
||||||
|
event.m_x = (wxCoord)pointWx.x - clientorigin.x;
|
||||||
|
event.m_y = (wxCoord)pointWx.y - clientorigin.y;
|
||||||
|
|
||||||
|
// TODO: Handle shift, control, alt, meta flags
|
||||||
|
event.SetEventObject(this);
|
||||||
|
event.SetId(GetId());
|
||||||
|
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("wxwin=%p Synthesized Mouse Moved @%d,%d"),this,event.m_x,event.m_y);
|
||||||
|
GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
bool wxWindowCocoa::Cocoa_mouseEntered(WX_NSEvent theEvent)
|
bool wxWindowCocoa::Cocoa_mouseEntered(WX_NSEvent theEvent)
|
||||||
{
|
{
|
||||||
return false;
|
#if 0 // ABI incompatibility
|
||||||
|
if(m_visibleTrackingRectManager != NULL && m_visibleTrackingRectManager->IsOwnerOfEvent(theEvent))
|
||||||
|
{
|
||||||
|
m_visibleTrackingRectManager->BeginSynthesizingEvents();
|
||||||
|
|
||||||
|
// Although we synthesize the mouse moved events we don't poll for them but rather send them only when
|
||||||
|
// some other event comes in. That other event is (guess what) mouse moved events that will be sent
|
||||||
|
// to the NSWindow which will forward them on to the first responder. We are not likely to be the
|
||||||
|
// first responder, so the mouseMoved: events are effectively discarded.
|
||||||
|
[[GetNSView() window] setAcceptsMouseMovedEvents:YES];
|
||||||
|
|
||||||
|
wxMouseEvent event(wxEVT_ENTER_WINDOW);
|
||||||
|
InitMouseEvent(event,theEvent);
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("wxwin=%p Mouse Entered @%d,%d"),this,event.m_x,event.m_y);
|
||||||
|
return GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxWindowCocoa::Cocoa_mouseExited(WX_NSEvent theEvent)
|
bool wxWindowCocoa::Cocoa_mouseExited(WX_NSEvent theEvent)
|
||||||
{
|
{
|
||||||
return false;
|
#if 0 // ABI incompatibility
|
||||||
|
if(m_visibleTrackingRectManager != NULL && m_visibleTrackingRectManager->IsOwnerOfEvent(theEvent))
|
||||||
|
{
|
||||||
|
m_visibleTrackingRectManager->StopSynthesizingEvents();
|
||||||
|
|
||||||
|
wxMouseEvent event(wxEVT_LEAVE_WINDOW);
|
||||||
|
InitMouseEvent(event,theEvent);
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("wxwin=%p Mouse Exited @%d,%d"),this,event.m_x,event.m_y);
|
||||||
|
return GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxWindowCocoa::Cocoa_mouseDown(WX_NSEvent theEvent)
|
bool wxWindowCocoa::Cocoa_mouseDown(WX_NSEvent theEvent)
|
||||||
@@ -590,7 +654,11 @@ bool wxWindowCocoa::Cocoa_otherMouseUp(WX_NSEvent theEvent)
|
|||||||
|
|
||||||
void wxWindowCocoa::Cocoa_FrameChanged(void)
|
void wxWindowCocoa::Cocoa_FrameChanged(void)
|
||||||
{
|
{
|
||||||
wxLogTrace(wxTRACE_COCOA,wxT("Cocoa_FrameChanged"));
|
wxLogTrace(wxTRACE_COCOA,wxT("wxWindow=%p::Cocoa_FrameChanged"),this);
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
if(m_visibleTrackingRectManager != NULL)
|
||||||
|
m_visibleTrackingRectManager->RebuildTrackingRect();
|
||||||
|
#endif
|
||||||
wxSizeEvent event(GetSize(), m_windowId);
|
wxSizeEvent event(GetSize(), m_windowId);
|
||||||
event.SetEventObject(this);
|
event.SetEventObject(this);
|
||||||
GetEventHandler()->ProcessEvent(event);
|
GetEventHandler()->ProcessEvent(event);
|
||||||
@@ -607,6 +675,12 @@ bool wxWindowCocoa::SetCursor(const wxCursor &cursor)
|
|||||||
|
|
||||||
bool wxWindowCocoa::Cocoa_resetCursorRects()
|
bool wxWindowCocoa::Cocoa_resetCursorRects()
|
||||||
{
|
{
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("wxWindow=%p::Cocoa_resetCursorRects"),this);
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
if(m_visibleTrackingRectManager != NULL)
|
||||||
|
m_visibleTrackingRectManager->RebuildTrackingRect();
|
||||||
|
#endif
|
||||||
|
|
||||||
if(!m_cursor.GetNSCursor())
|
if(!m_cursor.GetNSCursor())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -615,6 +689,26 @@ bool wxWindowCocoa::Cocoa_resetCursorRects()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
bool wxWindowCocoa::Cocoa_viewDidMoveToWindow()
|
||||||
|
{
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("wxWindow=%p::viewDidMoveToWindow"),this);
|
||||||
|
// Set up new tracking rects. I am reasonably sure the new window must be set before doing this.
|
||||||
|
if(m_visibleTrackingRectManager != NULL)
|
||||||
|
m_visibleTrackingRectManager->BuildTrackingRect();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxWindowCocoa::Cocoa_viewWillMoveToWindow(WX_NSWindow newWindow)
|
||||||
|
{
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("wxWindow=%p::viewWillMoveToWindow:%p"),this, newWindow);
|
||||||
|
// Clear tracking rects. It is imperative this be done before the new window is set.
|
||||||
|
if(m_visibleTrackingRectManager != NULL)
|
||||||
|
m_visibleTrackingRectManager->ClearTrackingRect();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool wxWindow::Close(bool force)
|
bool wxWindow::Close(bool force)
|
||||||
{
|
{
|
||||||
// The only reason this function exists is that it is virtual and
|
// The only reason this function exists is that it is virtual and
|
||||||
@@ -1163,3 +1257,91 @@ wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
|||||||
pt = wxGetMousePosition();
|
pt = wxGetMousePosition();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ========================================================================
|
||||||
|
// wxCocoaTrackingRectManager
|
||||||
|
// ========================================================================
|
||||||
|
|
||||||
|
wxCocoaTrackingRectManager::wxCocoaTrackingRectManager(wxWindow *window)
|
||||||
|
: m_window(window)
|
||||||
|
{
|
||||||
|
m_isTrackingRectActive = false;
|
||||||
|
m_runLoopObserver = NULL;
|
||||||
|
BuildTrackingRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCocoaTrackingRectManager::ClearTrackingRect()
|
||||||
|
{
|
||||||
|
if(m_isTrackingRectActive)
|
||||||
|
{
|
||||||
|
[m_window->GetNSView() removeTrackingRect:m_trackingRectTag];
|
||||||
|
m_isTrackingRectActive = false;
|
||||||
|
}
|
||||||
|
// If we were doing periodic events we need to clear those too
|
||||||
|
StopSynthesizingEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCocoaTrackingRectManager::StopSynthesizingEvents()
|
||||||
|
{
|
||||||
|
if(m_runLoopObserver != NULL)
|
||||||
|
{
|
||||||
|
CFRunLoopRemoveObserver([[NSRunLoop currentRunLoop] getCFRunLoop], m_runLoopObserver, kCFRunLoopCommonModes);
|
||||||
|
CFRelease(m_runLoopObserver);
|
||||||
|
m_runLoopObserver = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCocoaTrackingRectManager::BuildTrackingRect()
|
||||||
|
{
|
||||||
|
wxASSERT_MSG(!m_isTrackingRectActive, wxT("Tracking rect was not cleared"));
|
||||||
|
if([m_window->GetNSView() window] != nil)
|
||||||
|
{
|
||||||
|
m_trackingRectTag = [m_window->GetNSView() addTrackingRect:[m_window->GetNSView() visibleRect] owner:m_window->GetNSView() userData:NULL assumeInside:NO];
|
||||||
|
m_isTrackingRectActive = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static NSPoint s_lastScreenMouseLocation = NSZeroPoint;
|
||||||
|
|
||||||
|
static void SynthesizeMouseMovedEvent(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
|
||||||
|
{
|
||||||
|
#if 0 // ABI incompatibility
|
||||||
|
NSPoint screenMouseLocation = [NSEvent mouseLocation];
|
||||||
|
if(screenMouseLocation.x != s_lastScreenMouseLocation.x || screenMouseLocation.y != s_lastScreenMouseLocation.y)
|
||||||
|
{
|
||||||
|
wxCocoaNSView *win = reinterpret_cast<wxCocoaNSView*>(info);
|
||||||
|
win->Cocoa_synthesizeMouseMoved();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCocoaTrackingRectManager::BeginSynthesizingEvents()
|
||||||
|
{
|
||||||
|
CFRunLoopObserverContext observerContext =
|
||||||
|
{ 0
|
||||||
|
, static_cast<wxCocoaNSView*>(m_window)
|
||||||
|
, NULL
|
||||||
|
, NULL
|
||||||
|
, NULL
|
||||||
|
};
|
||||||
|
m_runLoopObserver = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopBeforeWaiting, TRUE, 0, SynthesizeMouseMovedEvent, &observerContext);
|
||||||
|
CFRunLoopAddObserver([[NSRunLoop currentRunLoop] getCFRunLoop], m_runLoopObserver, kCFRunLoopCommonModes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCocoaTrackingRectManager::RebuildTrackingRect()
|
||||||
|
{
|
||||||
|
ClearTrackingRect();
|
||||||
|
BuildTrackingRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCocoaTrackingRectManager::~wxCocoaTrackingRectManager()
|
||||||
|
{
|
||||||
|
ClearTrackingRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxCocoaTrackingRectManager::IsOwnerOfEvent(NSEvent *anEvent)
|
||||||
|
{
|
||||||
|
return m_isTrackingRectActive && (m_trackingRectTag == [anEvent trackingNumber]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user