From e53bf20a754775dfc6ee12da56a3404fb98d3207 Mon Sep 17 00:00:00 2001 From: vyfor Date: Sat, 21 Dec 2024 16:29:13 +0500 Subject: [PATCH] fix: an attempt to fix intermittent ui freezes --- lua/cord.lua | 92 +++++++++++++++++++++++------------------ lua/cord/core/ipc.lua | 25 +++++------ lua/cord/core/spawn.lua | 19 +++++---- 3 files changed, 73 insertions(+), 63 deletions(-) diff --git a/lua/cord.lua b/lua/cord.lua index 7cc709fc..716b4b3c 100644 --- a/lua/cord.lua +++ b/lua/cord.lua @@ -5,67 +5,72 @@ local logger = require 'cord.util.logger' local M = {} function M.initialize() - local client = ipc.new(config.values) - client:connect(function() + M.client = ipc.new(config.values) + M.client:connect(function() local file_manager = require 'cord.util.file_manager' local Producer = require 'cord.event.sender' local Handler = require 'cord.event.receiver' local uv = vim.loop or vim.uv - M.producer = Producer.new(client) - M.handler = Handler.new(client) - M.handler:register( - 'initialize', - vim.schedule_wrap(function(pid) - local executable = file_manager.get_executable_name() - local target_path = file_manager.get_target_path(executable) - uv.fs_stat(target_path, function(err) - if not err then - client:on_close(function() - file_manager.get_executable(pid, function(_, err, moved) + M.producer = Producer.new(M.client) + M.handler = Handler.new(M.client) + M.handler:register('initialize', function(pid) + local executable = file_manager.get_executable_name() + local target_path = file_manager.get_target_path(executable) + uv.fs_stat(target_path, function(err) + if not err then + M.client:on_close(function() + file_manager.get_executable( + pid, + vim.schedule_wrap(function(_, err, moved) if err then logger.error(err) return end if moved then - client:close() + M.client:close() M.initialize() end end) - end) - M.producer:shutdown() - else - M.handler:register( - 'ready', - vim.schedule_wrap(function() - logger.info 'Connected to Discord' + ) + end) + M.producer:shutdown() + else + M.handler:register( + 'ready', + vim.schedule_wrap(function() + logger.info 'Connected to Discord' - local ActivityManager = require 'cord.activity.manager' + local ActivityManager = require 'cord.activity.manager' - M.producer:initialize(config.values) + M.producer:initialize(config.values) - ActivityManager.new( - { tx = M.producer, config = config.values }, - vim.schedule_wrap(function(manager) - M.manager = manager + M.manager = ActivityManager.new( + { tx = M.producer, config = config.values }, + vim.schedule_wrap(function(manager) + M.client:on_close(vim.schedule_wrap(function() + if config.values.hooks.on_disconnect then + config.values.hooks.on_disconnect() + end - client:on_close(vim.schedule_wrap(function() - if config.values.hooks.on_disconnect then - config.values.hooks.on_disconnect() - end + manager:pause() + end)) + manager:run() + end) + ) - manager:pause() - end)) - manager:run() - end) - ) - end) - ) - end - end) + vim.cmd [[ + augroup Cord + autocmd! + autocmd VimLeavePre * lua require'cord'.cleanup() + augroup END + ]] + end) + ) + end end) - ) + end) M.handler:run() end) @@ -77,4 +82,9 @@ function M.setup(opts) if config:validate(opts or {}) then M.initialize() end end +function M.cleanup() + if M.manager then M.manager.idle_timer:close() end + if M.client then M.client:close() end +end + return M diff --git a/lua/cord/core/ipc.lua b/lua/cord/core/ipc.lua index 0837b454..785e6a5c 100644 --- a/lua/cord/core/ipc.lua +++ b/lua/cord/core/ipc.lua @@ -24,24 +24,21 @@ function IPC:connect(callback) local pipe = uv.new_pipe() self.pipe = pipe - pipe:connect( - self.path, - vim.schedule_wrap(function(err) - if err then - if err == 'ENOENT' then - spawn.spawn_server(self, function() self:connect(callback) end) - return - else - logger.error('Failed to connect to pipe: ' .. err) - end + pipe:connect(self.path, function(err) + if err then + if err == 'ENOENT' then + spawn.spawn_server(self, function() self:connect(callback) end) return + else + logger.error('Failed to connect to pipe: ' .. err) end + return + end - logger.debug('Connected to pipe: ' .. self.path) + logger.debug('Connected to pipe: ' .. self.path) - if callback then callback() end - end) - ) + if callback then callback() end + end) end function IPC:read_start(callback) diff --git a/lua/cord/core/spawn.lua b/lua/cord/core/spawn.lua index 563258d7..31c45839 100644 --- a/lua/cord/core/spawn.lua +++ b/lua/cord/core/spawn.lua @@ -55,15 +55,18 @@ function M.spawn_server(client, callback) local executable = client.config.advanced.server.executable_path if not executable then - file_manager.get_executable(nil, function(executable_path, err) - if err then - logger.error(err) - return - end + file_manager.get_executable( + nil, + vim.schedule_wrap(function(executable_path, err) + if err then + logger.error(err) + return + end - executable = executable_path - spawn(executable, client, callback) - end) + executable = executable_path + spawn(executable, client, callback) + end) + ) else spawn(executable, client, callback) end