From 04eebad84513cc43bcbf9d7145d2553eeb0bb9c3 Mon Sep 17 00:00:00 2001 From: Gleb Khmyznikov Date: Thu, 19 Jun 2025 14:26:30 +0200 Subject: [PATCH] add hosts editor doc --- .../images/hostsfileeditor/code structure.png | Bin 0 -> 84279 bytes doc/devdocs/modules/hostsfileeditor.md | 102 ++++++++++++++++++ doc/devdocs/modules/readme.md | 1 + 3 files changed, 103 insertions(+) create mode 100644 doc/devdocs/images/hostsfileeditor/code structure.png create mode 100644 doc/devdocs/modules/hostsfileeditor.md diff --git a/doc/devdocs/images/hostsfileeditor/code structure.png b/doc/devdocs/images/hostsfileeditor/code structure.png new file mode 100644 index 0000000000000000000000000000000000000000..08c09f7271b24b840167e04a9c5f9a8c7eab4368 GIT binary patch literal 84279 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∾wq$>O3mAaTS*J871_r11S|RS#-=Vv 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 t}S6!DS7JQ>{b5%|r` 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 literal 0 HcmV?d00001 diff --git a/doc/devdocs/modules/hostsfileeditor.md b/doc/devdocs/modules/hostsfileeditor.md new file mode 100644 index 0000000000..4a8695f67d --- /dev/null +++ b/doc/devdocs/modules/hostsfileeditor.md @@ -0,0 +1,102 @@ +# Hosts File Editor + +[Learn](https://learn.microsoft.com/en-us/windows/powertoys/hosts-file-editor) + +## Overview + +The Hosts File Editor module provides a convenient way to edit the system's hosts file. The hosts file is a plain text file used by the operating system to map hostnames to IP addresses, allowing users to override DNS for specific domain names. + +## Code Structure + +![Code structure](../images/hostsfileeditor/code%20structure.png) + +The Hosts File Editor module is structured into three primary components: + +1. **Hosts** - Entry point for the Hosts File Editor. Manages core services and settings through helper utilities. +2. **HostsModuleInterface** - Interface for integrating the Hosts module with the PowerToys system. +3. **HostsUILib** - Implements the UI layer using WinUI 3. + +This structure is similar to the Environment Variables for Windows module. + +## Key Components + +### Main Entry Points + +- **Module Entry**: [Program.cs](/src/modules/Hosts/Program.cs) → [App.xaml.cs](/src/modules/Hosts/HostsXAML/App.xaml.cs) +- **Settings UI**: + - Main Window: [MainWindow.xaml.cs](/src/modules/Hosts/Hosts/HostsXAML/MainWindow.xaml.cs) + - View: [HostsMainPage.xaml.cs](/src/modules/Hosts/HostsUILib/HostsMainPage.xaml.cs) + - ViewModel: [HostsMainPage.xaml.cs](/src/modules/Hosts/HostsUILib/HostsMainPage.xaml.cs) +- **Runner Integration**: [HostsModuleInterface](/src/modules/Hosts/HostsModuleInterface) + +### Runner Integration + +The module is loaded by the PowerToys runner from: +- [main.cpp](/src/runner/main.cpp) (Lines 183-184): Loads Hosts Module using `L"WinUI3Apps/PowerToys.HostsModuleInterface.dll"` + +### Settings Management + +- [HostsViewModel.cs](/src/settings-ui/Settings.UI/ViewModels/HostsViewModel.cs): Hosts UI in PowerToys settings +- [HostsProperties.cs](/src/settings-ui/Settings.UI.Library/HostsProperties.cs): In settings UI +- [HostsSettings.cs](/src/settings-ui/Settings.UI.Library/HostsSettings.cs): Wrapper with HostsProperties + +### Module Components + +#### HostsModuleInterface + +- Defines the interface for integrating the Hosts module with the PowerToys system. + +#### Hosts (Main Project) + +- [Program.cs](/src/modules/Hosts/Hosts/Program.cs): Launch app +- [HostsXAML](/src/modules/Hosts/Hosts/HostsXAML): Initialize service and loads the main window +- [Host.cs](/src/modules/Hosts/Hosts/Helpers/Host.cs): Access to services register +- [NativeEventWaiter.cs](/src/modules/Hosts/Hosts/Helpers/NativeEventWaiter.cs): Gets the dispatcher queue for posting UI updates from a background thread +- [UserSettings.cs](/src/modules/Hosts/Hosts/Settings/UserSettings.cs): Manages reading, tracking, and updating user settings from settings.json + +#### HostsUILib + +- [HostsMainPage.xaml.cs](/src/modules/Hosts/HostsUILib/HostsMainPage.xaml.cs): Main page +- [ViewModels](/src/modules/Hosts/HostsUILib/ViewModels): Contains view models that manage state and logic +- [Models](/src/modules/Hosts/HostsUILib/Models): Models for managing host entries + - [AddressType.cs](/src/modules/Hosts/HostsUILib/Models/AddressType.cs): Specifies whether an address is IPv4, IPv6, or Invalid + - [Entry.cs](/src/modules/Hosts/HostsUILib/Models/Entry.cs): Represents a single hosts file entry (IP address, hostnames, comment, flags) + - [HostsData.cs](/src/modules/Hosts/HostsUILib/Models/HostsData.cs): Converts the list of entries into a read-only collection +- [Settings](/src/modules/Hosts/HostsUILib/Settings): Settings configuration +- [Consts.cs](/src/modules/Hosts/HostsUILib/Consts.cs): Defines constants like max hosts IP length +- [Helpers](/src/modules/Hosts/HostsUILib/Helpers): Utilities for dealing with hosts IP, filter features, and file loading + +## Call Flow + +1. **Enable app**: runner/main.cpp → settings.ui/settings.ui.library +2. **Start app**: Program.cs → HostsXAML → HostsMainPage +3. **Load hosts data**: ViewModel → HostsData → Helpers (load and parse file) +4. **User edits**: UI bound to ViewModel updates entries +5. **Save changes**: ViewModel triggers file write through Helpers +6. **Settings management**: UserSettings.cs persists user preferences + +## Key Features + +| Feature | Key Function | +|---------|--------------| +| Adding a new entry | `Add(Entry entry)` | +| Filtering host file entries | `ApplyFilters()` | +| Open Hosts File | `ReadHosts()` | +| Additional Lines | `UpdateAdditionalLines(string lines)` | + +## Settings + +| Setting | Implementation | +|---------|---------------| +| Open as administrator | `UserSettings()` | +| Additional lines position | `UserSettings()->AdditionalLinesPosition` | +| Consider loopback addresses as duplicates | `UserSettings()->LoopbackDuplicates` | +| Encoding Setting | `UserSettings()->Encoding` | + +## How to Build and Debug + +1. Build PowerToys Project in debug mode +2. Set Hosts as the startup project +3. Launch Hosts File Editor in debug mode +4. Attach the debugger to PowerToys.Hosts.dll +5. Add breakpoints in the Hosts code diff --git a/doc/devdocs/modules/readme.md b/doc/devdocs/modules/readme.md index cd9bc1c023..fe908052cc 100644 --- a/doc/devdocs/modules/readme.md +++ b/doc/devdocs/modules/readme.md @@ -8,6 +8,7 @@ This section contains documentation for individual PowerToys modules, including |--------|-------------|---------------| | Environment Variables | Tool for managing user and system environment variables | [Architecture & Implementation](environmentvariables.md) | | FancyZones | Window manager utility for custom window layouts | [Architecture & Implementation](fancyzones.md), [Debugging Tools](fancyzones-tools.md) | +| Hosts File Editor | Tool for managing the system hosts file | [Architecture & Implementation](hostsfileeditor.md) | | Keyboard Manager | Tool for remapping keys and keyboard shortcuts | [Documentation](keyboardmanager/README.md) | | NewPlus | Context menu extension for creating new files in File Explorer | [Architecture & Implementation](newplus.md) | | Quick Accent | Tool for quickly inserting accented characters and special symbols | [Architecture & Implementation](quickaccent.md) |