config

package
v0.14.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 17, 2025 License: MIT Imports: 12 Imported by: 0

Documentation

Overview

Package config provides configuration management for dumber with Viper integration.

Package config provides default configuration values for dumber.

Package config provides validation utilities for configuration values.

Package config provides XDG Base Directory specification compliance utilities.

Index

Constants

View Source
const (
	ThemeDefault = "default"
)

Color scheme constants

Variables

This section is empty.

Functions

func EnsureDirectories

func EnsureDirectories() error

EnsureDirectories creates the XDG directories if they don't exist.

func GenerateSchemaFile added in v0.13.0

func GenerateSchemaFile() error

GenerateSchemaFile generates a JSON schema file for the configuration. This is called automatically when a default config is created.

func GetConfigDir

func GetConfigDir() (string, error)

GetConfigDir returns the XDG config directory for dumber.

func GetConfigFile

func GetConfigFile() (string, error)

GetConfigFile returns the path to the main configuration file.

func GetDataDir

func GetDataDir() (string, error)

GetDataDir returns the XDG data directory for dumber.

func GetDatabaseFile

func GetDatabaseFile() (string, error)

GetDatabaseFile returns the path to the database file in the data directory. The database contains important user data (history, cookies, preferences) and therefore belongs in XDG_DATA_HOME, not XDG_STATE_HOME.

func GetDefaultSearchShortcuts

func GetDefaultSearchShortcuts() map[string]SearchShortcut

GetDefaultSearchShortcuts returns the default search shortcuts.

func GetFilterCacheDir added in v0.7.0

func GetFilterCacheDir() (string, error)

GetFilterCacheDir returns the XDG-compliant filter cache directory for dumber. Filter cache is stored in XDG_STATE_HOME as it's transient data that can be regenerated.

func GetFilterCacheFile added in v0.7.0

func GetFilterCacheFile() (string, error)

GetFilterCacheFile returns the path to the main filter cache file.

func GetLogDir added in v0.5.0

func GetLogDir() (string, error)

GetLogDir returns the XDG-compliant log directory for dumber. Logs are stored in XDG_STATE_HOME as per specification.

func GetStateDir

func GetStateDir() (string, error)

GetStateDir returns the XDG state directory for dumber.

func Init

func Init() error

Init initializes the global configuration manager.

func OnConfigChange

func OnConfigChange(callback func(*Config))

OnConfigChange registers a callback for global configuration changes.

func Watch

func Watch() error

Watch starts watching the global configuration for changes.

Types

type AppearanceConfig

type AppearanceConfig struct {
	// Default fonts for pages that do not specify fonts.
	SansFont      string `mapstructure:"sans_font" yaml:"sans_font"`
	SerifFont     string `mapstructure:"serif_font" yaml:"serif_font"`
	MonospaceFont string `mapstructure:"monospace_font" yaml:"monospace_font"`
	// Default font size in CSS pixels (approx).
	DefaultFontSize int          `mapstructure:"default_font_size" yaml:"default_font_size"`
	LightPalette    ColorPalette `mapstructure:"light_palette" yaml:"light_palette"`
	DarkPalette     ColorPalette `mapstructure:"dark_palette" yaml:"dark_palette"`
	// ColorScheme controls the initial theme preference: "prefer-dark", "prefer-light", or "default" (follows system)
	ColorScheme string `mapstructure:"color_scheme" yaml:"color_scheme"`
}

AppearanceConfig holds UI/rendering preferences.

type CodecConfig added in v0.6.0

