Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
310c342
refactor(config): isolate transparent board normalization
devmobasa Aug 26, 2026
2dee021
refactor(config): isolate highlight color validation
devmobasa Aug 26, 2026
d1b3bb3
refactor(config): split drawing validation stages
devmobasa Aug 26, 2026
d2b180f
refactor(config): split render profile normalization
devmobasa Aug 26, 2026
286b205
refactor(app): split session command handlers
devmobasa Aug 26, 2026
bf3b211
refactor(app): split overlay control logging
devmobasa Aug 26, 2026
07c623c
refactor(input): split selection action dispatch
devmobasa Aug 26, 2026
01e5200
refactor(input): isolate preset shape settings
devmobasa Aug 26, 2026
2a7b54c
refactor(input): separate presenter mode transitions
devmobasa Aug 26, 2026
97d7344
refactor(input): isolate page-panel navigation
devmobasa Aug 26, 2026
e32417c
refactor(input): centralize context submenu anchors
devmobasa Aug 26, 2026
e549786
refactor(session): isolate snapshot size rejection
devmobasa Aug 26, 2026
93be74f
refactor(session): isolate post-save artifact cleanup
devmobasa Aug 26, 2026
a24bee4
refactor(daemon): split startup service setup
devmobasa Aug 26, 2026
b554603
refactor(daemon): centralize worker thread joins
devmobasa Aug 26, 2026
297bc31
refactor(daemon): isolate portal version reporting
devmobasa Aug 26, 2026
dd1c550
refactor(onboarding): isolate progress side effects
devmobasa Aug 26, 2026
3c6439e
refactor(wayland): isolate help overlay wheel handling
devmobasa Aug 26, 2026
a9660f0
refactor(wayland): match seat capabilities once
devmobasa Aug 26, 2026
3b4bff8
refactor(toolbar): split settings menu sections
devmobasa Aug 26, 2026
4237dcb
refactor(wayland): isolate skipped render handling
devmobasa Aug 26, 2026
cbcbd06
refactor(wayland): split global protocol binding
devmobasa Aug 26, 2026
ac87544
refactor(wayland): split modal pointer motion
devmobasa Aug 26, 2026
c569315
refactor(capture): split completion routing
devmobasa Aug 26, 2026
7ad1c90
refactor(wayland): split modal keyboard routing
devmobasa Aug 26, 2026
f77594c
refactor(wayland): split pointer press routing
devmobasa Aug 26, 2026
9ac6276
refactor(wayland): split pointer release routing
devmobasa Aug 26, 2026
4f35074
refactor(runtime-ui): split live toolbar state updates
devmobasa Aug 26, 2026
8184ff4
refactor(input): split UI action handlers
devmobasa Aug 26, 2026
bc37eeb
refactor(toolbar): split backend event routing
devmobasa Aug 26, 2026
5a02bd9
refactor(render): split UI layer passes
devmobasa Aug 26, 2026
ae7d224
refactor(tablet): split stylus event routing
devmobasa Aug 26, 2026
7919788
refactor(wayland): split event loop maintenance
devmobasa Aug 26, 2026
dedcad1
refactor(render): isolate committed shape culling
devmobasa Aug 26, 2026
9fc25d4
refactor(toolbar): split top popover builders
devmobasa Aug 26, 2026
ecfee87
refactor(board-picker): split row rendering passes
devmobasa Aug 26, 2026
cd21836
refactor(render): isolate frame timing and damage collection
devmobasa Aug 26, 2026
f826050
refactor(test): split board pin recovery setup
devmobasa Aug 26, 2026
f2fe1c3
refactor(test): split config clamp assertions
devmobasa Aug 26, 2026
47777f5
refactor(test): split session artifact move checks
devmobasa Aug 26, 2026
e77cb14
refactor(test): split compressed session checks
devmobasa Aug 26, 2026
9683017
refactor(test): split canvas popover checks
devmobasa Aug 26, 2026
5e8ee22
refactor(test): split overflow menu structure checks
devmobasa Aug 26, 2026
26689e8
refactor(test): split style pill tool checks
devmobasa Aug 26, 2026
9f76a85
refactor(test): split session popover checks
devmobasa Aug 26, 2026
526d56d
refactor(test): table-drive preset capture checks
devmobasa Aug 26, 2026
393f283
refactor(test): table-drive preset restore checks
devmobasa Aug 26, 2026
22e4373
refactor(test): split GTK capture suppression phases
devmobasa Aug 26, 2026
1f71af2
refactor(test): split GTK style role checks
devmobasa Aug 26, 2026
5c9d7c8
refactor(test): split builtin toolbar node checks
devmobasa Aug 26, 2026
f4febcd
refactor(test): split builtin style pill parity checks
devmobasa Aug 26, 2026
d48b0ba
refactor(test): split GTK contract scenarios
devmobasa Aug 26, 2026
7e4b0aa
chore: enforce cognitive complexity budget
devmobasa Aug 26, 2026
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
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ default-run = "wayscriber"
members = ["configurator"]
default-members = ["."]

