Skip to content

Commit ea87e7b

Browse files
committed
Adds post-settings-close behavior setting
Allows users to configure Cap's behavior after closing the settings window. The default behavior is to reopen the main recording window, but users can now choose to do nothing. This setting is added to the general settings store and exposed in the settings UI.
1 parent a292974 commit ea87e7b

4 files changed

Lines changed: 45 additions & 4 deletions

File tree

apps/desktop/src-tauri/src/general_settings.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ pub enum PostDeletionBehaviour {
3131
ReopenRecordingWindow,
3232
}
3333

34+
#[derive(Default, Serialize, Deserialize, Type, Debug, Clone, Copy)]
35+
#[serde(rename_all = "camelCase")]
36+
pub enum PostSettingsCloseBehaviour {
37+
DoNothing,
38+
#[default]
39+
OpenRecordingWindow,
40+
}
41+
3442
impl MainWindowRecordingStartBehaviour {
3543
pub fn perform(&self, window: &tauri::WebviewWindow) -> tauri::Result<()> {
3644
match self {
@@ -116,6 +124,8 @@ pub struct GeneralSettingsStore {
116124
pub recording_picker_preference_set: bool,
117125
#[serde(default)]
118126
pub post_deletion_behaviour: PostDeletionBehaviour,
127+
#[serde(default)]
128+
pub post_settings_close_behaviour: PostSettingsCloseBehaviour,
119129
#[serde(default = "default_excluded_windows")]
120130
pub excluded_windows: Vec<WindowExclusion>,
121131
#[serde(default)]
@@ -184,6 +194,7 @@ impl Default for GeneralSettingsStore {
184194
enable_new_recording_flow: default_enable_new_recording_flow(),
185195
recording_picker_preference_set: false,
186196
post_deletion_behaviour: PostDeletionBehaviour::DoNothing,
197+
post_settings_close_behaviour: PostSettingsCloseBehaviour::OpenRecordingWindow,
187198
excluded_windows: default_excluded_windows(),
188199
delete_instant_recordings_after_upload: false,
189200
instant_mode_max_resolution: 1920,

apps/desktop/src-tauri/src/lib.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ use clipboard_rs::{Clipboard, ClipboardContext};
5353
use cpal::StreamError;
5454
use editor_window::{EditorInstances, WindowEditorInstance};
5555
use ffmpeg::ffi::AV_TIME_BASE;
56-
use general_settings::GeneralSettingsStore;
56+
use general_settings::{GeneralSettingsStore, PostSettingsCloseBehaviour};
5757
use kameo::{Actor, actor::ActorRef};
5858
use notifications::NotificationType;
5959
use recording::{InProgressRecording, RecordingEvent, RecordingInputKind};
@@ -2683,6 +2683,16 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) {
26832683
}
26842684
}
26852685
CapWindowId::Settings => {
2686+
let settings = GeneralSettingsStore::get(&app)
2687+
.ok()
2688+
.flatten()
2689+
.unwrap_or_default();
2690+
2691+
let should_open_main = matches!(
2692+
settings.post_settings_close_behaviour,
2693+
PostSettingsCloseBehaviour::OpenRecordingWindow
2694+
);
2695+
26862696
for (label, window) in app.webview_windows() {
26872697
if let Ok(id) = CapWindowId::from_str(&label)
26882698
&& matches!(
@@ -2692,12 +2702,14 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) {
26922702
| CapWindowId::Camera
26932703
)
26942704
{
2695-
let _ = window.show();
2705+
if should_open_main {
2706+
let _ = window.show();
2707+
}
26962708
}
26972709
}
26982710

26992711
#[cfg(target_os = "windows")]
2700-
if !has_open_editor_window(&app) {
2712+
if should_open_main && !has_open_editor_window(&app) {
27012713
reopen_main_window(&app);
27022714
}
27032715

apps/desktop/src/routes/(window-chrome)/settings/general.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
type GeneralSettingsStore,
3535
type MainWindowRecordingStartBehaviour,
3636
type PostDeletionBehaviour,
37+
type PostSettingsCloseBehaviour,
3738
type PostStudioRecordingBehaviour,
3839
type WindowExclusion,
3940
} from "~/utils/tauri";
@@ -359,6 +360,7 @@ function Inner(props: { initialStore: GeneralSettingsStore | null }) {
359360
| MainWindowRecordingStartBehaviour
360361
| PostStudioRecordingBehaviour
361362
| PostDeletionBehaviour
363+
| PostSettingsCloseBehaviour
362364
| number,
363365
>(props: {
364366
label: string;
@@ -558,6 +560,21 @@ function Inner(props: { initialStore: GeneralSettingsStore | null }) {
558560
},
559561
]}
560562
/>
563+
<SelectSettingItem
564+
label="After Closing Settings Window"
565+
description="What should Cap do when you close the settings window?"
566+
value={settings.postSettingsCloseBehaviour ?? "openRecordingWindow"}
567+
onChange={(value) =>
568+
handleChange("postSettingsCloseBehaviour", value)
569+
}
570+
options={[
571+
{ text: "Do Nothing", value: "doNothing" },
572+
{
573+
text: "Open Recording Window",
574+
value: "openRecordingWindow",
575+
},
576+
]}
577+
/>
561578
<ToggleSettingItem
562579
label="Delete instant mode recordings after upload"
563580
description="After finishing an instant recording, should Cap will delete it from your device?"

apps/desktop/src/utils/tauri.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ export type ExportSettings = ({ format: "Mp4" } & Mp4ExportSettings) | ({ format
404404
export type FileType = "recording" | "screenshot"
405405
export type Flags = { captions: boolean }
406406
export type FramesRendered = { renderedCount: number; totalFrames: number; type: "FramesRendered" }
407-
export type GeneralSettingsStore = { instanceId?: string; uploadIndividualFiles?: boolean; hideDockIcon?: boolean; autoCreateShareableLink?: boolean; enableNotifications?: boolean; disableAutoOpenLinks?: boolean; hasCompletedStartup?: boolean; theme?: AppTheme; commercialLicense?: CommercialLicense | null; lastVersion?: string | null; windowTransparency?: boolean; postStudioRecordingBehaviour?: PostStudioRecordingBehaviour; mainWindowRecordingStartBehaviour?: MainWindowRecordingStartBehaviour; custom_cursor_capture2?: boolean; serverUrl?: string; recordingCountdown?: number | null; enableNativeCameraPreview: boolean; autoZoomOnClicks?: boolean; enableNewRecordingFlow: boolean; recordingPickerPreferenceSet?: boolean; postDeletionBehaviour?: PostDeletionBehaviour; excludedWindows?: WindowExclusion[]; deleteInstantRecordingsAfterUpload?: boolean; instantModeMaxResolution?: number }
407+
export type GeneralSettingsStore = { instanceId?: string; uploadIndividualFiles?: boolean; hideDockIcon?: boolean; autoCreateShareableLink?: boolean; enableNotifications?: boolean; disableAutoOpenLinks?: boolean; hasCompletedStartup?: boolean; theme?: AppTheme; commercialLicense?: CommercialLicense | null; lastVersion?: string | null; windowTransparency?: boolean; postStudioRecordingBehaviour?: PostStudioRecordingBehaviour; mainWindowRecordingStartBehaviour?: MainWindowRecordingStartBehaviour; custom_cursor_capture2?: boolean; serverUrl?: string; recordingCountdown?: number | null; enableNativeCameraPreview: boolean; autoZoomOnClicks?: boolean; enableNewRecordingFlow: boolean; recordingPickerPreferenceSet?: boolean; postDeletionBehaviour?: PostDeletionBehaviour; postSettingsCloseBehaviour?: PostSettingsCloseBehaviour; excludedWindows?: WindowExclusion[]; deleteInstantRecordingsAfterUpload?: boolean; instantModeMaxResolution?: number }
408408
export type GifExportSettings = { fps: number; resolution_base: XY<number>; quality: GifQuality | null }
409409
export type GifQuality = {
410410
/**
@@ -443,6 +443,7 @@ export type PhysicalSize = { width: number; height: number }
443443
export type Plan = { upgraded: boolean; manual: boolean; last_checked: number }
444444
export type Platform = "MacOS" | "Windows"
445445
export type PostDeletionBehaviour = "doNothing" | "reopenRecordingWindow"
446+
export type PostSettingsCloseBehaviour = "doNothing" | "openRecordingWindow"
446447
export type PostStudioRecordingBehaviour = "openEditor" | "showOverlay"
447448
export type Preset = { name: string; config: ProjectConfiguration }
448449
export type PresetsStore = { presets: Preset[]; default: number | null }

0 commit comments

Comments
 (0)