type CodecConfig struct {
	// Codec preference order (e.g., "av1,h264,vp8")
	PreferredCodecs string `mapstructure:"preferred_codecs" yaml:"preferred_codecs"`

	// Force specific codec for platforms
	ForceAV1 bool `mapstructure:"force_av1" yaml:"force_av1"`

	// Block problematic codecs
	BlockVP9 bool `mapstructure:"block_vp9" yaml:"block_vp9"`
	BlockVP8 bool `mapstructure:"block_vp8" yaml:"block_vp8"`

	// Hardware acceleration per codec
	AV1HardwareOnly    bool `mapstructure:"av1_hardware_only" yaml:"av1_hardware_only"`
	DisableVP9Hardware bool `mapstructure:"disable_vp9_hardware" yaml:"disable_vp9_hardware"`

	// Buffer configuration for smooth playback
	VideoBufferSizeMB  int `mapstructure:"video_buffer_size_mb" yaml:"video_buffer_size_mb"`
	QueueBufferTimeSec int `mapstructure:"queue_buffer_time_sec" yaml:"queue_buffer_time_sec"`

	// Custom User-Agent for codec negotiation
	CustomUserAgent string `mapstructure:"custom_user_agent" yaml:"custom_user_agent"`

	// Maximum resolution for AV1 codec (720p, 1080p, 1440p, 4k, unlimited)
	AV1MaxResolution string `mapstructure:"av1_max_resolution" yaml:"av1_max_resolution"`

	// Site-specific codec control settings
	DisableTwitchCodecControl bool `mapstructure:"disable_twitch_codec_control" yaml:"disable_twitch_codec_control"`
}

CodecConfig holds video codec preferences and handling

type ColorPalette added in v0.11.0

type ColorPalette struct {
	Background     string `mapstructure:"background" yaml:"background" json:"background"`
	Surface        string `mapstructure:"surface" yaml:"surface" json:"surface"`
	SurfaceVariant string `mapstructure:"surface_variant" yaml:"surface_variant" json:"surface_variant"`
	Text           string `mapstructure:"text" yaml:"text" json:"text"`
	Muted          string `mapstructure:"muted" yaml:"muted" json:"muted"`
	Accent         string `mapstructure:"accent" yaml:"accent" json:"accent"`
	Border         string `mapstructure:"border" yaml:"border" json:"border"`
}

ColorPalette contains semantic color tokens for light/dark themes.

type Config

type Config struct {
	Database        DatabaseConfig            `mapstructure:"database" yaml:"database"`
	History         HistoryConfig             `mapstructure:"history" yaml:"history"`
	SearchShortcuts map[string]SearchShortcut `mapstructure:"search_shortcuts" yaml:"search_shortcuts"`
	// DefaultSearchEngine is the URL template for the default search engine (must contain %s placeholder)
	DefaultSearchEngine string                  `mapstructure:"default_search_engine" yaml:"default_search_engine"`
	Dmenu               DmenuConfig             `mapstructure:"dmenu" yaml:"dmenu"`
	Logging             LoggingConfig           `mapstructure:"logging" yaml:"logging"`
	Appearance          AppearanceConfig        `mapstructure:"appearance" yaml:"appearance"`
	VideoAcceleration   VideoAccelerationConfig `mapstructure:"video_acceleration" yaml:"video_acceleration"`
	CodecPreferences    CodecConfig             `mapstructure:"codec_preferences" yaml:"codec_preferences"`
	Debug               DebugConfig             `mapstructure:"debug" yaml:"debug"`
	// RenderingMode controls GPU/CPU rendering selection for WebKit
	RenderingMode RenderingMode `mapstructure:"rendering_mode" yaml:"rendering_mode"`
	// UseDomZoom toggles DOM-based zoom instead of native WebKit zoom.
	UseDomZoom bool `mapstructure:"use_dom_zoom" yaml:"use_dom_zoom"`
	// DefaultZoom sets the default zoom level for pages without saved zoom settings (1.0 = 100%, 1.2 = 120%)
	DefaultZoom float64 `mapstructure:"default_zoom" yaml:"default_zoom"`
	// Workspace defines workspace, pane, and tab handling behaviour.
	Workspace WorkspaceConfig `mapstructure:"workspace" yaml:"workspace"`
	// ContentFilteringWhitelist domains skip ad blocking (e.g. Twitch breaks with bot detection)
	ContentFilteringWhitelist []string `mapstructure:"content_filtering_whitelist" yaml:"content_filtering_whitelist"`
}

Config represents the complete configuration for dumber.

func DefaultConfig

