mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2024-11-29 14:45:53 +08:00
b3f1edc385
When mouse events are enabled, it is not possible to select text in the terminal and copy it somewhere else. This could be usefull for some applications if they don't need to handle mouse events. Add a function on the ScreenInteractive class to disable grabbing of mouse events so that it is e.g. possible to select text in the user interface. The function needs to be called on the screen object before starting the application loop if such a behaviour is desired.
129 lines
3.5 KiB
C++
129 lines
3.5 KiB
C++
#ifndef FTXUI_COMPONENT_SCREEN_INTERACTIVE_HPP
|
|
#define FTXUI_COMPONENT_SCREEN_INTERACTIVE_HPP
|
|
|
|
#include <atomic> // for atomic
|
|
#include <ftxui/component/receiver.hpp> // for Receiver, Sender
|
|
#include <functional> // for function
|
|
#include <memory> // for shared_ptr
|
|
#include <string> // for string
|
|
#include <thread> // for thread
|
|
#include <variant> // for variant
|
|
|
|
#include "ftxui/component/animation.hpp" // for TimePoint
|
|
#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse
|
|
#include "ftxui/component/event.hpp" // for Event
|
|
#include "ftxui/component/task.hpp" // for Task, Closure
|
|
#include "ftxui/screen/screen.hpp" // for Screen
|
|
|
|
namespace ftxui {
|
|
class ComponentBase;
|
|
class Loop;
|
|
struct Event;
|
|
|
|
using Component = std::shared_ptr<ComponentBase>;
|
|
class ScreenInteractivePrivate;
|
|
|
|
class ScreenInteractive : public Screen {
|
|
public:
|
|
// Constructors:
|
|
static ScreenInteractive FixedSize(int dimx, int dimy);
|
|
static ScreenInteractive Fullscreen();
|
|
static ScreenInteractive FitComponent();
|
|
static ScreenInteractive TerminalOutput();
|
|
|
|
// Options. Must be called before Loop().
|
|
void TrackMouse(bool enable = true);
|
|
|
|
// Return the currently active screen, nullptr if none.
|
|
static ScreenInteractive* Active();
|
|
|
|
// Start/Stop the main loop.
|
|
void Loop(Component);
|
|
void Exit();
|
|
Closure ExitLoopClosure();
|
|
|
|
// Post tasks to be executed by the loop.
|
|
void Post(Task task);
|
|
void PostEvent(Event event);
|
|
void RequestAnimationFrame();
|
|
|
|
CapturedMouse CaptureMouse();
|
|
|
|
// Decorate a function. The outputted one will execute similarly to the
|
|
// inputted one, but with the currently active screen terminal hooks
|
|
// temporarily uninstalled.
|
|
Closure WithRestoredIO(Closure);
|
|
|
|
private:
|
|
void ExitNow();
|
|
|
|
void Install();
|
|
void Uninstall();
|
|
|
|
void PreMain();
|
|
void PostMain();
|
|
|
|
bool HasQuitted();
|
|
void RunOnce(Component component);
|
|
void RunOnceBlocking(Component component);
|
|
|
|
void HandleTask(Component component, Task& task);
|
|
void Draw(Component component);
|
|
void ResetCursorPosition();
|
|
|
|
void Signal(int signal);
|
|
|
|
ScreenInteractive* suspended_screen_ = nullptr;
|
|
enum class Dimension {
|
|
FitComponent,
|
|
Fixed,
|
|
Fullscreen,
|
|
TerminalOutput,
|
|
};
|
|
Dimension dimension_ = Dimension::Fixed;
|
|
bool use_alternative_screen_ = false;
|
|
ScreenInteractive(int dimx,
|
|
int dimy,
|
|
Dimension dimension,
|
|
bool use_alternative_screen);
|
|
|
|
bool track_mouse_= true;
|
|
|
|
Sender<Task> task_sender_;
|
|
Receiver<Task> task_receiver_;
|
|
|
|
std::string set_cursor_position;
|
|
std::string reset_cursor_position;
|
|
|
|
std::atomic<bool> quit_ = false;
|
|
std::thread event_listener_;
|
|
std::thread animation_listener_;
|
|
bool animation_requested_ = false;
|
|
animation::TimePoint previous_animation_time_;
|
|
|
|
int cursor_x_ = 1;
|
|
int cursor_y_ = 1;
|
|
|
|
bool mouse_captured = false;
|
|
bool previous_frame_resized_ = false;
|
|
|
|
bool frame_valid_ = false;
|
|
|
|
friend class Loop;
|
|
|
|
public:
|
|
class Private {
|
|
public:
|
|
static void Signal(ScreenInteractive& s, int signal) { s.Signal(signal); }
|
|
};
|
|
friend Private;
|
|
};
|
|
|
|
} // namespace ftxui
|
|
|
|
#endif /* end of include guard: FTXUI_COMPONENT_SCREEN_INTERACTIVE_HPP */
|
|
|
|
// Copyright 2020 Arthur Sonzogni. All rights reserved.
|
|
// Use of this source code is governed by the MIT license that can be found in
|
|
// the LICENSE file.
|