Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 70 additions & 3 deletions compositorcontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<CompositorInfo> CompositorList;
typedef CompositorList::iterator CompositorListIterator;

Expand Down Expand Up @@ -137,6 +147,8 @@ namespace RdkShell
bool gIgnoreKeyInputEnabled = false;
std::shared_ptr<Cursor> gCursor = nullptr;
KeyRepeatConfig gKeyRepeatConfig;
std::vector<GenerateKeyEvent> gGenerateKeyEvents;


std::string standardizeName(const std::string& clientName)
{
Expand Down Expand Up @@ -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<RdkCompositor> CompositorController::getCompositor(const std::string& displayName)
{
auto lambda = [displayName](CompositorInfo& info)
Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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;
}
}
Expand Down Expand Up @@ -1667,7 +1733,8 @@ namespace RdkShell
resolveWaitingEasterEggs();
RdkShell::Animator::instance()->animate();
updateKeyRepeat();

updateGenerateKeyEvents();

if (gEnableInactivityReporting)
{
double currentTime = RdkShell::seconds();
Expand Down
1 change: 1 addition & 0 deletions compositorcontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::string>& clients);
Expand Down