func DefaultConfig() *Config

DefaultConfig returns the default configuration values for dumber.

func Get

func Get() *Config

Get returns the global configuration.

func New added in v0.7.0

func New() *Config

New returns a new default configuration instance. This is a convenience function for getting default config without the full manager.

type DatabaseConfig

type DatabaseConfig struct {
	Path string `mapstructure:"path" yaml:"path"`
}

DatabaseConfig holds database-related configuration.

type DebugConfig added in v0.7.0

type DebugConfig struct {
	// Enable WebKit internal debug logging
	EnableWebKitDebug bool `mapstructure:"enable_webkit_debug" yaml:"enable_webkit_debug"`

	// WebKit debug categories (comma-separated)
	// Common values: "Network:preconnectTo", "ContentFilters", "Loading", "JavaScript"
	WebKitDebugCategories string `mapstructure:"webkit_debug_categories" yaml:"webkit_debug_categories"`

	// Enable content filtering debug logs
	EnableFilteringDebug bool `mapstructure:"enable_filtering_debug" yaml:"enable_filtering_debug"`

	// Enable detailed WebView state logging
	EnableWebViewDebug bool `mapstructure:"enable_webview_debug" yaml:"enable_webview_debug"`

	// Log WebKit crashes and errors to file
	LogWebKitCrashes bool `mapstructure:"log_webkit_crashes" yaml:"log_webkit_crashes"`

	// Enable script injection debug logs
	EnableScriptDebug bool `mapstructure:"enable_script_debug" yaml:"enable_script_debug"`

	// Enable general debug mode (equivalent to DUMBER_DEBUG env var)
	EnableGeneralDebug bool `mapstructure:"enable_general_debug" yaml:"enable_general_debug"`

	// Enable workspace navigation and focus debug logs
	EnableWorkspaceDebug bool `mapstructure:"enable_workspace_debug" yaml:"enable_workspace_debug"`

	// Enable focus state machine debug logs
	EnableFocusDebug bool `mapstructure:"enable_focus_debug" yaml:"enable_focus_debug"`

	// Enable CSS reconciler debug logs
	EnableCSSDebug bool `mapstructure:"enable_css_debug" yaml:"enable_css_debug"`

	// Enable focus metrics tracking
	EnableFocusMetrics bool `mapstructure:"enable_focus_metrics" yaml:"enable_focus_metrics"`

	// Enable detailed pane close instrumentation and tree snapshots
	EnablePaneCloseDebug bool `mapstructure:"enable_pane_close_debug" yaml:"enable_pane_close_debug"`
}

DebugConfig holds debug and troubleshooting options

type DmenuConfig

type DmenuConfig struct {
	MaxHistoryItems  int    `mapstructure:"max_history_items" yaml:"max_history_items"`
	ShowVisitCount   bool   `mapstructure:"show_visit_count" yaml:"show_visit_count"`
	ShowLastVisited  bool   `mapstructure:"show_last_visited" yaml:"show_last_visited"`
	HistoryPrefix    string `mapstructure:"history_prefix" yaml:"history_prefix"`
	ShortcutPrefix   string `mapstructure:"shortcut_prefix" yaml:"shortcut_prefix"`
	URLPrefix        string `mapstructure:"url_prefix" yaml:"url_prefix"`
	DateFormat       string `mapstructure:"date_format" yaml:"date_format"`
	SortByVisitCount bool   `mapstructure:"sort_by_visit_count" yaml:"sort_by_visit_count"`
}

DmenuConfig holds dmenu/rofi integration configuration.

type HistoryConfig

type HistoryConfig struct {
	MaxEntries          int `mapstructure:"max_entries" yaml:"max_entries"`
	RetentionPeriodDays int `mapstructure:"retention_period_days" yaml:"retention_period_days"`
	CleanupIntervalDays int `mapstructure:"cleanup_interval_days" yaml:"cleanup_interval_days"`
}

HistoryConfig holds history-related configuration.

type LoggingConfig

