Browse Source

Moved all allocation of input events to functions in BackendWindow.

David Piuva 8 months ago
parent
commit
c2d642e772

+ 13 - 4
Source/DFPSR/implementation/gui/BackendWindow.h

@@ -44,19 +44,28 @@ public:
 	String title;
 	// Events
 	List<InputEvent*> eventQueue;
-	void queueInputEvent(InputEvent* event) {
-		this->eventQueue.push(event);
-	}
 private:
 	int requestingResize = false;
 	int requestedWidth = 0;
 	int requestedHeight = 0;
 public:
+	inline void receivedMouseEvent(MouseEventType mouseEventType, MouseKeyEnum key, IVector2D position) {
+		this->eventQueue.push(new MouseEvent(mouseEventType, key, position));
+	}
+	inline void receivedKeyboardEvent(KeyboardEventType keyboardEventType, DsrChar character, DsrKey dsrKey) {
+		this->eventQueue.push(new KeyboardEvent(keyboardEventType, character, dsrKey));
+	}
+	inline void receivedWindowCloseEvent() {
+		this->eventQueue.push(new dsr::WindowEvent(dsr::WindowEventType::Close));
+	}
+	inline void receivedWindowRedrawEvent() {
+		this->eventQueue.push(new dsr::WindowEvent(dsr::WindowEventType::Redraw));
+	}
 	// Request to resize the window.
 	//   When the implementation receives a resize, call receiveWindowResize with the new dimensions.
 	//     If requestingResize is already true, it will just overwrite the old request.
 	//   Next call to executeEvents will then use it to resize the canvas.
-	void receivedWindowResize(int width, int height) {
+	inline void receivedWindowResize(int width, int height) {
 		this->requestingResize = true;
 		this->requestedWidth = width;
 		this->requestedHeight = height;

+ 0 - 3
Source/DFPSR/implementation/gui/InputEvent.cpp

@@ -268,9 +268,6 @@ String& dsr::string_toStreamIndented(String& target, const MouseEvent& source, c
 String& dsr::string_toStreamIndented(String& target, const WindowEvent& source, const ReadableString& indentation) {
 	string_append(target, indentation, U"WindowEvent(");
 	string_append(target, U"windowEventType = ", source.windowEventType);
-	// TODO: Assert that width and height are zero when not used by the event type.
-	string_append(target, U", width = ", source.width);
-	string_append(target, U", height = ", source.height);
 	string_append(target, U")");
 	return target;
 }

+ 2 - 3
Source/DFPSR/implementation/gui/InputEvent.h

@@ -109,9 +109,8 @@ enum class WindowEventType { Close, Redraw };
 class WindowEvent : public InputEvent {
 public:
 	WindowEventType windowEventType;
-	int width, height;
-	WindowEvent(WindowEventType windowEventType, int width, int height)
-	: windowEventType(windowEventType), width(width), height(height) {}
+	WindowEvent(WindowEventType windowEventType)
+	: windowEventType(windowEventType) {}
 };
 
 // A macro for declaring a virtual callback from the base method.

+ 17 - 17
Source/windowManagers/CocoaWindow.mm

@@ -299,30 +299,30 @@ void CocoaWindow::prefetchEvents() {
 				dsr::IVector2D mousePosition = dsr::IVector2D(int32_t(point.x), int32_t(canvasHeight - point.y));
 				if ([event type] == NSEventTypeLeftMouseDown) {
 					dsr::printText(U"LeftMouseDown at ", mousePosition, U"\n");
-					this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseDown, dsr::MouseKeyEnum::Left, mousePosition));
+					this->receivedMouseEvent(dsr::MouseEventType::MouseDown, dsr::MouseKeyEnum::Left, mousePosition);
 				} else if ([event type] == NSEventTypeLeftMouseDragged) {
 					dsr::printText(U"LeftMouseDragged at ", mousePosition, U"\n");
-					this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, mousePosition));
+					this->receivedMouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, mousePosition);
 				} else if ([event type] == NSEventTypeLeftMouseUp) {
 					dsr::printText(U"LeftMouseUp at ", mousePosition, U"\n");
-					this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseUp, dsr::MouseKeyEnum::Left, mousePosition));
+					this->receivedMouseEvent(dsr::MouseEventType::MouseUp, dsr::MouseKeyEnum::Left, mousePosition);
 				} else if ([event type] == NSEventTypeRightMouseDown) {
 					dsr::printText(U"RightMouseDown at ", mousePosition, U"\n");
 				} else if ([event type] == NSEventTypeRightMouseDragged) {
 					dsr::printText(U"RightMouseDragged at ", mousePosition, U"\n");
-					this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, mousePosition));
+					this->receivedMouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, mousePosition);
 				} else if ([event type] == NSEventTypeRightMouseUp) {
 					dsr::printText(U"RightMouseUp at ", mousePosition, U"\n");
 				} else if ([event type] == NSEventTypeOtherMouseDown) {
 					dsr::printText(U"OtherMouseDown at ", mousePosition, U"\n");
 				} else if ([event type] == NSEventTypeOtherMouseDragged) {
 					dsr::printText(U"OtherMouseDragged at ", mousePosition, U"\n");
-					this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, mousePosition));
+					this->receivedMouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, mousePosition);
 				} else if ([event type] == NSEventTypeOtherMouseUp) {
 					dsr::printText(U"OtherMouseUp at ", mousePosition, U"\n");
 				} else if ([event type] == NSEventTypeMouseMoved) {
 					dsr::printText(U"MouseMoved at ", mousePosition, U"\n");
-					this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, mousePosition));
+					this->receivedMouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, mousePosition);
 				//} else if ([event type] == NSEventTypeMouseEntered) {
 				//	dsr::printText(U"MouseEntered at ", mousePosition, U"\n");
 				//} else if ([event type] == NSEventTypeMouseExited) {
