The repository had no licence at all, so every source was all-rights-reserved by default. Add the verbatim MIT text at LICENSE (Copyright (c) 2026 Martino Ferrari) and a two-line SPDX header to each of the 113 first-party sources -- 48 include/plot, 26 src, 10 adapters, 5 examples, 21 tests, 3 tools -- so the grant travels with each file rather than relying on the root document alone. Scripts keep their shebang on line 1; the SPDX lines follow it. Genuinely vendored code is untouched: third_party/stb_truetype.h carries no header of ours. src/render/embedded_mono_font.cpp is generated, so tools/fonts/gen_atlas.py emit() now writes the two lines into its header comment and the file was regenerated -- gen_atlas.py --check passes and the regeneration adds only those comment lines to the previously committed file. README's provenance section now states MIT and links LICENSE. No code, test or public API change.
69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
// SPDX-License-Identifier: MIT
|
|
// SPDX-FileCopyrightText: 2026 Martino Ferrari
|
|
|
|
#pragma once
|
|
|
|
#include <plot/core/types.hpp>
|
|
|
|
namespace plot::input {
|
|
|
|
/// Mouse buttons a host can report. The controller never assumes a fixed
|
|
/// mapping: right-drag pans as well as left, for hosts that reserve left-drag.
|
|
enum class Button { Left, Middle, Right };
|
|
|
|
/// Keyboard modifier bits for `PointerEvent::mods` / `WheelEvent::mods`.
|
|
enum class Mod { None = 0, Shift = 1, Ctrl = 2, Alt = 4, Super = 8 };
|
|
|
|
/// True when `mods` holds `m`. The single place modifier bits are tested, so a
|
|
/// call site never hand-rolls a mask.
|
|
constexpr bool has_mod(u32 mods, Mod m) noexcept {
|
|
return (mods & static_cast<u32>(m)) != 0u;
|
|
}
|
|
|
|
/// A pointer event in viewport pixels (origin top-left, the same space as
|
|
/// `Rect`). `dx`/`dy` are the movement since the previous event; the controller
|
|
/// reads them for panning and the absolute `x`/`y` for anchoring and hit tests.
|
|
/// `pressed` and `released` are the transitions; `down` is the state after the
|
|
/// event. A plain move has all three false/true as appropriate (down only).
|
|
struct PointerEvent {
|
|
f32 x = 0.0f;
|
|
f32 y = 0.0f;
|
|
f32 dx = 0.0f;
|
|
f32 dy = 0.0f;
|
|
Button button = Button::Left;
|
|
u32 mods = 0;
|
|
bool down = false; ///< the button is held after this event
|
|
bool pressed = false; ///< a press transition happened on this event
|
|
bool released = false; ///< a release transition happened on this event
|
|
};
|
|
|
|
/// A wheel/scroll event at a pixel position. A positive `dy` (scroll up) zooms
|
|
/// in; a positive `dx` scrolls right. Only `dy` drives the controller's zoom.
|
|
struct WheelEvent {
|
|
f32 x = 0.0f;
|
|
f32 y = 0.0f;
|
|
f32 dx = 0.0f;
|
|
f32 dy = 0.0f;
|
|
u32 mods = 0;
|
|
};
|
|
|
|
/// A key event. `key` is an ASCII codepoint for printable keys; hosts that only
|
|
/// have scancodes translate them before calling. `down` distinguishes the press
|
|
/// from the release -- the controller's actions are press-only.
|
|
struct KeyEvent {
|
|
int key = 0;
|
|
u32 mods = 0;
|
|
bool down = false;
|
|
};
|
|
|
|
/// The printable keys the controller reacts to, named so no call site spells a
|
|
/// bare character literal. `kKeyZoomIn`/`kKeyZoomOut` zoom about the plot centre,
|
|
/// `kKeyFit` re-fits every axis to its traces.
|
|
inline constexpr int kKeyZoomIn = '+';
|
|
inline constexpr int kKeyZoomOut = '-';
|
|
inline constexpr int kKeyFit = 'f';
|
|
/// Hosts that report shifted keys uppercase can pass this unchanged.
|
|
inline constexpr int kKeyFitUpper = 'F';
|
|
|
|
} // namespace plot::input
|