[workspace.lints]
[workspace.lints.clippy]
cognitive_complexity = "warn"

[lints]
workspace = true
Expand Down
3 changes: 3 additions & 0 deletions clippy.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Keep functions within the agreed cognitive-complexity budget. Clippy emits a
# warning above this value, and CI promotes warnings to errors.
cognitive-complexity-threshold = 20
87 changes: 47 additions & 40 deletions src/app/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,7 @@ use crate::cli::Cli;
use crate::env_vars::WAYLAND_DISPLAY_ENV;

pub(crate) fn run_session_cli_commands(cli: &Cli) -> anyhow::Result<()> {
if let Some(display_name) = cli.rename_session.as_deref() {
let raw_path = cli
.session_file
.as_ref()
.ok_or_else(|| anyhow::anyhow!("--rename-session requires --session-file"))?;
let raw = raw_path
.to_str()
.ok_or_else(|| anyhow::anyhow!("--session-file path must be valid UTF-8"))?;
let path = crate::session::normalize_named_session_file_arg(raw);
match crate::session::catalog::rename_session_display_name_by_path(&path, display_name)? {
Some(entry) => {
println!("Renamed session to {}.", entry.display_name);
}
None => {
anyhow::bail!("session is not in the named-session catalog");
}
}
if rename_session(cli)? {
return Ok(());
}

Expand Down Expand Up @@ -62,29 +46,7 @@ pub(crate) fn run_session_cli_commands(cli: &Cli) -> anyhow::Result<()> {
};

if cli.clear_session {
let outcome = crate::session::clear_session(&options)?;
println!("Session file: {}", options.session_file_path().display());
if outcome.removed_session {
println!(" Removed session file");
} else {
println!(" No session file present");
}
if outcome.removed_backup {
println!(" Removed backup file");
}
if outcome.removed_recovery {
println!(" Removed recovery file");
}
if outcome.removed_lock {
println!(" Removed lock file");
}
if !outcome.removed_session
&& !outcome.removed_backup
&& !outcome.removed_recovery
&& !outcome.removed_lock
{
println!(" No session artefacts found");
}
clear_session(&options)?;
return Ok(());
}

Expand Down Expand Up @@ -189,3 +151,48 @@ pub(crate) fn run_session_cli_commands(cli: &Cli) -> anyhow::Result<()> {

Ok(())
}

fn rename_session(cli: &Cli) -> anyhow::Result<bool> {
let Some(display_name) = cli.rename_session.as_deref() else {
return Ok(false);
};
let raw_path = cli
.session_file
.as_ref()
.ok_or_else(|| anyhow::anyhow!("--rename-session requires --session-file"))?;
let raw = raw_path
.to_str()
.ok_or_else(|| anyhow::anyhow!("--session-file path must be valid UTF-8"))?;
let path = crate::session::normalize_named_session_file_arg(raw);
let entry = crate::session::catalog::rename_session_display_name_by_path(&path, display_name)?
.ok_or_else(|| anyhow::anyhow!("session is not in the named-session catalog"))?;
println!("Renamed session to {}.", entry.display_name);
Ok(true)
}

fn clear_session(options: &crate::session::SessionOptions) -> anyhow::Result<()> {
let outcome = crate::session::clear_session(options)?;
println!("Session file: {}", options.session_file_path().display());
if outcome.removed_session {
println!(" Removed session file");
} else {
println!(" No session file present");
}
if outcome.removed_backup {
println!(" Removed backup file");
}
if outcome.removed_recovery {
println!(" Removed recovery file");
}
if outcome.removed_lock {
println!(" Removed lock file");
}
if !outcome.removed_session
&& !outcome.removed_backup
&& !outcome.removed_recovery
&& !outcome.removed_lock
{
println!(" No session artefacts found");
}
Ok(())
}
58 changes: 35 additions & 23 deletions src/app/usage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,16 @@ pub(crate) fn log_overlay_controls(freeze: bool) {
log::info!("Starting annotation overlay...");
log::info!("Controls:");
let bindings = default_action_bindings();
log_drawing_controls(&bindings);
log_canvas_controls(&bindings);
log_ui_controls(&bindings);
if freeze {
log::info!("Starting frozen mode (freeze-on-start requested)");
}
log::info!("");
}

fn log_drawing_controls(bindings: &HashMap<Action, Vec<Shortcut>>) {
log::info!(
" - {}: Just drag",
action_display_label(Action::SelectPenTool)
Expand All @@ -85,77 +95,79 @@ pub(crate) fn log_overlay_controls(freeze: bool) {
log::info!(
" - {}: {}, click to position, type, press Enter",
action_display_label(Action::EnterTextMode),
action_binding_label(&bindings, Action::EnterTextMode)
action_binding_label(bindings, Action::EnterTextMode)
);
log::info!(" - Colors: {}", color_binding_labels(&bindings));
log::info!(" - Colors: {}", color_binding_labels(bindings));
}

fn log_canvas_controls(bindings: &HashMap<Action, Vec<Shortcut>>) {
log::info!(
" - {} / {}: {} / {}",
action_display_label(Action::Undo),
action_display_label(Action::Redo),
action_binding_label(&bindings, Action::Undo),
action_binding_label(&bindings, Action::Redo)
action_binding_label(bindings, Action::Undo),
action_binding_label(bindings, Action::Redo)
);
log::info!(
" - {}: {}",
action_display_label(Action::ClearCanvas),
action_binding_label(&bindings, Action::ClearCanvas)
action_binding_label(bindings, Action::ClearCanvas)
);
log::info!(
" - {}: {} or scroll down",
action_display_label(Action::IncreaseThickness),
action_binding_label(&bindings, Action::IncreaseThickness)
action_binding_label(bindings, Action::IncreaseThickness)
);
log::info!(
" - {}: {} or scroll up",
action_display_label(Action::DecreaseThickness),
action_binding_label(&bindings, Action::DecreaseThickness)
action_binding_label(bindings, Action::DecreaseThickness)
);
log::info!(
" - {}: {} (toggle frozen background)",
action_display_label(Action::ToggleFrozenMode),
action_binding_label(&bindings, Action::ToggleFrozenMode)
action_binding_label(bindings, Action::ToggleFrozenMode)
);
log::info!(
" - {} / {}: {} / {} (Ctrl+Alt + scroll)",
action_display_label(Action::ZoomIn),
action_display_label(Action::ZoomOut),
action_binding_label(&bindings, Action::ZoomIn),
action_binding_label(&bindings, Action::ZoomOut)
action_binding_label(bindings, Action::ZoomIn),
action_binding_label(bindings, Action::ZoomOut)
);
log::info!(
" - {}: {} • {}: {} • Pan view: middle drag/arrow keys",
action_display_label(Action::ResetZoom),
action_binding_label(&bindings, Action::ResetZoom),
action_binding_label(bindings, Action::ResetZoom),
action_display_label(Action::ToggleZoomLock),
action_binding_label(&bindings, Action::ToggleZoomLock)
action_binding_label(bindings, Action::ToggleZoomLock)
);
}

fn log_ui_controls(bindings: &HashMap<Action, Vec<Shortcut>>) {
log::info!(
" - {}: Right Click or {}",
action_display_label(Action::OpenContextMenu),
action_binding_label(&bindings, Action::OpenContextMenu)
action_binding_label(bindings, Action::OpenContextMenu)
);
log::info!(
" - {}: {} • {}: {} • {}: {} • {}: {} • {}: {}",
action_display_label(Action::ToggleHelp),
action_binding_label(&bindings, Action::ToggleHelp),
action_binding_label(bindings, Action::ToggleHelp),
action_display_label(Action::ToggleToolbar),
action_binding_label(&bindings, Action::ToggleToolbar),
action_binding_label(bindings, Action::ToggleToolbar),
action_display_label(Action::TogglePresenterMode),
action_binding_label(&bindings, Action::TogglePresenterMode),
action_binding_label(bindings, Action::TogglePresenterMode),
action_display_label(Action::OpenConfigurator),
action_binding_label(&bindings, Action::OpenConfigurator),
action_binding_label(bindings, Action::OpenConfigurator),
action_display_label(Action::ToggleStatusBar),
action_binding_label(&bindings, Action::ToggleStatusBar)
action_binding_label(bindings, Action::ToggleStatusBar)
);
log::info!(
" - {}: {}",
action_display_label(Action::Exit),
action_binding_label(&bindings, Action::Exit)
action_binding_label(bindings, Action::Exit)
);
if freeze {
log::info!("Starting frozen mode (freeze-on-start requested)");
}
log::info!("");
}

pub(crate) fn print_usage() {
Expand Down
Loading
Loading