From 5a0c67f86a033599c708fd49f3675aa5995cfc75 Mon Sep 17 00:00:00 2001 From: Fabien Spindler Date: Thu, 6 Jul 2023 10:45:35 +0200 Subject: [PATCH] Port vpKeyboard on windows --- example/tools/keyboard.cpp | 11 ------ modules/io/include/visp3/io/vpKeyboard.h | 9 +++-- modules/io/src/tools/vpKeyboard.cpp | 50 +++++++++++++++++++++--- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/example/tools/keyboard.cpp b/example/tools/keyboard.cpp index 350909da07..f240607785 100644 --- a/example/tools/keyboard.cpp +++ b/example/tools/keyboard.cpp @@ -31,7 +31,6 @@ * Description: * Example of keyboard management. * - * *****************************************************************************/ /*! @@ -43,10 +42,7 @@ #include #include -#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) #include -#include -#include #include @@ -77,10 +73,3 @@ int main() return EXIT_SUCCESS; } -#else -int main() -{ - std::cout << "vpKeyboard class works only on unix..." << std::endl; - return EXIT_SUCCESS; -} -#endif diff --git a/modules/io/include/visp3/io/vpKeyboard.h b/modules/io/include/visp3/io/vpKeyboard.h index c538706309..583f902987 100644 --- a/modules/io/include/visp3/io/vpKeyboard.h +++ b/modules/io/include/visp3/io/vpKeyboard.h @@ -43,12 +43,13 @@ #include -#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) - #include + +#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) #include #include #include +#endif // defined UNIX /*! @@ -88,6 +89,7 @@ class VISP_EXPORT vpKeyboard int kbhit(); int getchar(); +#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) private: void init(); void end(); @@ -95,8 +97,7 @@ class VISP_EXPORT vpKeyboard void setRawMode(bool active); struct termios initial_settings, new_settings; -}; - #endif // defined UNIX +}; #endif diff --git a/modules/io/src/tools/vpKeyboard.cpp b/modules/io/src/tools/vpKeyboard.cpp index ddfe98986c..9625871d7f 100644 --- a/modules/io/src/tools/vpKeyboard.cpp +++ b/modules/io/src/tools/vpKeyboard.cpp @@ -33,9 +33,13 @@ * *****************************************************************************/ -#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) #include + +#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) #include +#elif defined(_WIN32) +#include +#endif #include /*! @@ -46,12 +50,27 @@ /*! Activates the raw mode to read keys in an non blocking way. */ -vpKeyboard::vpKeyboard() : initial_settings(), new_settings() { init(); } +vpKeyboard::vpKeyboard() +#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) + : initial_settings(), new_settings() +{ + init(); +} +#else +{} +#endif + + /*! Stops the raw mode. */ -vpKeyboard::~vpKeyboard() { end(); } +vpKeyboard::~vpKeyboard() +{ +#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) + end(); +#endif +} /*! @@ -59,9 +78,16 @@ vpKeyboard::~vpKeyboard() { end(); } */ int vpKeyboard::getchar() { +#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) int c; c = ::getchar(); return c; +#elif defined(_WIN32) + return _getch(); +#else + std::cout << "vpKeyboard class is not supported by your system!" << std::endl; + return 0; +#endif } /*! @@ -71,6 +97,7 @@ int vpKeyboard::getchar() */ int vpKeyboard::kbhit() { +#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) struct timeval tv = {0, 0}; fd_set readfds; @@ -78,19 +105,32 @@ int vpKeyboard::kbhit() FD_SET(STDIN_FILENO, &readfds); return select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv) == 1; +#elif defined(_WIN32) + return _kbhit(); +#else + std::cout << "vpKeyboard class is not supported by your system!" << std::endl; + return 0; +#endif } +#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) /*! Activates the raw mode to read keys in an non blocking way. */ -void vpKeyboard::init() { setRawMode(true); } +void vpKeyboard::init() +{ + setRawMode(true); +} /*! Stops the raw mode. */ -void vpKeyboard::end() { setRawMode(false); } +void vpKeyboard::end() +{ + setRawMode(false); +} /*! Turns on/off the 'raw' mode.