From 5c88156b467eb2ab229b074f9a106766dde9d93c Mon Sep 17 00:00:00 2001 From: Krisjanis Rijnieks Date: Thu, 11 Feb 2016 15:41:39 +0100 Subject: [PATCH] Add `TerminalListener` from github.com/jvcleave --- src/Utils/TerminalListener.cpp | 68 ++++++++++++++++++++++++++++++++++ src/Utils/TerminalListener.h | 41 ++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/Utils/TerminalListener.cpp create mode 100644 src/Utils/TerminalListener.h diff --git a/src/Utils/TerminalListener.cpp b/src/Utils/TerminalListener.cpp new file mode 100644 index 0000000..df0af5c --- /dev/null +++ b/src/Utils/TerminalListener.cpp @@ -0,0 +1,68 @@ +#include "TerminalListener.h" + +KeyListenerEventData::KeyListenerEventData(char character, void * listener){ + this->character = character; + this->listener = listener; +} + +TerminalListener::TerminalListener(){ + sleepTime = 100; + listener = 0; +} + +TerminalListener::~TerminalListener(){ + close(); +} + +void TerminalListener::setup(KeyListener * listener_, int sleepTime_ = 0){ + listener = listener_; + + if(sleepTime_ > 0){ + sleepTime = sleepTime_; + } + + struct termios new_termios; + + tcgetattr(STDIN_FILENO, &orig_termios); + + new_termios = orig_termios; + new_termios.c_lflag &= ~(ICANON | ECHO | ECHOCTL | ECHONL); + new_termios.c_cflag |= HUPCL; + new_termios.c_cc[VMIN] = 0; + + tcsetattr(STDIN_FILENO, TCSANOW, &new_termios); + thread.start(*this); +} + +void TerminalListener::run(){ + while (thread.isRunning()){ + if (listener != NULL){ + int ch[8]; + int chnum = 0; + + while ((ch[chnum] = getchar()) != EOF){ + chnum++; + } + + if (chnum > 1){ + ch[0] = ch[chnum - 1]; + }else{ + (ch[chnum - 2] << 8); + } + + if (chnum > 0){ + //ofLog(OF_LOG_VERBOSE, "TerminalListener: character %c", ch[0]); + KeyListenerEventData eventData(ch[0], (void *)this); + listener->onCharacterReceived(eventData); + } + + thread.sleep(sleepTime); + } + } +} + +void TerminalListener::close(){ + tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios); + thread.tryJoin(50); + listener = NULL; +} diff --git a/src/Utils/TerminalListener.h b/src/Utils/TerminalListener.h new file mode 100644 index 0000000..da128dd --- /dev/null +++ b/src/Utils/TerminalListener.h @@ -0,0 +1,41 @@ +/* + * TerminalListener + * Helper for capturing keyboard input when via SSH + * Author: Jason Van Cleave / https://github.com/jvcleave + * Adaptor: Krisjanis Rijnieks / https://github.com/kr15h + */ + +#pragma once + +#include "ofMain.h" +#include + +class KeyListenerEventData { + public: + KeyListenerEventData(char character, void * listener); + void * listener; + char character; +}; + +class KeyListener { + public: + virtual void onCharacterReceived(KeyListenerEventData & e) = 0; +}; + + +class TerminalListener : public Poco::Runnable { + private: + struct termios orig_termios; + + public: + TerminalListener(); + ~TerminalListener(); + + void setup(KeyListener* listener_, int sleepTime_); + void run(); + void close(); + + KeyListener* listener; + Poco::Thread thread; + int sleepTime; +}; \ No newline at end of file