Skip to content

Commit

Permalink
Added a global LogPooler to allow pooling of Logs across modes.
Browse files Browse the repository at this point in the history
  • Loading branch information
pit-ray committed Dec 3, 2021
1 parent 15d281d commit 213ca0b
Show file tree
Hide file tree
Showing 11 changed files with 145 additions and 39 deletions.
4 changes: 3 additions & 1 deletion src/bind/easyclick/input_hinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "core/char_logger.hpp"
#include "core/entry.hpp"
#include "core/key_absorber.hpp"
#include "core/logpooler.hpp"
#include "util/winwrap.hpp"

namespace vind
Expand Down Expand Up @@ -91,7 +92,8 @@ namespace vind
};

while(core::update_background() && !(pimpl->cancel_running_)) {
if(!CHAR_LOGGED(lgr.logging_state())) {
auto log = core::LogPooler::get_instance().pop_log() ;
if(!CHAR_LOGGED(lgr.logging_state(log))) {
continue ;
}

Expand Down
7 changes: 5 additions & 2 deletions src/bind/emu/edi_motion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "core/entry.hpp"
#include "core/func_finder.hpp"
#include "core/key_absorber.hpp"
#include "core/logpooler.hpp"
#include "core/mode.hpp"
#include "core/ntype_logger.hpp"
#include "edi_delete.hpp"
Expand All @@ -25,7 +26,8 @@ namespace
core::InstantKeyAbsorber ika ;

while(core::update_background()) {
auto result = lgr.logging_state() ;
auto log = core::LogPooler::get_instance().pop_log() ;
auto result = lgr.logging_state(log) ;
if(NTYPE_EMPTY(result)) {
continue ;
}
Expand Down Expand Up @@ -85,7 +87,8 @@ namespace
core::InstantKeyAbsorber ika ;

while(core::update_background()) {
auto result = lgr.logging_state() ;
auto log = core::LogPooler::get_instance().pop_log() ;
auto result = lgr.logging_state(log) ;
auto parent_result = parent_lgr.logging_state() ;
if(NTYPE_EMPTY(result) && NTYPE_EMPTY(parent_result)) {
continue ;
Expand Down
4 changes: 3 additions & 1 deletion src/bind/mode/command_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "core/key_logger_base.hpp"
#include "core/keycode_def.hpp"
#include "core/keycodecvt.hpp"
#include "core/logpooler.hpp"
#include "core/mode.hpp"
#include "core/ntype_logger.hpp"
#include "opt/vcmdline.hpp"
Expand Down Expand Up @@ -178,7 +179,8 @@ namespace vind
auto& p_cmdp = pimpl->ch_.get_hist_point() ;
auto& lgr = p_cmdp->logger ;

if(CHAR_EMPTY(lgr.logging_state())) {
auto log = core::LogPooler::get_instance().pop_log() ;
if(CHAR_EMPTY(lgr.logging_state(log))) {
continue ;
}

Expand Down
4 changes: 3 additions & 1 deletion src/bind/mode/instant_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "core/func_finder.hpp"
#include "core/key_absorber.hpp"
#include "core/key_logger_base.hpp"
#include "core/logpooler.hpp"
#include "core/mode.hpp"
#include "core/ntype_logger.hpp"
#include "opt/vcmdline.hpp"
Expand Down Expand Up @@ -43,7 +44,8 @@ namespace vind
pimpl->finder_.reset_parser_states(lcx_vmode) ;
core::NTypeLogger lgr ;
while(core::update_background()) {
auto result = lgr.logging_state() ;
auto log = core::LogPooler::get_instance().pop_log() ;
auto result = lgr.logging_state(log) ;
if(NTYPE_EMPTY(result)) {
continue ;
}
Expand Down
4 changes: 3 additions & 1 deletion src/bind/window/switch_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "core/func_finder.hpp"
#include "core/key_absorber.hpp"
#include "core/key_logger_base.hpp"
#include "core/logpooler.hpp"
#include "core/mode.hpp"
#include "core/ntype_logger.hpp"
#include "util/def.hpp"
Expand Down Expand Up @@ -75,7 +76,8 @@ namespace vind
core::NTypeLogger lgr ;
std::size_t actid = 0 ;
while(core::update_background()) {
if(!NTYPE_LOGGED(lgr.logging_state())) {
auto log = core::LogPooler::get_instance().pop_log() ;
if(!NTYPE_LOGGED(lgr.logging_state(log))) {
continue ;
}

Expand Down
4 changes: 3 additions & 1 deletion src/bind/window/window_resizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "core/func_finder.hpp"
#include "core/g_params.hpp"
#include "core/key_absorber.hpp"
#include "core/logpooler.hpp"
#include "core/ntype_logger.hpp"
#include "opt/vcmdline.hpp"
#include "util/constant_accelerator.hpp"
Expand Down Expand Up @@ -220,7 +221,8 @@ namespace vind

std::size_t actid = 0 ;
while(core::update_background()) {
if(!NTYPE_LOGGED(lgr.logging_state())) {
auto log = core::LogPooler::get_instance().pop_log() ;
if(!NTYPE_LOGGED(lgr.logging_state(log))) {
continue ;
}

Expand Down
77 changes: 77 additions & 0 deletions src/core/logpooler.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#include "logpooler.hpp"

#include "key_absorber.hpp"
#include "key_log.hpp"
#include "mapgate.hpp"

#include <queue>


#if defined(DEBUG)

#include "key_logger_base.hpp"

#include <iostream>

#endif


namespace vind
{
namespace core
{
struct LogPooler::Impl {
std::queue<KeyLog> pool_{} ;
} ;

LogPooler::LogPooler()
: pimpl(std::make_unique<Impl>())
{}

LogPooler::~LogPooler() noexcept = default ;

LogPooler& LogPooler::get_instance() {
static LogPooler instance ;
return instance ;
}

void LogPooler::push_log(const KeyLog& log) {
pimpl->pool_.push(log) ;
}

void LogPooler::push_log(KeyLog&& log) {
pimpl->pool_.push(std::move(log)) ;
}

KeyLog LogPooler::pop_log() {
KeyLog log ;
if(pimpl->pool_.empty()) {
log = get_pressed_list() ;

auto logs = MapGate::get_instance().map_logger(log) ;
if(!logs.empty()) {
auto itr = std::make_move_iterator(logs.begin()) ;
log = std::move(*itr) ;
itr ++ ;

//
// To simulate the input, make a state transition with an empty log.
// This is to make the logger recognize that it is a key release,
// not a long pressing of the key.
//
while(itr != std::make_move_iterator(logs.end())) {
pimpl->pool_.emplace() ;
pimpl->pool_.push(std::move(*itr)) ;
itr ++ ;
}
}
}
else {
log = std::move(pimpl->pool_.front()) ;
pimpl->pool_.pop() ;
}

return log ;
}
}
}
38 changes: 38 additions & 0 deletions src/core/logpooler.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#ifndef _LOGPOOLER_HPP
#define _LOGPOOLER_HPP

#include <memory>


namespace vind
{
namespace core
{
class KeyLog ;

class LogPooler {
private:
struct Impl ;
std::unique_ptr<Impl> pimpl ;

explicit LogPooler() ;
virtual ~LogPooler() noexcept ;

public:
static LogPooler& get_instance() ;

void push_log(const KeyLog& log) ;
void push_log(KeyLog&& log) ;

KeyLog pop_log() ;

LogPooler(LogPooler&&) = delete ;
LogPooler& operator=(LogPooler&&) = delete ;
LogPooler(const LogPooler&) = delete ;
LogPooler& operator=(const LogPooler&) = delete ;
} ;

}
}

#endif
27 changes: 3 additions & 24 deletions src/core/main_loop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "key_logger_base.hpp"
#include "keycode_def.hpp"
#include "logger_parser.hpp"
#include "logpooler.hpp"
#include "mapgate.hpp"
#include "ntype_logger.hpp"

Expand All @@ -24,16 +25,13 @@ namespace
core::NTypeLogger g_ntlgr{} ;
core::FuncFinder g_funcfinder{} ;
bind::BindedFunc::SPtr g_active_func = nullptr ;

core::MapGate::KeyLogPool g_logpool{} ;
}

namespace vind
{
namespace core {
void initialize_mainloop() {
g_ntlgr.clear() ;
core::MapGate::KeyLogPool().swap(g_logpool) ;
g_active_func = nullptr ;
}

Expand All @@ -47,26 +45,7 @@ namespace vind
}

void update_mainloop() {
auto has_pool = !g_logpool.empty() ;

KeyLog log{} ;
if(!has_pool) {
log = get_pressed_list() ;

auto logpool = MapGate::get_instance().map_logger(log) ;
if(!logpool.empty()) {
log = std::move(logpool.front()) ;
logpool.pop() ;

if(!logpool.empty()) {
g_logpool.swap(logpool) ;
}
}
}
else {
log = std::move(g_logpool.front()) ;
g_logpool.pop() ;
}
auto log = LogPooler::get_instance().pop_log() ;

auto result = g_ntlgr.logging_state(log) ;

Expand All @@ -79,7 +58,7 @@ namespace vind
return ;
}

std::cout << print(g_ntlgr) << std::endl ;
// std::cout << print(g_ntlgr) << std::endl ;

if(g_ntlgr.is_long_pressing()) {
if(g_active_func) {
Expand Down
10 changes: 5 additions & 5 deletions src/core/mapgate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ namespace vind
namespace core
{
struct MapGate::Impl {
ModeArray<std::unordered_map<std::size_t, KeyLogPool>> logpool_table_{} ;
ModeArray<std::unordered_map<std::size_t, std::vector<KeyLog>>> logpool_table_{} ;
ModeArray<LoggerParserManager> mgr_table_{} ;

ModeArray<Key2KeysetMap> syncmap_table_{} ;
Expand Down Expand Up @@ -412,7 +412,7 @@ namespace vind
parsers.push_back(std::move(parser)) ;

for(const auto& keyset : solved_target_cmds[mapid]) {
logpool[func->id()].emplace(keyset.begin(), keyset.end()) ;
logpool[func->id()].emplace_back(keyset.begin(), keyset.end()) ;
}
}

Expand All @@ -424,7 +424,7 @@ namespace vind
parsers.push_back(std::move(parser)) ;

for(const auto& keyset : map.target_command()) {
logpool[func->id()].emplace(keyset.begin(), keyset.end()) ;
logpool[func->id()].emplace_back(keyset.begin(), keyset.end()) ;
}
}

Expand All @@ -439,7 +439,7 @@ namespace vind
}
}

MapGate::KeyLogPool MapGate::map_logger(
std::vector<KeyLog> MapGate::map_logger(
const KeyLog& log,
Mode mode) {
auto midx = static_cast<int>(mode) ;
Expand All @@ -463,7 +463,7 @@ namespace vind
mgr.reset_parser_states() ;
}

return KeyLogPool{} ;
return std::vector<KeyLog>{} ;
}

bool MapGate::map_syncstate(
Expand Down
5 changes: 2 additions & 3 deletions src/core/mapgate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "mode.hpp"

#include <memory>
#include <queue>
#include <vector>


namespace vind
Expand Down Expand Up @@ -38,8 +38,7 @@ namespace vind
// but in the case of map, the key message is generated in a state that is passed to Windows.
//
//
using KeyLogPool = std::queue<KeyLog> ;
KeyLogPool map_logger(
std::vector<KeyLog> map_logger(
const KeyLog& log,
Mode mode=get_global_mode()) ;

Expand Down

0 comments on commit 213ca0b

Please sign in to comment.