Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ The v0.9.23+ prebuilt `wayscriber` packages require glibc 2.39 and GTK 4.12. See
- Blur tool with four styles: soften, pixelate, secure (flattens the region to one color), and black out
- Spotlight tool: dims everything except the regions you draw, with optional 1×–4× magnification
- Multiline text and sticky notes with smoothing; optional text halos take their contrast from the background the label sits on, so a label stays readable over a board, a filled shape, or a frozen screen (disable with `[drawing] text_halo_enabled = false`; a live transparent board has no pixels to sample and falls back to the text color)
- Selection: <kbd>Alt</kbd>-drag, <kbd>V</kbd> tool, properties panel (<kbd>Ctrl+Alt+P</kbd> or right-click → **Properties**): swatches from your quick-color palette plus **+** for the full color picker (an opaque swatch changes the hue and keeps each shape's opacity), thickness and opacity sliders (one drag is one undo step), a fill row for rectangles, ellipses, and polygons whose first swatch is "no fill" and whose others fill with their own color, independent of the border, −/+ steppers, on/off switches, the arrow head's Start/End, drawn arrow styles, a lock toggle, and buttons to send the selection to the back, back one step, forward one step, or to the front, and to duplicate or delete it; a preset row applies a tool preset's style to the selection (keeping the current tool), and **Save** then a slot stores the selection's style as that preset; scroll over a row to step it, and hover the title for the shape's ID and creation time
- Selection: <kbd>Alt</kbd>-drag, <kbd>V</kbd> tool, properties panel (double-click a shape, <kbd>Ctrl+Alt+P</kbd>, or right-click → **Properties**; double-clicking text or a sticky note edits it instead): swatches from your quick-color palette plus **+** for the full color picker (an opaque swatch changes the hue and keeps each shape's opacity), thickness and opacity sliders (one drag is one undo step), a fill row for rectangles, ellipses, and polygons whose first swatch is "no fill" and whose others fill with their own color, independent of the border, −/+ steppers, on/off switches, the arrow head's Start/End, drawn arrow styles, a lock toggle, and buttons to send the selection to the back, back one step, forward one step, or to the front, and to duplicate or delete it; a preset row applies a tool preset's style to the selection (keeping the current tool), and **Save** then a slot stores the selection's style as that preset; scroll over a row to step it, and hover the title for the shape's ID and creation time
- Duplicate (<kbd>Ctrl+D</kbd>), delete (<kbd>Delete</kbd>), undo/redo
- Color picker, screen eyedropper with a magnified pixel loupe, palettes, size via hotkeys or scroll
- Text font cycling with <kbd>Shift+T</kbd> over a configurable list (`[drawing] font_cycle`); with text selected it restyles that text
Expand Down Expand Up @@ -188,7 +188,7 @@ The v0.9.23+ prebuilt `wayscriber` packages require glibc 2.39 and GTK 4.12. See
### Callouts and zoom
- **Numbered callouts:** auto-numbered arrow labels and step markers; reset arrow labels with <kbd>Ctrl+Shift+R</kbd>
- **Zoom:** spotlight details with ZoomIt-style controls
- Zoom in/out: <kbd>Ctrl+Alt</kbd> + scroll or <kbd>Ctrl+Alt</kbd> + <kbd>+</kbd>/<kbd>-</kbd>
- Zoom in/out: <kbd>Ctrl</kbd> + scroll (<kbd>Ctrl+Alt</kbd> + scroll also works) or <kbd>Ctrl+Alt</kbd> + <kbd>+</kbd>/<kbd>-</kbd>
- Reset: <kbd>Ctrl+Alt+0</kbd>; lock view: <kbd>Ctrl+Alt+L</kbd>
- Pan: middle drag or arrow keys
- Right-click menu: **Zoom** → Zoom In / Zoom Out / Reset Zoom; while zoomed, right-click still opens the menu, which then starts with Zoom In, Zoom Out, Exit Zoom, and Lock View
Expand Down Expand Up @@ -601,7 +601,9 @@ to leave, color and thickness, quick-access menus, and finding commands. It
ends by offering background mode. Every card action is a button (**Got it**,
**Set up**, **Not now**, **Skip tour**) with its key beside it; clicks on the
card never draw. <kbd>Shift+Escape</kbd> skips the tour. Profiles that already
finished or skipped the tour are not shown it again.
finished or skipped the tour are not shown it again; **Replay Tour** (command
palette, or the help overlay's footer) runs the cards again. It leaves zoom
first, and in presenter mode it waits until you leave it.

Discovery and shortcut-coaching tips have **Got it** and **Tip settings…**
controls. **Got it**
Expand Down Expand Up @@ -1040,7 +1042,7 @@ pick_screen_color = ["I"]
| Toggle light passthrough (in-overlay) | <kbd>F6</kbd> (see [Light passthrough mode](#light-passthrough-mode)) |
| Reset arrow labels | <kbd>Ctrl+Shift+R</kbd> |
| Toggle freeze | <kbd>Ctrl+Shift+F</kbd> |
| Zoom in/out | <kbd>Ctrl+Alt</kbd> + scroll / <kbd>Ctrl+Alt</kbd> + <kbd>+</kbd> / <kbd>Ctrl+Alt</kbd> + <kbd>-</kbd> |
| Zoom in/out | <kbd>Ctrl</kbd> + scroll / <kbd>Ctrl+Alt</kbd> + <kbd>+</kbd> / <kbd>Ctrl+Alt</kbd> + <kbd>-</kbd> |
| Reset zoom | <kbd>Ctrl+Alt+0</kbd> |
| Toggle zoom lock | <kbd>Ctrl+Alt+L</kbd> |
| Pan zoom view | <kbd>Middle drag</kbd> / <kbd>Arrow keys</kbd> |
Expand Down
11 changes: 6 additions & 5 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -416,8 +416,9 @@ reduced_motion = "auto"
# Show the status bar and its configured contents
show_status_bar = true

# Allow clicking status bar segments to open their related controls;
# set false for a display-only status bar whose clicks pass through
# Allow clicking status bar segments to open their related controls (resting
# the pointer on one shows what it does); set false for a display-only status
# bar whose clicks pass through
status_bar_interactive = true

# Status-bar contents. Each item can be hidden independently. Visible items
Expand Down Expand Up @@ -485,7 +486,7 @@ help_overlay_context_filter = true
show_capabilities_warning = true

# Show automatic first-run guidance, discovery tips, and shortcut coaching.
# The guided tour remains available manually when this is false.
# Replay Tour still runs the first-run cards on request when this is false.
show_onboarding_hints = true

# Show rectangle and ellipse preview dimensions in logical board pixels, and
Expand Down Expand Up @@ -750,10 +751,10 @@ top_controls = [

[ui.status_bar_style]
# Font size for status bar text
font_size = 21.0
font_size = 15.0

# Padding around status bar text
padding = 15.0
padding = 11.0

# Background color [R, G, B, A] (0.0-1.0 range)
# Default: semi-transparent black (85% opaque for visibility)
Expand Down
2 changes: 1 addition & 1 deletion configurator/src/app/pages/ui/general.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ pub(super) fn build(sender: &ComponentSender<ConfiguratorApp>) -> BuiltPage {
)
.switch_row(
"Show automatic guidance and tips",
"Controls first-run guidance, discovery tips, and shortcut coaching. The guided tour remains available manually.",
"Controls first-run guidance, discovery tips, and shortcut coaching. Replay Tour still runs the first-run cards on request.",
|app| app.draft.ui_show_onboarding_hints,
|value| Message::ToggleChanged(ToggleField::UiShowOnboardingHints, value),
)
Expand Down
19 changes: 11 additions & 8 deletions docs/CONFIG.md
Original file line number Diff line number Diff line change
Expand Up @@ -931,8 +931,9 @@ reduced_motion = "auto"
# Show the status bar and its configured contents
show_status_bar = true

# Allow clicking status bar segments to open their related controls;
# set false for a display-only status bar whose clicks pass through
# Allow clicking status bar segments to open their related controls (resting
# the pointer on one shows what it does); set false for a display-only status
# bar whose clicks pass through
status_bar_interactive = true

# Status-bar contents. Each item can be hidden independently. Visible items
Expand Down Expand Up @@ -997,7 +998,7 @@ show_capabilities_warning = true

# Show automatic first-run guidance, discovery tips, and shortcut coaching.
# Automatic tips can also be acknowledged individually, and stop after three
# appearances. The guided tour remains available manually when this is false.
# appearances. Replay Tour still runs the first-run cards on request when this is false.
show_onboarding_hints = true

# Show rectangle and ellipse preview dimensions in logical board pixels, and
Expand Down Expand Up @@ -1031,8 +1032,8 @@ radial_menu_mouse_binding = "middle"

# Status bar styling
[ui.status_bar_style]
font_size = 21.0
padding = 15.0
font_size = 15.0
padding = 11.0
bg_color = [0.0, 0.0, 0.0, 0.85] # Semi-transparent black [R, G, B, A]
text_color = [1.0, 1.0, 1.0, 1.0] # White
dot_radius = 6.0
Expand Down Expand Up @@ -1124,7 +1125,7 @@ enabled = true
- Show frozen badge: false
- Position: bottom-left
- Radial menu mouse trigger: middle
- Status bar font: 21px
- Status bar font: 15px
- Help overlay font: 14px (the body size of the help rows; secondary text never drops below 12px)
- Semi-transparent dark status bar; opaque help panel, both with muted borders

Expand Down Expand Up @@ -1487,10 +1488,11 @@ top_controls = [
- **Settings**: Settings is always reachable from the top-strip overflow popover.
- **Delays**: `show_delay_sliders` shows the timed undo/redo-all sliders in the Canvas popover's Step section.
- **Marker opacity**: the marker opacity slider appears when the marker tool is active; `show_marker_opacity_section` keeps it visible even when using other tools.
- **Style pill sliders**: the thickness slider gives half its track to 1–10 px, with faint ticks at 5, 10, and 20 px, and lands on whole pixels. Scroll over any style-pill slider, or over the thickness or text-size number beside it, to step it; click the number to type a value.
- **Polygon tools**: Full mode shows Triangle, Parallelogram, Rhombus, Regular Polygon, and Freeform Polygon under the compact Polygons picker. Simple mode exposes them in the Shapes picker.
- **Context-aware UI**: `context_aware_ui` shows/hides tool-specific controls (colors, thickness, arrow labels, etc.) based on the active tool; disable to always show all controls.
- **Preset toasts**: `show_preset_toasts` enables toast confirmations for preset apply/save/clear.
- **Automatic guidance**: `show_onboarding_hints` controls first-run cards, discovery tips, and shortcut coaching. Discovery and coaching tips offer **Got it** (permanently acknowledge that tip) and **Tip settings…** (acknowledge it, then open the Configurator at this setting); the toolbar-hidden recovery tip keeps **Show** as its primary control and offers the same settings route. Using the board picker, bottom-right zoom controls, or Canvas popover also acknowledges the matching tip. Clicking the message body dismisses a tip only for the current run; an unattended tip stops after three appearances. Set this option to `false` to disable all automatic tutorials on later overlay launches; the running overlay does not live-reload this Configurator change. The guided tour remains available manually, and capability, safety, and configuration warnings are unaffected. Completed profiles migrated from onboarding versions before v6 are not enrolled in the later status-bar, Canvas, and zoom tip series. If onboarding progress cannot be saved, automatic guidance is disabled for that run and an actionable persistence warning is shown.
- **Automatic guidance**: `show_onboarding_hints` controls first-run cards, discovery tips, and shortcut coaching. Discovery and coaching tips offer **Got it** (permanently acknowledge that tip) and **Tip settings…** (acknowledge it, then open the Configurator at this setting); the toolbar-hidden recovery tip keeps **Show** as its primary control and offers the same settings route. Using the board picker, bottom-right zoom controls, or Canvas popover also acknowledges the matching tip. Clicking the message body dismisses a tip only for the current run; an unattended tip stops after three appearances. Set this option to `false` to disable all automatic tutorials on later overlay launches; the running overlay does not live-reload this Configurator change. **Replay Tour** (command palette, or the help overlay's footer) still runs the first-run cards on request, and capability, safety, and configuration warnings are unaffected. Completed profiles migrated from onboarding versions before v6 are not enrolled in the later status-bar, Canvas, and zoom tip series. If onboarding progress cannot be saved, automatic guidance is disabled for that run and an actionable persistence warning is shown.
- **Shape size readout**: `show_shape_size_readout` controls the live rectangle and ellipse preview dimensions, measured in logical board pixels. With Shape Pen it names the shape that release will commit, such as "Triangle 120 × 90" or "Line 140", and stays hidden while the stroke is still ink. Ellipse values match the diameter that will be committed, so an odd drag span rounds down to the nearest even diameter. It defaults to `true` and is separate from `capture.region.show_size_readout`, which describes a region-capture selection.
- **Capability warnings**: `show_capabilities_warning` independently controls compositor limitation warnings; disabling tutorials does not hide safety, configuration, or capability diagnostics.
- **Tool preview**: `show_tool_preview` toggles the cursor bubble.
Expand Down Expand Up @@ -1594,7 +1596,8 @@ default_pen_color = { rgb = [0.969, 0.890, 0.784] }
- <kbd>Ctrl+Shift+Left/Right</kbd>: Previous/next board
- <kbd>Ctrl+Shift+N</kbd>: New board
- <kbd>Ctrl+Shift+Delete</kbd>: Delete board
- <kbd>Ctrl+Shift+B</kbd>: Board picker (inline rename/color)
- <kbd>Ctrl+Shift+B</kbd>: Board picker (inline rename/color); also **Board Picker…** in the
canvas context menu's **Boards** submenu
- Aliases (configurable): <kbd>Ctrl+W</kbd> = whiteboard, <kbd>Ctrl+B</kbd> = blackboard, <kbd>Ctrl+Shift+T</kbd> = transparent

**Board Picker:**
Expand Down
3 changes: 1 addition & 2 deletions docs/codebase-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ Freeze capture waits for the overlay-suppression frame, then selects `wlr-screen
- Classify canvas, layer-shell toolbar, and foreign surfaces once through `SurfaceRouter`; toolbar-local positions are converted to overlay screen coordinates.
- Update the pointer position.
- Call `InputState::on_mouse_press`, `on_mouse_motion`, `on_mouse_release`.
- Adjust pen thickness or font size via scroll wheel + modifiers; scrolling over a Spotlight loupe adjusts its magnification instead.
- Adjust pen thickness or font size via scroll wheel + modifiers, and zoom with Ctrl+wheel; scrolling over a Spotlight loupe adjusts its magnification instead.
- Keep touchpad-finger Spotlight adjustments in one undo gesture until Wayland reports `axis_stop`; wheel-like sources use a quiet-period fallback when no stop arrives.

3. **`InputState` responsibilities**
Expand Down Expand Up @@ -137,7 +137,6 @@ Freeze capture waits for the overlay-suppression frame, then selects `wlr-screen
hover identity, and same-source press/release bookkeeping. `PropertiesPanelState` owns panel
lifecycle, cached geometry, deferred hover recalculation, and refresh scheduling. Font-picker
and command-palette keyboard timing share the behavior-owning `OverlayKeyRepeat` schedule.
`TourState` owns guided-tour lifecycle and bounded step navigation.
- `state/mouse/` and `state/interaction/` convert pointer gestures into drawing/state changes.
- `render.rs` exposes provisional shape previews for live feedback.

Expand Down
6 changes: 3 additions & 3 deletions src/app/usage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,12 @@ fn log_canvas_controls(bindings: &HashMap<Action, Vec<Shortcut>>) {
action_binding_label(bindings, Action::ClearCanvas)
);
log::info!(
" - {}: {} or scroll down",
" - {}: {} or scroll up",
action_display_label(Action::IncreaseThickness),
action_binding_label(bindings, Action::IncreaseThickness)
);
log::info!(
" - {}: {} or scroll up",
" - {}: {} or scroll down",
action_display_label(Action::DecreaseThickness),
action_binding_label(bindings, Action::DecreaseThickness)
);
Expand All @@ -136,7 +136,7 @@ fn log_canvas_controls(bindings: &HashMap<Action, Vec<Shortcut>>) {
action_binding_label(bindings, Action::ToggleFrozenMode)
);
log::info!(
" - {} / {}: {} / {} (Ctrl+Alt + scroll)",
" - {} / {}: {} / {} (Ctrl + scroll)",
action_display_label(Action::ZoomIn),
action_display_label(Action::ZoomOut),
action_binding_label(bindings, Action::ZoomIn),
Expand Down
3 changes: 2 additions & 1 deletion src/backend/wayland/backend/event_loop/capture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ pub(super) fn handle_pending_actions(
state.show_spotlight_magnifier_feedback_if_unavailable();
}
InputEffect::OutputFocus(action) => state.handle_output_focus_action(qh, action),
InputEffect::Zoom(action) => state.handle_zoom_action(action),
InputEffect::Zoom(request) => state.handle_zoom_action(request),
effect @ (InputEffect::ToolbarPersistence(_)
| InputEffect::TextCopy(_)
| InputEffect::TextPaste(_)
Expand Down Expand Up @@ -228,6 +228,7 @@ fn apply_backend_effect(state: &mut WaylandState, action: PendingBackendAction)
PendingBackendAction::ClearSavedToolState => {
state.handle_clear_saved_tool_state_action();
}
PendingBackendAction::ReplayFirstRunTour => state.replay_first_run_tour(),
}
}

Expand Down
14 changes: 12 additions & 2 deletions src/backend/wayland/backend/event_loop/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -228,12 +228,16 @@ fn advance_post_dispatch_state(
if state.input_state.laser_ink_due(Instant::now()) {
state.input_state.needs_redraw = true;
}
if state.input_state.status_tooltip_due(Instant::now()) {
state.input_state.needs_redraw = true;
}
state.input_state.tick_radial_menu_paint(Instant::now());
state.input_state.tick_context_menu_hover(Instant::now());
capture::handle_pending_actions(state, qh);
if break_on_requested_exit(state) {
return true;
}
state.focus.expire_keyboard_reclaim(Instant::now());
state.sync_overlay_interactivity();
state.apply_onboarding_hints();
persist_post_dispatch_state(state);
Expand Down Expand Up @@ -280,10 +284,16 @@ fn event_loop_timeout(
),
state.input_state.ocr_scan_wake_after(now),
),
state.input_state.laser_ink_wake_after(now),
min_timeout(
state.input_state.laser_ink_wake_after(now),
state.input_state.status_hud.tooltip_wake_after(now),
),
);
let autosave_timeout = session_save::autosave_timeout(state, now);
let focus_exit_timeout = state.focus.exit_timeout(now);
let focus_exit_timeout = min_timeout(
state.focus.exit_timeout(now),
state.focus.keyboard_reclaim_timeout(now),
);
let base_timeout = if should_block {
min_timeout(autosave_timeout, focus_exit_timeout)
} else if !vsync_enabled && state.input_state.needs_redraw {
Expand Down
2 changes: 1 addition & 1 deletion src/backend/wayland/backend/event_loop/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ pub(super) fn maybe_render(
);
if chrome_hover_before != chrome_hover_after && state.focus.pointer_focused() {
// Layout can move under a stationary pointer (for example,
// Fit removes the zoom-chip Lock button). The render pass
// Reset removes the zoom-chip Lock button). The render pass
// reclassifies hover; publish the matching Wayland cursor
// now instead of waiting for another motion event. Pointer
// focus is required so a leave-triggered redraw cannot
Expand Down
Loading
Loading