Add a TrackMouse(false) on ScreenInteractive to disable mouse events (#726)

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.
This commit is contained in:
Stefan Ravn van Overeem 2023-08-19 10:57:50 +02:00 committed by GitHub
parent f7304c28c3
commit b3f1edc385
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 4 deletions

View File

@ -26,6 +26,7 @@ current (development)
Component Slider(SliderOption<T> options); Component Slider(SliderOption<T> options);
Component ResizableSplit(ResizableSplitOption options); Component ResizableSplit(ResizableSplitOption options);
``` ```
- Feature: Add `ScreenInteractive::TrackMouse(false)` disable mouse support.
### Dom ### Dom
- Feature: Add `hyperlink` decorator. For instance: - Feature: Add `hyperlink` decorator. For instance:

View File

@ -31,6 +31,9 @@ class ScreenInteractive : public Screen {
static ScreenInteractive FitComponent(); static ScreenInteractive FitComponent();
static ScreenInteractive TerminalOutput(); static ScreenInteractive TerminalOutput();
// Options. Must be called before Loop().
void TrackMouse(bool enable = true);
// Return the currently active screen, nullptr if none. // Return the currently active screen, nullptr if none.
static ScreenInteractive* Active(); static ScreenInteractive* Active();
@ -84,6 +87,8 @@ class ScreenInteractive : public Screen {
Dimension dimension, Dimension dimension,
bool use_alternative_screen); bool use_alternative_screen);
bool track_mouse_= true;
Sender<Task> task_sender_; Sender<Task> task_sender_;
Receiver<Task> task_receiver_; Receiver<Task> task_receiver_;

View File

@ -379,6 +379,26 @@ ScreenInteractive ScreenInteractive::FitComponent() {
}; };
} }
/// @ingroup component
/// @brief Set whether mouse is tracked and events reported.
/// called outside of the main loop. E.g `ScreenInteractive::Loop(...)`.
/// @param enable Whether to enable mouse event tracking.
/// @note This muse be called outside of the main loop. E.g. before calling
/// `ScreenInteractive::Loop`.
/// @note Mouse tracking is enabled by default.
/// @note Mouse tracking is only supported on terminals that supports it.
///
/// ### Example
///
/// ```cpp
/// auto screen = ScreenInteractive::TerminalOutput();
/// screen.TrackMouse(false);
/// screen.Loop(component);
/// ```
void ScreenInteractive::TrackMouse(bool enable) {
track_mouse_ = enable;
}
void ScreenInteractive::Post(Task task) { void ScreenInteractive::Post(Task task) {
// Task/Events sent toward inactive screen or screen waiting to become // Task/Events sent toward inactive screen or screen waiting to become
// inactive are dropped. // inactive are dropped.
@ -580,10 +600,12 @@ void ScreenInteractive::Install() {
DECMode::kLineWrap, DECMode::kLineWrap,
}); });
enable({DECMode::kMouseVt200}); if (track_mouse_) {
enable({DECMode::kMouseAnyEvent}); enable({DECMode::kMouseVt200});
enable({DECMode::kMouseUrxvtMode}); enable({DECMode::kMouseAnyEvent});
enable({DECMode::kMouseSgrExtMode}); enable({DECMode::kMouseUrxvtMode});
enable({DECMode::kMouseSgrExtMode});
}
// After installing the new configuration, flush it to the terminal to // After installing the new configuration, flush it to the terminal to
// ensure it is fully applied: // ensure it is fully applied: