Skip to content
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
5dc24a5
Optimize Direct3D frame buffer handling and copying
richiemcilroy Dec 18, 2025
bc6850f
Adjust queue and frame pool sizes based on frame rate
richiemcilroy Dec 18, 2025
7d9dcae
Refactor camera-mediafoundation: use parking_lot and improve logging
richiemcilroy Dec 18, 2025
c0d7ba1
Add HEVC encoder support to FFmpeg and MediaFoundation
richiemcilroy Dec 18, 2025
6942ae9
Add support for shared D3D11 texture handles
richiemcilroy Dec 18, 2025
4a97110
Add encoder preferences and software fallback for camera muxers
richiemcilroy Dec 18, 2025
5d4bc71
Add Windows version detection and minimum check
richiemcilroy Dec 18, 2025
6f50aed
Add support for BGRA, RGBA, and P010LE formats in D3D11
richiemcilroy Dec 18, 2025
0d71888
Add system diagnostics collection and UI display
richiemcilroy Dec 18, 2025
3fd575e
Add comprehensive Windows hardware compatibility tests
richiemcilroy Dec 18, 2025
e32a49a
Use RtlGetVersion for Windows version detection
richiemcilroy Dec 18, 2025
4973b1b
Add encoder health monitoring and fallback logic
richiemcilroy Dec 18, 2025
1784fb3
Enhance GPU diagnostics and optimize UYVY to YUYV conversion
richiemcilroy Dec 18, 2025
c8bac4f
Improve D3D11 device selection and diagnostics logging
richiemcilroy Dec 18, 2025
bdd59a1
Set fixed window sizes and enforce on Windows
richiemcilroy Dec 18, 2025
b4fcdd5
Add decoder type/status reporting and health monitoring
richiemcilroy Dec 18, 2025
8a33ade
Enable crash recovery recording by default
richiemcilroy Dec 18, 2025
3c8e4a3
clippy
richiemcilroy Dec 18, 2025
4b13bb3
coderabbit
richiemcilroy Dec 18, 2025
5dd6696
coderabbit
richiemcilroy Dec 18, 2025
0599ec3
coderabbit
richiemcilroy Dec 19, 2025
1993e73
clippy
richiemcilroy Dec 19, 2025
344956b
coderabbit
richiemcilroy Dec 19, 2025
ddfe183
clippy
richiemcilroy Dec 19, 2025
1aac5a6
clippy
richiemcilroy Dec 19, 2025
30cf231
clippy
richiemcilroy Dec 19, 2025
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
6 changes: 5 additions & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@
"Bash(cargo tree:*)",
"WebFetch(domain:github.com)",
"WebFetch(domain:docs.rs)",
"WebFetch(domain:gix.github.io)"
"WebFetch(domain:gix.github.io)",
"Bash(cargo clean:*)",
"Bash(cargo test:*)",
"Bash(powershell -Command \"[System.Environment]::OSVersion.Version.ToString()\")",
"Bash(cargo build:*)"
],
"deny": [],
"ask": []
Expand Down
3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions apps/desktop/src-tauri/src/general_settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ pub struct GeneralSettingsStore {
pub instant_mode_max_resolution: u32,
#[serde(default)]
pub default_project_name_template: Option<String>,
#[serde(default)]
#[serde(default = "default_true")]
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
pub crash_recovery_recording: bool,
}