type LoggingConfig struct {
	Level      string `mapstructure:"level" yaml:"level"`
	Format     string `mapstructure:"format" yaml:"format"`
	Filename   string `mapstructure:"filename" yaml:"filename"`
	MaxSize    int    `mapstructure:"max_size" yaml:"max_size"`
	MaxBackups int    `mapstructure:"max_backups" yaml:"max_backups"`
	MaxAge     int    `mapstructure:"max_age" yaml:"max_age"`
	Compress   bool   `mapstructure:"compress" yaml:"compress"`

	// File output configuration
	LogDir        string `mapstructure:"log_dir" yaml:"log_dir"`
	EnableFileLog bool   `mapstructure:"enable_file_log" yaml:"enable_file_log"`

	// Capture settings
	CaptureStdout  bool `mapstructure:"capture_stdout" yaml:"capture_stdout" json:"capture_stdout"`
	CaptureStderr  bool `mapstructure:"capture_stderr" yaml:"capture_stderr" json:"capture_stderr"`
	CaptureCOutput bool `mapstructure:"capture_c_output" yaml:"capture_c_output" json:"capture_c_output"`
	CaptureConsole bool `mapstructure:"capture_console" yaml:"capture_console" json:"capture_console"`

	// Debug output
	DebugFile     string `mapstructure:"debug_file" yaml:"debug_file"`
	VerboseWebKit bool   `mapstructure:"verbose_webkit" yaml:"verbose_webkit"`
}

LoggingConfig holds logging configuration.

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager handles configuration loading, watching, and reloading.

func NewManager

func NewManager() (*Manager, error)

NewManager creates a new configuration manager.

func (*Manager) Get

func (m *Manager) Get() *Config

Get returns the current configuration (thread-safe).

func (*Manager) GetConfigFile

func (m *Manager) GetConfigFile() string

GetConfigFile returns the path to the configuration file being used.

func (*Manager) Load

func (m *Manager) Load() error

Load loads the configuration from file and environment variables.

func (*Manager) OnConfigChange

func (m *Manager) OnConfigChange(callback func(*Config))

OnConfigChange registers a callback function to be called when config changes.

func (*Manager) Watch

func (m *Manager) Watch() error

Watch starts watching the config file for changes and reloads automatically.

type PaneModeConfig added in v0.9.0

type PaneModeConfig struct {
	ActivationShortcut  string              `mapstructure:"activation_shortcut" yaml:"activation_shortcut" json:"activation_shortcut"`
	TimeoutMilliseconds int                 `mapstructure:"timeout_ms" yaml:"timeout_ms" json:"timeout_ms"`
	Actions             map[string][]string `mapstructure:"actions" yaml:"actions" json:"actions"`
}

PaneModeConfig defines modal behaviour for pane management.

func (*PaneModeConfig) GetKeyBindings added in v0.14.0

func (p *PaneModeConfig) GetKeyBindings() map[string]string

GetKeyBindings returns an inverted map for O(1) key→action lookup. This is built from the action→keys structure in the config.

type PopupBehavior added in v0.12.0

type PopupBehavior string

PopupBehavior defines how popup windows should be opened

const (
	// PopupBehaviorSplit opens popups in a split pane (default)
	PopupBehaviorSplit PopupBehavior = "split"
	// PopupBehaviorStacked opens popups in a stacked pane
	PopupBehaviorStacked PopupBehavior = "stacked"
	// PopupBehaviorTabbed opens popups as a new tab
	PopupBehaviorTabbed PopupBehavior = "tabbed"
	// PopupBehaviorWindowed opens popups in a new workspace window
	PopupBehaviorWindowed PopupBehavior = "windowed"
)

type PopupBehaviorConfig added in v0.9.0