@@ -331,10 +331,10 @@ void CocoaWindow::prefetchEvents() {
 					dsr::printText(U"ScrollWheel at ", mousePosition, U"\n");
 					// TODO: Which direction is considered up/down on MacOS when scroll wheels are inverted relative to PC?
 					if (event.scrollingDeltaY > 0.0) {
-						this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::Scroll, dsr::MouseKeyEnum::ScrollUp, mousePosition));
+						this->receivedMouseEvent(dsr::MouseEventType::Scroll, dsr::MouseKeyEnum::ScrollUp, mousePosition);
 					}
 					if (event.scrollingDeltaY < 0.0) {
-						this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::Scroll, dsr::MouseKeyEnum::ScrollDown, mousePosition));
+						this->receivedMouseEvent(dsr::MouseEventType::Scroll, dsr::MouseKeyEnum::ScrollDown, mousePosition);
 					}
 				}
 				[this->window makeKeyAndOrderFront:nil];
@@ -348,19 +348,19 @@ void CocoaWindow::prefetchEvents() {
 						dsr::printText(U"KeyDown: keyCode ", event.keyCode, U" -> ", getName(code), U"\n");
 						// TODO: Should up and down events require valid character codes from the system?
 						//       An API for sending event to a window can be used to document this and remove arguments where not needed.
-						this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyDown, U'0', code));
+						this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyDown, U'0', code);
 					}
 					
 					// TODO: Check if the event's character is printable and only enter printable characters.
 					dsr::printText(U"KeyType: keyCode ", event.keyCode, U" -> ", getName(code), U"\n");
 					// TODO: Get the character code.
-					this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyType, U'0', code));
+					this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyType, U'0', code);
 					
 				} else if ([event type] == NSEventTypeKeyUp) {
 					dsr::printText(U"KeyUp: keyCode ", event.keyCode, U" -> ", getName(code), U"\n");
 					
 					// TODO: Should up and down events require valid character codes from the system?
-					this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyUp, U'0', code));
+					this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyUp, U'0', code);
 					
 				} else if ([event type] == NSEventTypeFlagsChanged) {
 					dsr::printText(U"FlagsChanged\n");
@@ -370,24 +370,24 @@ void CocoaWindow::prefetchEvents() {
 					bool newAltOption = (newModifierFlags & NSEventModifierFlagOption) != 0u;
 					if (newControlCommand && !pressedControlCommand) {
 						dsr::printText(U"KeyDown: Control\n");
-						this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyDown, U'0', dsr::DsrKey_Control));
+						this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyDown, U'0', dsr::DsrKey_Control);
 					} else if (!newControlCommand && pressedControlCommand) {
 						dsr::printText(U"KeyUp: Control\n");
-						this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyUp, U'0', dsr::DsrKey_Control));
+						this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyUp, U'0', dsr::DsrKey_Control);
 					}
 					if (newShift && !pressedShift) {
 						dsr::printText(U"KeyDown: Shift\n");
-						this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyDown, U'0', dsr::DsrKey_Shift));
+						this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyDown, U'0', dsr::DsrKey_Shift);
 					} else if (!newShift && pressedShift) {
 						dsr::printText(U"KeyUp: Shift\n");
-						this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyUp, U'0', dsr::DsrKey_Shift));
+						this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyUp, U'0', dsr::DsrKey_Shift);
 					}
 					if (newAltOption && !pressedAltOption) {
 						dsr::printText(U"KeyDown: Alt\n");
-						this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyDown, U'0', dsr::DsrKey_Alt));
+						this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyDown, U'0', dsr::DsrKey_Alt);
 					} else if (!newAltOption && pressedAltOption) {
 						dsr::printText(U"KeyUp: Alt\n");
-						this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyUp, U'0', dsr::DsrKey_Alt));
+						this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyUp, U'0', dsr::DsrKey_Alt);
 					}
 					pressedControlCommand = newControlCommand;
 					pressedShift = newShift;

