@@ -24,6 +24,7 @@ type windowManager struct {
2424	pointerPhase               embedder.PointerPhase 
2525	pixelsPerScreenCoordinate  float64 
2626	pointerCurrentlyAdded      bool 
27+ 	pointerButton              embedder.PointerButtonMouse 
2728}
2829
2930func  newWindowManager () * windowManager  {
@@ -51,6 +52,7 @@ func (m *windowManager) sendPointerEvent(window *glfw.Window, phase embedder.Poi
5152		X :         x  *  m .pixelsPerScreenCoordinate ,
5253		Y :         y  *  m .pixelsPerScreenCoordinate ,
5354		Timestamp : time .Now ().UnixNano () /  int64 (time .Millisecond ),
55+ 		Buttons :   m .pointerButton ,
5456	}
5557
5658	flutterEnginePointer  :=  * (* uintptr )(window .GetUserPointer ())
@@ -65,6 +67,21 @@ func (m *windowManager) sendPointerEvent(window *glfw.Window, phase embedder.Poi
6567	}
6668}
6769
70+ func  (m  * windowManager ) sendPointerEventButton (window  * glfw.Window , phase  embedder.PointerPhase ) {
71+ 	x , y  :=  window .GetCursorPos ()
72+ 	event  :=  embedder.PointerEvent {
73+ 		Phase :      phase ,
74+ 		X :          x  *  m .pixelsPerScreenCoordinate ,
75+ 		Y :          y  *  m .pixelsPerScreenCoordinate ,
76+ 		Timestamp :  time .Now ().UnixNano () /  int64 (time .Millisecond ),
77+ 		SignalKind : embedder .PointerSignalKindNone ,
78+ 		Buttons :    m .pointerButton ,
79+ 	}
80+ 	flutterEnginePointer  :=  * (* uintptr )(window .GetUserPointer ())
81+ 	flutterEngine  :=  (* embedder .FlutterEngine )(unsafe .Pointer (flutterEnginePointer ))
82+ 	flutterEngine .SendPointerEvent (event )
83+ }
84+ 
6885func  (m  * windowManager ) sendPointerEventScroll (window  * glfw.Window , xDelta , yDelta  float64 ) {
6986	x , y  :=  window .GetCursorPos ()
7087	event  :=  embedder.PointerEvent {
@@ -75,6 +92,7 @@ func (m *windowManager) sendPointerEventScroll(window *glfw.Window, xDelta, yDel
7592		SignalKind :   embedder .PointerSignalKindScroll ,
7693		ScrollDeltaX : xDelta ,
7794		ScrollDeltaY : yDelta ,
95+ 		Buttons :      m .pointerButton ,
7896	}
7997
8098	flutterEnginePointer  :=  * (* uintptr )(window .GetUserPointer ())
@@ -97,22 +115,48 @@ func (m *windowManager) glfwCursorPosCallback(window *glfw.Window, x, y float64)
97115	m .sendPointerEvent (window , m .pointerPhase , x , y )
98116}
99117
100- func  (m  * windowManager ) glfwMouseButtonCallback (window  * glfw.Window , key  glfw.MouseButton , action  glfw.Action , mods  glfw.ModifierKey ) {
101- 	if  key  ==  glfw .MouseButton1  {
102- 		x , y  :=  window .GetCursorPos ()
103- 
104- 		if  action  ==  glfw .Press  {
105- 			m .sendPointerEvent (window , embedder .PointerPhaseDown , x , y )
106- 			m .pointerPhase  =  embedder .PointerPhaseMove 
118+ func  (m  * windowManager ) handleButtonPhase (window  * glfw.Window , action  glfw.Action , buttons  embedder.PointerButtonMouse ) {
119+ 	if  action  ==  glfw .Press  {
120+ 		m .pointerButton  |=  buttons 
121+ 		// If only one button is pressed then each bits of buttons will be equals 
122+ 		// to m.pointerButton. 
123+ 		if  m .pointerButton  ==  buttons  {
124+ 			m .sendPointerEventButton (window , embedder .PointerPhaseDown )
125+ 		} else  {
126+ 			// if any other buttons are already pressed when a new button is pressed, 
127+ 			// the engine is expecting a Move phase instead of a Down phase. 
128+ 			m .sendPointerEventButton (window , embedder .PointerPhaseMove )
107129		}
130+ 		m .pointerPhase  =  embedder .PointerPhaseMove 
131+ 	}
108132
109- 		if  action  ==  glfw .Release  {
110- 			m .sendPointerEvent (window , embedder .PointerPhaseUp , x , y )
133+ 	if  action  ==  glfw .Release  {
134+ 		m .pointerButton  ^=  buttons 
135+ 		// If all button are released then m.pointerButton is cleared 
136+ 		if  m .pointerButton  ==  0  {
137+ 			m .sendPointerEventButton (window , embedder .PointerPhaseUp )
111138			m .pointerPhase  =  embedder .PointerPhaseHover 
139+ 		} else  {
140+ 			// if any other buttons are still pressed when one button is released 
141+ 			// the engine is expecting a Move phase instead of a Up phase. 
142+ 			m .sendPointerEventButton (window , embedder .PointerPhaseMove )
112143		}
113144	}
114145}
115146
147+ func  (m  * windowManager ) glfwMouseButtonCallback (window  * glfw.Window , key  glfw.MouseButton , action  glfw.Action , mods  glfw.ModifierKey ) {
148+ 	switch  key  {
149+ 	case  glfw .MouseButtonLeft :
150+ 		m .handleButtonPhase (window , action , embedder .PointerButtonMousePrimary )
151+ 	case  glfw .MouseButtonRight :
152+ 		m .handleButtonPhase (window , action , embedder .PointerButtonMouseSecondary )
153+ 	case  glfw .MouseButtonMiddle :
154+ 		m .handleButtonPhase (window , action , embedder .PointerButtonMouseMiddle )
155+ 	default :
156+ 		m .handleButtonPhase (window , action , 1 << uint (key ))
157+ 	}
158+ }
159+ 
116160func  (m  * windowManager ) glfwScrollCallback (window  * glfw.Window , xoff  float64 , yoff  float64 ) {
117161	const  scrollModifier  =  - 50 
118162	m .sendPointerEventScroll (window , xoff * scrollModifier , yoff * scrollModifier )
0 commit comments