type PopupBehaviorConfig struct {
	// Behavior determines how popups are opened (split/stacked/tabbed/windowed)
	Behavior PopupBehavior `mapstructure:"behavior" yaml:"behavior" json:"behavior"`

	// Placement specifies direction for split behavior ("right", "left", "top", "bottom")
	// Only used when Behavior is "split"
	Placement string `mapstructure:"placement" yaml:"placement" json:"placement"`

	// OpenInNewPane controls whether popups are opened in workspace or blocked
	OpenInNewPane bool `mapstructure:"open_in_new_pane" yaml:"open_in_new_pane" json:"open_in_new_pane"`

	// FollowPaneContext determines if popup placement follows parent pane context
	FollowPaneContext bool `mapstructure:"follow_pane_context" yaml:"follow_pane_context" json:"follow_pane_context"`

	// BlankTargetBehavior determines how target="_blank" links are opened
	// Accepted values: "split", "stacked" (default), "tabbed"
	// This is separate from Behavior which controls JavaScript popups
	BlankTargetBehavior string `mapstructure:"blank_target_behavior" yaml:"blank_target_behavior" json:"blank_target_behavior"`

	// EnableSmartDetection uses WebKitWindowProperties to detect popup vs tab intents
	EnableSmartDetection bool `mapstructure:"enable_smart_detection" yaml:"enable_smart_detection" json:"enable_smart_detection"`

	// OAuthAutoClose enables auto-closing OAuth popups after successful auth redirects
	OAuthAutoClose bool `mapstructure:"oauth_auto_close" yaml:"oauth_auto_close" json:"oauth_auto_close"`
}

PopupBehaviorConfig defines handling for popup windows.

type RenderingMode

type RenderingMode string

RenderingMode selects GPU vs CPU rendering.

const (
	RenderingModeAuto RenderingMode = "auto"
	RenderingModeGPU  RenderingMode = "gpu"
	RenderingModeCPU  RenderingMode = "cpu"
)

type SearchShortcut

type SearchShortcut struct {
	URL         string `mapstructure:"url" toml:"url" yaml:"url" json:"url"`
	Description string `mapstructure:"description" toml:"description" yaml:"description" json:"description"`
}

SearchShortcut represents a search shortcut configuration.

type TabKeyConfig added in v0.9.0

type TabKeyConfig struct {
	NewTab      string `mapstructure:"new_tab" yaml:"new_tab" json:"new_tab"`
	CloseTab    string `mapstructure:"close_tab" yaml:"close_tab" json:"close_tab"`
	NextTab     string `mapstructure:"next_tab" yaml:"next_tab" json:"next_tab"`
	PreviousTab string `mapstructure:"previous_tab" yaml:"previous_tab" json:"previous_tab"`
}

TabKeyConfig defines Zellij-inspired tab shortcuts.

type TabModeConfig added in v0.14.0

type TabModeConfig struct {
	ActivationShortcut  string              `mapstructure:"activation_shortcut" yaml:"activation_shortcut" json:"activation_shortcut"`
	TimeoutMilliseconds int                 `mapstructure:"timeout_ms" yaml:"timeout_ms" json:"timeout_ms"`
	Actions             map[string][]string `mapstructure:"actions" yaml:"actions" json:"actions"`
}

TabModeConfig defines modal behaviour for tab management (Zellij-style).

func (*TabModeConfig) GetKeyBindings added in v0.14.0

func (t *TabModeConfig) GetKeyBindings() map[string]string

GetKeyBindings returns an inverted map for O(1) key→action lookup. This is built from the action→keys structure in the config.

type VideoAccelerationConfig added in v0.5.0

type VideoAccelerationConfig struct {
	EnableVAAPI      bool   `mapstructure:"enable_vaapi" yaml:"enable_vaapi"`
	AutoDetectGPU    bool   `mapstructure:"auto_detect_gpu" yaml:"auto_detect_gpu"`
	VAAPIDriverName  string `mapstructure:"vaapi_driver_name" yaml:"vaapi_driver_name"`
	EnableAllDrivers bool   `mapstructure:"enable_all_drivers" yaml:"enable_all_drivers"`
	LegacyVAAPI      bool   `mapstructure:"legacy_vaapi" yaml:"legacy_vaapi"`
}

VideoAccelerationConfig holds video hardware acceleration preferences.

type WorkspaceConfig added in v0.9.0