+ 14 - 14
Source/windowManagers/Win32Window.cpp

@@ -522,29 +522,29 @@ static LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam,
 		PostQuitMessage(wParam);
 		break;
 	case WM_CLOSE:
-		parent->queueInputEvent(new dsr::WindowEvent(dsr::WindowEventType::Close, parent->windowWidth, parent->windowHeight));
+		parent->receivedWindowCloseEvent();
 		DestroyWindow(hwnd);
 		break;
 	case WM_LBUTTONDOWN:
-		parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseDown, dsr::MouseKeyEnum::Left, parent->lastMousePos));
+		parent->receivedMouseEvent(dsr::MouseEventType::MouseDown, dsr::MouseKeyEnum::Left, parent->lastMousePos);
 		break;
 	case WM_LBUTTONUP:
-		parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseUp, dsr::MouseKeyEnum::Left, parent->lastMousePos));
+		parent->receivedMouseEvent(dsr::MouseEventType::MouseUp, dsr::MouseKeyEnum::Left, parent->lastMousePos);
 		break;
 	case WM_RBUTTONDOWN:
-		parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseDown, dsr::MouseKeyEnum::Right, parent->lastMousePos));
+		parent->receivedMouseEvent(dsr::MouseEventType::MouseDown, dsr::MouseKeyEnum::Right, parent->lastMousePos);
 		break;
 	case WM_RBUTTONUP:
-		parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseUp, dsr::MouseKeyEnum::Right, parent->lastMousePos));
+		parent->receivedMouseEvent(dsr::MouseEventType::MouseUp, dsr::MouseKeyEnum::Right, parent->lastMousePos);
 		break;
 	case WM_MBUTTONDOWN:
-		parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseDown, dsr::MouseKeyEnum::Middle, parent->lastMousePos));
+		parent->receivedMouseEvent(dsr::MouseEventType::MouseDown, dsr::MouseKeyEnum::Middle, parent->lastMousePos);
 		break;
 	case WM_MBUTTONUP:
-		parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseUp, dsr::MouseKeyEnum::Middle, parent->lastMousePos));
+		parent->receivedMouseEvent(dsr::MouseEventType::MouseUp, dsr::MouseKeyEnum::Middle, parent->lastMousePos);
 		break;
 	case WM_MOUSEMOVE:
-		parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, parent->lastMousePos));
+		parent->receivedMouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, parent->lastMousePos);
 		break;
 	case WM_SETCURSOR:
 		if (LOWORD(lParam) == HTCLIENT) {
@@ -559,9 +559,9 @@ static LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam,
 		{
 			int delta = GET_WHEEL_DELTA_WPARAM(wParam);
 			if (delta > 0) {
-				parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::Scroll, dsr::MouseKeyEnum::ScrollUp, parent->lastMousePos));
+				parent->receivedMouseEvent(dsr::MouseEventType::Scroll, dsr::MouseKeyEnum::ScrollUp, parent->lastMousePos);
 			} else if (delta < 0) {
-				parent->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::Scroll, dsr::MouseKeyEnum::ScrollDown, parent->lastMousePos));
+				parent->receivedMouseEvent(dsr::MouseEventType::Scroll, dsr::MouseKeyEnum::ScrollDown, parent->lastMousePos);
 			}
 		}
 		break;
@@ -584,18 +584,18 @@ static LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam,
 				// If not repeated
 				if (!previouslyPressed) {
 					// Physical key down
-					parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyDown, character, dsrKey));
+					parent->receivedKeyboardEvent(dsr::KeyboardEventType::KeyDown, character, dsrKey);
 				}
 				// Press typing with repeat
