cursor movement and cursor hiding support for windows

This commit is contained in:
Felix Gündling
2020-04-25 08:49:30 +02:00
parent 4aef1470f1
commit ad5cf841be
4 changed files with 98 additions and 3 deletions

View File

@@ -0,0 +1,43 @@
#pragma once
#if defined(_MSC_VER)
#if !defined(NOMINMAX)
#define NOMINMAX
#endif
#include <io.h>
#include <windows.h>
#else
#include <cstdio>
#endif
namespace indicators {
#if defined(_MSC_VER)
void enable_cursor_movement() {
auto hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleMode(hStdout,
ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
}
void show_console_cursor(bool const show) {
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(out, &cursorInfo);
cursorInfo.bVisible = show; // set the cursor visibility
SetConsoleCursorInfo(out, &cursorInfo);
}
#else
void enable_cursor_movement() {}
void show_console_cursor(bool const show) {
std::fputs(show ? "\e[?25h" : "\e[?25l", stdout);
}
#endif
} // namespace indicators

View File

@@ -0,0 +1,46 @@
#pragma once
#if defined(_MSC_VER)
#if !defined(NOMINMAX)
#define NOMINMAX
#endif
#include <io.h>
#include <windows.h>
#else
#include <iostream>
#endif
namespace indicators {
#ifdef _MSC_VER
void move(int x, int y) {
auto hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (!hStdout)
return;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
GetConsoleScreenBufferInfo(hStdout, &csbiInfo);
COORD cursor;
cursor.X = csbiInfo.dwCursorPosition.X + x;
cursor.Y = csbiInfo.dwCursorPosition.Y + y;
SetConsoleCursorPosition(hStdout, cursor);
}
void move_up(int lines) { move(0, -lines); }
void move_down(int lines) { move(0, -lines); }
void move_right(int cols) { move(cols, 0); }
void move_left(int cols) { move(-cols, 0); }
#else
void move_up(int lines) { std::cout << "x1b[" << lines << "A"; }
void move_down(int lines) { std::cout << "x1b[" << lines << "B"; }
void move_right(int cols) { std::cout << "x1b[" << cols << "C"; }
void move_left(int cols) { std::cout << "x1b[" << cols << "D"; }
#endif
} // namespace indicators

View File

@@ -27,11 +27,13 @@ SOFTWARE.
#pragma once
#include <atomic>
#include <functional>
#include <indicators/color.hpp>
#include <iostream>
#include <mutex>
#include <vector>
#include <indicators/cursor_movement.hpp>
#include <indicators/color.hpp>
namespace indicators {
template <typename Indicator, size_t count> class MultiProgress {
@@ -86,8 +88,7 @@ private:
void print_progress() {
std::lock_guard<std::mutex> lock{mutex_};
if (started_)
for (size_t i = 0; i < count; ++i)
std::cout << "\x1b[A";
move_up(count);
for (auto &bar : bars_) {
bar.get().print_progress(true);
std::cout << "\n";

View File

@@ -1,7 +1,10 @@
#include <indicators/multi_progress.hpp>
#include <indicators/progress_bar.hpp>
#include <indicators/cursor_control.hpp>
int main() {
indicators::enable_cursor_movement();
indicators::show_console_cursor(false);
indicators::ProgressBar bar1{indicators::option::BarWidth{50},
indicators::option::Start{"["},
@@ -81,5 +84,7 @@ int main() {
second_job.join();
third_job.join();
indicators::show_console_cursor(true);
return 0;
}