diff --git a/shell_integration/windows/NCContextMenu/NCClientInterface.cpp b/shell_integration/windows/NCContextMenu/NCClientInterface.cpp index 380f4e22291b2..4c5d665139aae 100644 --- a/shell_integration/windows/NCContextMenu/NCClientInterface.cpp +++ b/shell_integration/windows/NCContextMenu/NCClientInterface.cpp @@ -48,7 +48,10 @@ NCClientInterface::ContextMenuInfo NCClientInterface::FetchInfo(const std::wstri ContextMenuInfo info; std::wstring response; int sleptCount = 0; - while (sleptCount < 20) { + constexpr auto noReplyTimeout = 20; + constexpr auto replyTimeout = 200; + bool receivedReplyFromDesktopClient = false; + while ((!receivedReplyFromDesktopClient && sleptCount < noReplyTimeout) || (receivedReplyFromDesktopClient && sleptCount < replyTimeout)) { if (socket.ReadLine(&response)) { if (StringUtil::begins_with(response, wstring(L"REGISTER_PATH:"))) { wstring responsePath = response.substr(14); // length of REGISTER_PATH @@ -65,6 +68,9 @@ NCClientInterface::ContextMenuInfo NCClientInterface::FetchInfo(const std::wstri if (!StringUtil::extractChunks(response, commandName, flags, title)) continue; info.menuItems.push_back({ commandName, flags, title }); + } else if (StringUtil::begins_with(response, wstring(L"GET_MENU_ITEMS:BEGIN"))) { + receivedReplyFromDesktopClient = true; + continue; } else if (StringUtil::begins_with(response, wstring(L"GET_MENU_ITEMS:END"))) { break; // Stop once we completely received the last sent request } diff --git a/src/gui/socketapi/socketapi.cpp b/src/gui/socketapi/socketapi.cpp index 47a589b3de8e3..837884bd8a4b6 100644 --- a/src/gui/socketapi/socketapi.cpp +++ b/src/gui/socketapi/socketapi.cpp @@ -1330,7 +1330,7 @@ SocketApi::FileData SocketApi::FileData::parentFolder() const void SocketApi::command_GET_MENU_ITEMS(const QString &argument, OCC::SocketListener *listener) { - listener->sendMessage(QString("GET_MENU_ITEMS:BEGIN")); + listener->sendMessage(QString("GET_MENU_ITEMS:BEGIN"), true); const QStringList files = split(argument); // Find the common sync folder.