-				parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyType, character, dsrKey));
+				parent->receivedKeyboardEvent(dsr::KeyboardEventType::KeyType, character, dsrKey);
 			} else { // message == WM_KEYUP || message == WM_SYSKEYUP
 				// Physical key up
-				parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyUp, character, dsrKey));
+				parent->receivedKeyboardEvent(dsr::KeyboardEventType::KeyUp, character, dsrKey);
 			}
 		}
 		break;
 	case WM_PAINT:
-		//parent->queueInputEvent(new dsr::WindowEvent(dsr::WindowEventType::Redraw, parent->windowWidth, parent->windowHeight));
+		//parent->receivedWindowRedrawEvent();
 		// BeginPaint and EndPaint must be called with the given hwnd to prevent having the redraw message sent again
 		parent->redraw(hwnd, false, false);
 		// Passing on the event to prevent flooding with more messages. This is only a temporary solution.

+ 9 - 9
Source/windowManagers/X11Window.cpp

@@ -628,7 +628,7 @@ void X11Window::prefetchEvents() {
 				}
 				if (currentEvent.type == Expose && currentEvent.xexpose.count == 0) {
 					// Redraw
-					this->queueInputEvent(new dsr::WindowEvent(dsr::WindowEventType::Redraw, this->windowWidth, this->windowHeight));
+					this->receivedWindowRedrawEvent();
 				} else if (currentEvent.type == KeyPress || currentEvent.type == KeyRelease) {
 					// Key down/up
 					dsr::DsrChar character = getCharacterCode(currentEvent);
@@ -641,18 +641,18 @@ void X11Window::prefetchEvents() {
 					 && currentEvent.xkey.time == nextEvent.xkey.time
 					 && nativeKey == nextNativeKey) {
 						// Repeated typing
-						this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyType, character, dsrKey));
+						this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyType, character, dsrKey);
 						// Skip next event
 						XNextEvent(this->display, &currentEvent);
 					} else {
 						if (currentEvent.type == KeyPress) {
 							// Physical key down
-							this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyDown, character, dsrKey));
+							this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyDown, character, dsrKey);
 							// First press typing
-							this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyType, character, dsrKey));
+							this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyType, character, dsrKey);
 						} else { // currentEvent.type == KeyRelease
 							// Physical key up
-							this->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyUp, character, dsrKey));
+							this->receivedKeyboardEvent(dsr::KeyboardEventType::KeyUp, character, dsrKey);
 						}
 					}
 				} else if (currentEvent.type == ButtonPress || currentEvent.type == ButtonRelease) {
@@ -660,20 +660,20 @@ void X11Window::prefetchEvents() {
 					if (isVerticalScrollKey(key)) {
 						// Scroll down/up
 						if (!hasScrolled) {
-							this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::Scroll, key, dsr::IVector2D(currentEvent.xbutton.x, currentEvent.xbutton.y)));
+							this->receivedMouseEvent(dsr::MouseEventType::Scroll, key, dsr::IVector2D(currentEvent.xbutton.x, currentEvent.xbutton.y));
 						}
 						hasScrolled = true;
 					} else {
 						// Mouse down/up
-						this->queueInputEvent(new dsr::MouseEvent(currentEvent.type == ButtonPress ? dsr::MouseEventType::MouseDown : dsr::MouseEventType::MouseUp, key, dsr::IVector2D(currentEvent.xbutton.x, currentEvent.xbutton.y)));
+						this->receivedMouseEvent(currentEvent.type == ButtonPress ? dsr::MouseEventType::MouseDown : dsr::MouseEventType::MouseUp, key, dsr::IVector2D(currentEvent.xbutton.x, currentEvent.xbutton.y));
 					}
 				} else if (currentEvent.type == MotionNotify) {
 					// Mouse move
-					this->queueInputEvent(new dsr::MouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, dsr::IVector2D(currentEvent.xmotion.x, currentEvent.xmotion.y)));
+					this->receivedMouseEvent(dsr::MouseEventType::MouseMove, dsr::MouseKeyEnum::NoKey, dsr::IVector2D(currentEvent.xmotion.x, currentEvent.xmotion.y));
 				} else if (currentEvent.type == ClientMessage) {
 					// Close
 					//   Assume WM_DELETE_WINDOW since it is the only registered client message
-					this->queueInputEvent(new dsr::WindowEvent(dsr::WindowEventType::Close, this->windowWidth, this->windowHeight));
+					this->receivedWindowCloseEvent();
 				} else if (currentEvent.type == ConfigureNotify) {
 					XConfigureEvent xce = currentEvent.xconfigure;
 					if (this->windowWidth != xce.width || this->windowHeight != xce.height) {