Expand Down Expand Up @@ -192,7 +192,7 @@ impl Default for GeneralSettingsStore {
delete_instant_recordings_after_upload: false,
instant_mode_max_resolution: 1920,
default_project_name_template: None,
crash_recovery_recording: false,
crash_recovery_recording: true,
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions apps/desktop/src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,12 @@ async fn upload_logs(app_handle: AppHandle) -> Result<(), String> {
logging::upload_log_file(&app_handle).await
}

#[tauri::command]
#[specta::specta]
fn get_system_diagnostics() -> cap_recording::diagnostics::SystemDiagnostics {
cap_recording::diagnostics::collect_diagnostics()
}

#[tauri::command]
#[specta::specta]
#[instrument(skip(app_handle, state))]
Expand Down Expand Up @@ -2337,6 +2343,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) {
set_camera_input,
recording_settings::set_recording_mode,
upload_logs,
get_system_diagnostics,
recording::start_recording,
recording::stop_recording,
recording::pause_recording,
Expand Down
123 changes: 93 additions & 30 deletions apps/desktop/src-tauri/src/windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,15 +272,28 @@ impl ShowCapWindow {
let monitor = app.primary_monitor()?.unwrap();

let window = match self {
Self::Setup => self
.window_builder(app, "/setup")
.resizable(false)
.maximized(false)
.center()
.focused(true)
.maximizable(false)
.shadow(true)
.build()?,
Self::Setup => {
let window = self
.window_builder(app, "/setup")
.inner_size(600.0, 600.0)
.min_inner_size(600.0, 600.0)
.resizable(false)
.maximized(false)
.center()
.focused(true)
.maximizable(false)
.shadow(true)
.build()?;

#[cfg(windows)]
{
use tauri::LogicalSize;
let _ = window.set_size(LogicalSize::new(600.0, 600.0));
let _ = window.center();
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

window
}
Self::Main { init_target_mode } => {
if !permissions::do_permissions_check(false).necessary_granted() {
return Box::pin(Self::Setup.show(app)).await;
Expand Down Expand Up @@ -417,7 +430,6 @@ impl ShowCapWindow {
window
}
Self::Settings { page } => {
// Hide main window and target select overlays when settings window opens
for (label, window) in app.webview_windows() {
if let Ok(id) = CapWindowId::from_str(&label)
&& matches!(
Expand All @@ -431,14 +443,26 @@ impl ShowCapWindow {
}
}

self.window_builder(
app,
format!("/settings/{}", page.clone().unwrap_or_default()),
)
.resizable(true)
.maximized(false)
.center()
.build()?
let window = self
.window_builder(
app,
format!("/settings/{}", page.clone().unwrap_or_default()),
)
.inner_size(600.0, 465.0)
.min_inner_size(600.0, 465.0)
.resizable(true)
.maximized(false)
.center()
.build()?;

#[cfg(windows)]
{
use tauri::LogicalSize;
let _ = window.set_size(LogicalSize::new(600.0, 465.0));
let _ = window.center();
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

window
}
Self::Editor { .. } => {
if let Some(main) = CapWindowId::Main.get(app) {
Expand All @@ -448,11 +472,22 @@ impl ShowCapWindow {
let _ = camera.close();
};

self.window_builder(app, "/editor")
let window = self
.window_builder(app, "/editor")
.maximizable(true)
.inner_size(1240.0, 800.0)
.inner_size(1275.0, 800.0)
.min_inner_size(1275.0, 800.0)
.center()
.build()?
.build()?;

#[cfg(windows)]
{
use tauri::LogicalSize;
let _ = window.set_size(LogicalSize::new(1275.0, 800.0));
let _ = window.center();
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

window
}
Self::ScreenshotEditor { path: _ } => {
if let Some(main) = CapWindowId::Main.get(app) {
Expand All @@ -462,35 +497,55 @@ impl ShowCapWindow {
let _ = camera.close();
};

self.window_builder(app, "/screenshot-editor")
let window = self
.window_builder(app, "/screenshot-editor")
.maximizable(true)
.inner_size(1240.0, 800.0)
.min_inner_size(800.0, 600.0)
.center()
.build()?
.build()?;

#[cfg(windows)]
{
use tauri::LogicalSize;
let _ = window.set_size(LogicalSize::new(1240.0, 800.0));
let _ = window.center();
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

window
}
Self::Upgrade => {
// Hide main window when upgrade window opens
if let Some(main) = CapWindowId::Main.get(app) {
let _ = main.hide();
}

let mut builder = self
let window = self
.window_builder(app, "/upgrade")
.inner_size(950.0, 850.0)
.min_inner_size(950.0, 850.0)
.resizable(false)
.focused(true)
.always_on_top(true)
.maximized(false)
.shadow(true)
.center();
.center()
.build()?;

#[cfg(windows)]
{
use tauri::LogicalSize;
let _ = window.set_size(LogicalSize::new(950.0, 850.0));
let _ = window.center();
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

builder.build()?
window
}
Self::ModeSelect => {
if let Some(main) = CapWindowId::Main.get(app) {
let _ = main.hide();
}

let mut builder = self
let window = self
.window_builder(app, "/mode-select")
.inner_size(580.0, 340.0)
.min_inner_size(580.0, 340.0)
Expand All @@ -499,9 +554,17 @@ impl ShowCapWindow {
.maximizable(false)
.center()
.focused(true)
.shadow(true);
.shadow(true)
.build()?;

builder.build()?
#[cfg(windows)]
{
use tauri::LogicalSize;
let _ = window.set_size(LogicalSize::new(580.0, 340.0));
let _ = window.center();
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

window
}
Self::Camera => {
const WINDOW_SIZE: f64 = 230.0 * 2.0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ function Inner(props: { initialStore: GeneralSettingsStore | null }) {
enableNewRecordingFlow: true,
autoZoomOnClicks: false,
custom_cursor_capture2: true,
crashRecoveryRecording: false,
crashRecoveryRecording: true,
},
);

Expand Down
Loading
Loading