From 0cc326bcc9e84e07c171ba357065ddc864c034ac Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sat, 11 Oct 2025 15:35:17 +0300 Subject: [PATCH] Fixed some memory leaks and uses of uninitialized values --- src/DrawComponents/DrawComponent.hpp | 2 +- src/DrawingProgram/DrawingProgram.cpp | 5 +++++ src/DrawingProgram/DrawingProgram.hpp | 2 ++ src/DrawingProgram/EllipseDrawEditTool.cpp | 6 +++--- src/DrawingProgram/EllipseDrawEditTool.hpp | 2 +- src/DrawingProgram/RectDrawEditTool.cpp | 2 +- src/DrawingProgram/RectDrawEditTool.hpp | 2 +- src/DrawingProgram/TextBoxEditTool.cpp | 2 +- src/DrawingProgram/TextBoxEditTool.hpp | 2 +- src/DrawingProgram/TextBoxTool.cpp | 2 +- src/MainProgram.cpp | 16 ++++++++-------- src/World.hpp | 6 +++--- 12 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/DrawComponents/DrawComponent.hpp b/src/DrawComponents/DrawComponent.hpp index 5741c6a..99d97e5 100644 --- a/src/DrawComponents/DrawComponent.hpp +++ b/src/DrawComponents/DrawComponent.hpp @@ -76,7 +76,7 @@ class DrawComponent { std::weak_ptr collabListInfo; std::weak_ptr parentBvhNode; - ServerClientID id; + ServerClientID id = {0, 0}; #ifndef IS_SERVER std::chrono::time_point lastUpdateTime; diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index f54da1e..6d5df61 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -359,6 +359,11 @@ void DrawingProgram::update() { selection.update(); drawTool->tool_update(); + if(toolToSwitchToAfterUpdate) { + switch_to_tool_ptr(std::move(toolToSwitchToAfterUpdate)); + toolToSwitchToAfterUpdate = nullptr; + } + if(controls.leftClickReleased) controls.leftClickReleased = false; diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 9d0b1c8..f7d56bd 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -93,6 +93,8 @@ class DrawingProgram { DrawingProgramSelection selection; + std::unique_ptr toolToSwitchToAfterUpdate; + bool temporaryEraser = false; bool temporaryPan = false; DrawingProgramToolType toolTypeAfterTempPan; diff --git a/src/DrawingProgram/EllipseDrawEditTool.cpp b/src/DrawingProgram/EllipseDrawEditTool.cpp index b6e01c1..de11f29 100644 --- a/src/DrawingProgram/EllipseDrawEditTool.cpp +++ b/src/DrawingProgram/EllipseDrawEditTool.cpp @@ -40,10 +40,10 @@ bool EllipseDrawEditTool::edit_gui(const std::shared_ptr& comp) { }); } t.gui.pop_id(); - - bool editHappened = a->d != oldData; + + bool editHappened = (!oldData.has_value()) || (a->d != oldData); oldData = a->d; - return editHappened; + return editHappened; } void EllipseDrawEditTool::edit_start(EditTool& editTool, const std::shared_ptr& comp, std::any& prevData) { diff --git a/src/DrawingProgram/EllipseDrawEditTool.hpp b/src/DrawingProgram/EllipseDrawEditTool.hpp index 6d05244..833b1ae 100644 --- a/src/DrawingProgram/EllipseDrawEditTool.hpp +++ b/src/DrawingProgram/EllipseDrawEditTool.hpp @@ -16,5 +16,5 @@ class EllipseDrawEditTool : public DrawingProgramEditToolBase { private: void commit(); - DrawEllipse::Data oldData; + std::optional oldData; }; diff --git a/src/DrawingProgram/RectDrawEditTool.cpp b/src/DrawingProgram/RectDrawEditTool.cpp index be27c53..0384d51 100644 --- a/src/DrawingProgram/RectDrawEditTool.cpp +++ b/src/DrawingProgram/RectDrawEditTool.cpp @@ -39,7 +39,7 @@ bool RectDrawEditTool::edit_gui(const std::shared_ptr& comp) { } t.gui.pop_id(); - bool editHappened = a->d != oldData; + bool editHappened = (!oldData.has_value()) || (a->d != oldData); oldData = a->d; return editHappened; } diff --git a/src/DrawingProgram/RectDrawEditTool.hpp b/src/DrawingProgram/RectDrawEditTool.hpp index f32118c..3a86e4d 100644 --- a/src/DrawingProgram/RectDrawEditTool.hpp +++ b/src/DrawingProgram/RectDrawEditTool.hpp @@ -14,5 +14,5 @@ class RectDrawEditTool : public DrawingProgramEditToolBase { virtual bool edit_update(const std::shared_ptr& comp) override; virtual bool edit_gui(const std::shared_ptr& comp) override; private: - DrawRectangle::Data oldData; + std::optional oldData; }; diff --git a/src/DrawingProgram/TextBoxEditTool.cpp b/src/DrawingProgram/TextBoxEditTool.cpp index ece45ab..e560c8c 100644 --- a/src/DrawingProgram/TextBoxEditTool.cpp +++ b/src/DrawingProgram/TextBoxEditTool.cpp @@ -26,7 +26,7 @@ bool TextBoxEditTool::edit_gui(const std::shared_ptr& comp) { t.gui.text_label("Text Color"); }); t.gui.pop_id(); - bool editHappened = a->d != oldData; + bool editHappened = (!oldData.has_value()) || (a->d != oldData); oldData = a->d; return editHappened; } diff --git a/src/DrawingProgram/TextBoxEditTool.hpp b/src/DrawingProgram/TextBoxEditTool.hpp index 8b0eee3..52d72e0 100644 --- a/src/DrawingProgram/TextBoxEditTool.hpp +++ b/src/DrawingProgram/TextBoxEditTool.hpp @@ -18,5 +18,5 @@ class TextBoxEditTool : public DrawingProgramEditToolBase { void edit_text(std::function toRun, const std::shared_ptr& textBox); void update_textbox_network(const std::shared_ptr& textBox); - DrawTextBox::Data oldData; + std::optional oldData; }; diff --git a/src/DrawingProgram/TextBoxTool.cpp b/src/DrawingProgram/TextBoxTool.cpp index 6b113bd..de841c4 100644 --- a/src/DrawingProgram/TextBoxTool.cpp +++ b/src/DrawingProgram/TextBoxTool.cpp @@ -67,7 +67,7 @@ void TextBoxTool::tool_update() { if(!drawP.controls.leftClickHeld) { auto editTool = std::make_unique(drawP); editTool->edit_start(controls.intermediateItem); - drawP.switch_to_tool_ptr(std::move(editTool)); + drawP.toolToSwitchToAfterUpdate = std::move(editTool); return; } else { diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index 3a0b7b4..2efd453 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -97,14 +97,6 @@ void MainProgram::update() { deltaTime.update_time_since(); deltaTime.update_time_point(); - - toolbar.update(); - - if(input.key(InputManager::KEY_NOGUI).pressed) - drawGui = !drawGui; - - if(input.key(InputManager::KEY_FULLSCREEN).pressed) - input.toggleFullscreen = true; for(auto& w : worlds) { if(w == world) @@ -113,6 +105,14 @@ void MainProgram::update() { w->unfocus_update(); } + toolbar.update(); // GUI should be setup after the world data has been fully updated for this frame, so that the GUI reflects the current state of the world data + + if(input.key(InputManager::KEY_NOGUI).pressed) + drawGui = !drawGui; + + if(input.key(InputManager::KEY_FULLSCREEN).pressed) + input.toggleFullscreen = true; + NetLibrary::update(); if(tabSetToOpen) { diff --git a/src/World.hpp b/src/World.hpp index 371ac15..838e8d3 100644 --- a/src/World.hpp +++ b/src/World.hpp @@ -85,7 +85,7 @@ class World { void undo_with_checks(); void redo_with_checks(); - ServerPortionID ownID; + ServerPortionID ownID = 0; std::filesystem::path filePath; Vector3f userColor = {0.0f, 0.0f, 0.0f}; @@ -95,8 +95,8 @@ class World { void set_canvas_background_color(const Vector3f& newBackColor, bool sendChangeOverNetwork = true); struct CanvasTheme { - SkColor4f backColor; - SkColor4f toolFrontColor; + SkColor4f backColor = {0.0f, 0.0f, 0.0f, 1.0f}; + SkColor4f toolFrontColor = {1.0f, 1.0f, 1.0f, 1.0f}; } canvasTheme; void scale_up(const WorldScalar& scaleUpAmount);