From ef023446a306d88eaaf9208405ce1a4c734dd1e4 Mon Sep 17 00:00:00 2001 From: williamhCode Date: Thu, 19 Dec 2024 15:45:25 +0800 Subject: [PATCH] title now shows session name + generalize session switching --- CmakeLists.txt | 1 + res/lua/init.lua | 4 +-- src/app/task_helper.cpp | 23 +++++++++++++ src/app/task_helper.hpp | 9 +++++ src/main.cpp | 5 +++ src/session/manager.cpp | 75 ++++++++++++++++++++--------------------- src/session/manager.hpp | 2 ++ src/utils/tsqueue.hpp | 12 +++---- 8 files changed, 84 insertions(+), 47 deletions(-) create mode 100644 src/app/task_helper.cpp create mode 100644 src/app/task_helper.hpp diff --git a/CmakeLists.txt b/CmakeLists.txt index d928c13..0a16522 100644 --- a/CmakeLists.txt +++ b/CmakeLists.txt @@ -48,6 +48,7 @@ set(APP_SRC app/window_funcs.mm app/options.cpp app/path.cpp + app/task_helper.cpp editor/state.cpp editor/cursor.cpp diff --git a/res/lua/init.lua b/res/lua/init.lua index ba021d8..255734c 100644 --- a/res/lua/init.lua +++ b/res/lua/init.lua @@ -81,7 +81,7 @@ end, { nargs = "*" }) --- Sends a session command to neogurt --- @param cmd string: command to send. ---- @param opts table: command options +--- @param opts table|nil: command options --- @return any: result of the command vim.g.neogurt_cmd = function(cmd, opts) local chan_id = utils.get_neogurt_channel() @@ -109,7 +109,7 @@ vim.g.neogurt_cmd = function(cmd, opts) end elseif cmd == "session_select" then - local curr_id = vim.g.neogurt_cmd("session_list", { sort = "time" })[1].id + local curr_id = vim.g.neogurt_cmd("session_info").id local list = vim.g.neogurt_cmd("session_list", opts) vim.ui.select(list, { prompt = "Select a session", diff --git a/src/app/task_helper.cpp b/src/app/task_helper.cpp new file mode 100644 index 0000000..3b940ed --- /dev/null +++ b/src/app/task_helper.cpp @@ -0,0 +1,23 @@ +#include "./task_helper.hpp" +#include "utils/logger.hpp" +#include "utils/tsqueue.hpp" +#include + +static TSQueue> taskQueue; + +void DeferToMainThread(std::function&& task) { + taskQueue.Push(std::move(task)); + + SDL_Event event; + SDL_zero(event); + event.type = EVENT_DEFERRED_TASK; + SDL_PushEvent(&event); +} + +void ProcessNextMainThreadTask() { + assert(!taskQueue.Empty()); + + auto& task = taskQueue.Front(); + task(); + taskQueue.Pop(); +} diff --git a/src/app/task_helper.hpp b/src/app/task_helper.hpp new file mode 100644 index 0000000..5d2fc37 --- /dev/null +++ b/src/app/task_helper.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SDL3/SDL_events.h" +#include + +inline const Uint32 EVENT_DEFERRED_TASK = SDL_RegisterEvents(1); + +void DeferToMainThread(std::function&& task); +void ProcessNextMainThreadTask(); diff --git a/src/main.cpp b/src/main.cpp index c6360d3..86f2a34 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include "app/sdl_window.hpp" #include "app/sdl_event.hpp" #include "app/options.hpp" +#include "app/task_helper.hpp" #include "editor/grid.hpp" #include "editor/highlight.hpp" #include "editor/state.hpp" @@ -397,6 +398,10 @@ int main(int argc, char** argv) { sdlEvents.Push(event); break; } + + if (event.type == EVENT_DEFERRED_TASK) { + ProcessNextMainThreadTask(); + } } } catch (const std::exception& e) { diff --git a/src/session/manager.cpp b/src/session/manager.cpp index c98aa04..bae18c1 100644 --- a/src/session/manager.cpp +++ b/src/session/manager.cpp @@ -1,8 +1,10 @@ #include "./manager.hpp" +#include "app/task_helper.hpp" #include "app/window_funcs.h" #include "utils/color.hpp" #include "utils/logger.hpp" #include +#include #include #include #include @@ -25,7 +27,7 @@ int SessionManager::SessionNew(const SessionNewOpts& opts) { bool first = sessions.empty(); int id = currId++; - auto name = opts.name.empty() ? std::to_string(id) : opts.name; + auto name = opts.name.empty() ? std::format("session {}", id) : opts.name; auto [it, success] = sessions.try_emplace(id, id, name, opts.dir); if (!success) { @@ -100,20 +102,7 @@ int SessionManager::SessionNew(const SessionNewOpts& opts) { }) .value(); - sizes.UpdateSizes( - window.size, window.dpiScale, editorState.fontFamily.DefaultFont().charSize, - options - ); - - if (first) { - renderer = Renderer(sizes); - } else { - renderer.Resize(sizes); - } - - editorState.winManager.sizes = sizes; editorState.winManager.gridManager = &editorState.gridManager; - editorState.cursor.Resize(sizes.charSize, sizes.dpiScale); if (options.opacity < 1) { auto& hl = editorState.hlTable[0]; @@ -121,14 +110,18 @@ int SessionManager::SessionNew(const SessionNewOpts& opts) { hl.background->a = options.opacity; } - nvim.UiTryResize(sizes.uiWidth, sizes.uiHeight); - - inputHandler = InputHandler(&nvim, &editorState.winManager, options); + if (first) { + sizes.UpdateSizes( + window.size, window.dpiScale, session.editorState.fontFamily.DefaultFont().charSize, + session.options + ); + renderer = Renderer(sizes); + } - sessionsOrder.push_front(&session); + sessionsOrder.push_back(&session); - if (!opts.switchTo) { - SessionPrev(); + if (opts.switchTo) { + SessionSwitch(session.id); } return id; @@ -171,17 +164,13 @@ bool SessionManager::SessionSwitch(int id) { } auto& session = it->second; - UpdateSessionSizes(session); - inputHandler = - InputHandler(&session.nvim, &session.editorState.winManager, session.options); - session.reattached = true; - + // move order to front auto currIt = std::ranges::find(sessionsOrder, &session); - // move to front - if (currIt != sessionsOrder.end()) { - sessionsOrder.erase(currIt); - sessionsOrder.push_front(&session); - } + assert(currIt != sessionsOrder.end()); + sessionsOrder.erase(currIt); + sessionsOrder.push_front(&session); + + SessionSwitchInternal(session); return true; } @@ -246,19 +235,14 @@ bool SessionManager::ShouldQuit() { }); // check if no sessions left - auto* curr = CurrSession(); - if (curr == nullptr) { + auto* currSession = CurrSession(); + if (currSession == nullptr) { return true; } // switch to most recent session if current session was removed - if (prevId != curr->id) { - auto& session = *curr; - - UpdateSessionSizes(session); - inputHandler = - InputHandler(&session.nvim, &session.editorState.winManager, session.options); - session.reattached = true; + if (prevId != currSession->id) { + SessionSwitchInternal(*currSession); } return false; @@ -300,6 +284,19 @@ void SessionManager::FontSizeReset(bool all) { } } +void SessionManager::SessionSwitchInternal(SessionState& session) { + UpdateSessionSizes(session); + inputHandler = + InputHandler(&session.nvim, &session.editorState.winManager, session.options); + + DeferToMainThread([winPtr = window.Get(), + title = std::format("Neogurt - {}", session.name)] { + SDL_SetWindowTitle(winPtr, title.c_str()); + }); + + session.reattached = true; +} + void SessionManager::UpdateSessionSizes(SessionState& session) { session.editorState.fontFamily.TryChangeDpiScale(window.dpiScale); sizes.UpdateSizes( diff --git a/src/session/manager.hpp b/src/session/manager.hpp index 3016d05..504d3ed 100644 --- a/src/session/manager.hpp +++ b/src/session/manager.hpp @@ -74,6 +74,8 @@ struct SessionManager { void FontSizeReset(bool all = false); private: + // all session switching leads to this function + void SessionSwitchInternal(SessionState& session); void UpdateSessionSizes(SessionState& session); // void LoadSessions(std::string_view filename); diff --git a/src/utils/tsqueue.hpp b/src/utils/tsqueue.hpp index 20fa8eb..edb2a80 100644 --- a/src/utils/tsqueue.hpp +++ b/src/utils/tsqueue.hpp @@ -63,6 +63,12 @@ struct TSQueue { return queue.size(); } + bool Wait() { + std::unique_lock lock(mutex); + cv.wait(lock, [this]() { return !queue.empty() || exit; }); + return !exit; + } + void Exit() { { std::scoped_lock lock(mutex); @@ -70,10 +76,4 @@ struct TSQueue { } cv.notify_all(); } - - bool Wait() { - std::unique_lock lock(mutex); - cv.wait(lock, [this]() { return !queue.empty() || exit; }); - return !exit; - } };