type WorkspaceConfig struct {
	// PaneMode defines modal pane behaviour and bindings.
	PaneMode PaneModeConfig `mapstructure:"pane_mode" yaml:"pane_mode" json:"pane_mode"`
	// TabMode defines modal tab behaviour and bindings (Alt+T).
	TabMode TabModeConfig `mapstructure:"tab_mode" yaml:"tab_mode" json:"tab_mode"`
	// Tabs holds classic browser tab shortcuts.
	Tabs TabKeyConfig `mapstructure:"tabs" yaml:"tabs" json:"tabs"`
	// TabBarPosition determines tab bar placement: "top" or "bottom".
	TabBarPosition string `mapstructure:"tab_bar_position" yaml:"tab_bar_position" json:"tab_bar_position"`
	// Popups configures default popup placement rules.
	Popups PopupBehaviorConfig `mapstructure:"popups" yaml:"popups" json:"popups"`
	// Styling configures workspace visual appearance.
	Styling WorkspaceStylingConfig `mapstructure:"styling" yaml:"styling" json:"styling"`
}

WorkspaceConfig captures layout, pane, and tab behaviour preferences.

type WorkspaceStylingConfig added in v0.9.0

type WorkspaceStylingConfig struct {
	// BorderWidth in pixels for active pane borders
	BorderWidth int `mapstructure:"border_width" yaml:"border_width" json:"border_width"`
	// BorderColor for focused panes (CSS color value or theme variable)
	BorderColor string `mapstructure:"border_color" yaml:"border_color" json:"border_color"`
	// InactiveBorderWidth in pixels for inactive pane borders (0 = hidden)
	InactiveBorderWidth int `mapstructure:"inactive_border_width" yaml:"inactive_border_width" json:"inactive_border_width"`
	// InactiveBorderColor for unfocused panes (CSS color value or theme variable)
	InactiveBorderColor string `mapstructure:"inactive_border_color" yaml:"inactive_border_color" json:"inactive_border_color"`
	// ShowStackedTitleBorder enables the separator line below stacked pane titles
	ShowStackedTitleBorder bool `mapstructure:"show_stacked_title_border" yaml:"show_stacked_title_border" json:"show_stacked_title_border"`
	// PaneModeBorderColor for the pane mode indicator border (CSS color value or theme variable)
	// Defaults to "#4A90E2" (blue) if not set
	PaneModeBorderColor string `mapstructure:"pane_mode_border_color" yaml:"pane_mode_border_color" json:"pane_mode_border_color"`
	// TabModeBorderColor for the tab mode indicator border (CSS color value or theme variable)
	// Defaults to "#FFA500" (orange) if not set - MUST be different from PaneModeBorderColor
	TabModeBorderColor string `mapstructure:"tab_mode_border_color" yaml:"tab_mode_border_color" json:"tab_mode_border_color"`
	// TransitionDuration in milliseconds for border animations
	TransitionDuration int `mapstructure:"transition_duration" yaml:"transition_duration" json:"transition_duration"`
	// BorderRadius in pixels for pane border corners
	BorderRadius int `mapstructure:"border_radius" yaml:"border_radius" json:"border_radius"`
	// UIScale is a multiplier for UI elements like title bars (1.0 = 100%, 1.2 = 120%)
	UIScale float64 `mapstructure:"ui_scale" yaml:"ui_scale" json:"ui_scale"`
}

WorkspaceStylingConfig defines visual styling for workspace panes.

type XDGDirs

type XDGDirs struct {
	ConfigHome string
	DataHome   string
	StateHome  string
}

XDGDirs holds the XDG Base Directory paths for the application.

func GetXDGDirs

func GetXDGDirs() (*XDGDirs, error)

GetXDGDirs returns the XDG Base Directory paths for dumber. It follows the XDG Base Directory specification: - $XDG_CONFIG_HOME/dumber (default: ~/.config/dumber) - $XDG_DATA_HOME/dumber (default: ~/.local/share/dumber) - $XDG_STATE_HOME/dumber (default: ~/.local/state/dumber)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL