diff --git a/compositorcontroller.cpp b/compositorcontroller.cpp index 463054a..6038075 100644 --- a/compositorcontroller.cpp +++ b/compositorcontroller.cpp @@ -96,6 +96,16 @@ namespace RdkShell bool enabled; }; + struct GenerateKeyEvent + { + GenerateKeyEvent(const std::string& client, uint32_t keyCode, uint32_t modifiers, double triggerTime) : + client(client) , triggerTime(triggerTime), keyCode(keyCode), modifiers(modifiers) {} + std::string client; + double triggerTime; + uint32_t keyCode; + uint32_t modifiers; + }; + typedef std::vector CompositorList; typedef CompositorList::iterator CompositorListIterator; @@ -137,6 +147,8 @@ namespace RdkShell bool gIgnoreKeyInputEnabled = false; std::shared_ptr gCursor = nullptr; KeyRepeatConfig gKeyRepeatConfig; + std::vector gGenerateKeyEvents; + std::string standardizeName(const std::string& clientName) { @@ -422,6 +434,36 @@ namespace RdkShell } } + + void updateGenerateKeyEvents() + { + double currentTime = RdkShell::seconds(); + auto it = gGenerateKeyEvents.begin(); + while (it != gGenerateKeyEvents.end()) + { + if (it->triggerTime <= currentTime) + { + if (it->client.empty()) + { + CompositorController::onKeyRelease(it->keyCode, it->modifiers, 0, false); + } + else + { + CompositorListIterator cit; + if (getCompositorInfo(it->client, cit)) + { + cit->compositor->onKeyRelease(it->keyCode, it->modifiers, 0); + } + } + + it = gGenerateKeyEvents.erase(it); + } + else + ++it; + } + } + + std::shared_ptr CompositorController::getCompositor(const std::string& displayName) { auto lambda = [displayName](CompositorInfo& info) @@ -1013,6 +1055,11 @@ namespace RdkShell } bool CompositorController::generateKey(const std::string& client, const uint32_t& keyCode, const uint32_t& flags, std::string virtualKey) + { + return generateKey(client, keyCode, flags, virtualKey, 0.0); + } + + bool CompositorController::generateKey(const std::string& client, const uint32_t& keyCode, const uint32_t& flags, std::string virtualKey, double duration) { bool ret = false; uint32_t code = keyCode, modifiers = flags; @@ -1028,8 +1075,18 @@ namespace RdkShell if (client.empty()) { - CompositorController::onKeyPress(code, modifiers, 0, false); CompositorController::onKeyRelease(code, modifiers, 0, false); + + if (duration == 0.0) + { + CompositorController::onKeyRelease(code, modifiers, 0, false); + } + else + { + GenerateKeyEvent event(client, code, modifiers, RdkShell::seconds() + duration); + gGenerateKeyEvents.push_back(event); + } + ret = true; } else @@ -1040,7 +1097,16 @@ namespace RdkShell if (it->compositor != nullptr) { it->compositor->onKeyPress(code, modifiers, 0); - it->compositor->onKeyRelease(code, modifiers, 0); + + if (duration == 0.0) + { + it->compositor->onKeyRelease(code, modifiers, 0); + } + else + { + GenerateKeyEvent event(client, code, modifiers, RdkShell::seconds() + duration); + gGenerateKeyEvents.push_back(event); + } ret = true; } } @@ -1667,7 +1733,8 @@ namespace RdkShell resolveWaitingEasterEggs(); RdkShell::Animator::instance()->animate(); updateKeyRepeat(); - + updateGenerateKeyEvents(); + if (gEnableInactivityReporting) { double currentTime = RdkShell::seconds(); diff --git a/compositorcontroller.h b/compositorcontroller.h index b0f383f..721723c 100644 --- a/compositorcontroller.h +++ b/compositorcontroller.h @@ -68,6 +68,7 @@ namespace RdkShell static bool removeKeyMetadataListener(const std::string& client); static bool injectKey(const uint32_t& keyCode, const uint32_t& flags); static bool generateKey(const std::string& client, const uint32_t& keyCode, const uint32_t& flags, std::string virtualKey=""); + static bool generateKey(const std::string& client, const uint32_t& keyCode, const uint32_t& flags, std::string virtualKey, double duration); static bool getScreenResolution(uint32_t &width, uint32_t &height); static bool setScreenResolution(const uint32_t width, const uint32_t height); static bool getClients(std::vector& clients);