DanSandClaude Opus 5.5 73f7f33a4b perf(skins): skip redundant skin parsing, base reloads and theme writes
Skin handling did more work than it needed:
- the bundled-skin scan fully parsed each of the 9 bundled skin files to
  read name, author, dark and images from their first 327-345 bytes. The
  build copies the rest of ui.toml into every skin, so each file is
  51-54 KB;
- setActiveSkin() reloaded ui.toml right after main() had loaded it, a
  second full parse with nothing merged in between;
- in the Windows single-file exe, every getBundledSkinsDirectory() call
  (skin refresh, the dragonx entry, each image-dir lookup) re-extracted
  all embedded themes with a blind overwrite: more than once per launch,
  and again on skin changes.

Now:
- bundled skins are parsed only up to the first table header after
  [theme] other than [theme.images]. Anything unusual (no [theme],
  images defined later, a parse error in the slice) falls back to the
  full parse, and user skins are still parsed in full;
- UISchema tracks whether its state is exactly the base (the last change
  was a base load and no hot-reload is pending), and setActiveSkin()
  skips reloadBase() in that case;
- the bundled-skins directory is resolved once per process (re-checked
  with exists()), and theme extraction rewrites a file only when its
  bytes differ, through the new resources::writeFileIfDifferent(). It
  compares bytes, not sizes, so a same-length palette edit still
  updates.

Measured on the Lite build (median of 5 runs):
- bundled-skin scan: 15 -> 1 ms;
- from "Initializing ObsidianDragon" to the activated skin: 29 -> 12 ms;
- ui.toml is loaded once per launch instead of twice, and the light skin
  merges its overlay exactly once.

A Python mirror of the header-slice parse agrees with a full parse on
name, author, dark and images for all 18 source and build-expanded skin
files, and full screenshot sweeps over all 10 skins match the previous
build within noise. New unit tests cover writeFileIfDifferent(): missing
file, identical bytes (mtime untouched), same-length change, and a
longer file truncated.

Behaviour changes:
- a bundled skin with a TOML error after its header is now listed
  instead of skipped; the error surfaces only when it is selected;
- deleting a single file inside the extracted bundled-themes dir
  mid-session is repaired only at the next launch;
- the "Extracted N embedded bundled themes" count includes files that
  were already current.

Not verifiable here: Linux has no embedded themes, so the new
writeFileIfDifferent() ran only in the unit tests and the extraction
path was only compiled, in the Windows cross-build. That a second
Windows launch leaves the theme files' mtimes untouched is still to be
checked on Windows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 06:05:07 -05:00
2026-03-19 14:46:33 -05:00
2026-03-03 01:20:03 -06:00
2026-02-27 00:26:01 -06:00

ObsidianDragon - DragonX Wallet

A lightweight, portable full-node cryptocurrency wallet for DragonX (DRGX), built with Dear ImGui.

Current pre-release: 1.2.0-rc1.

License Platform

Features

  • Full Node Support: Connects to dragonxd for complete blockchain verification
  • Shielded Transactions: Full z-address support with encrypted memos
  • Address Management: Labels, icons, favorites, hidden addresses, and address-to-address transfers
  • Integrated Mining: Solo CPU mining plus pool mining through xmrig, with idle-mining controls
  • Explorer Tools: Block/transaction lookup and bootstrap snapshot download
  • Market Data: Real-time price charts from CoinGecko
  • QR Codes: Generate and display QR codes for receiving addresses
  • Multi-language: i18n support for English, German, Spanish, French, Japanese, Korean, Portuguese, Russian, and Chinese
  • CJK Fonts: Bundled CJK subset font for translated interfaces
  • Lightweight: ~5-10MB binary vs ~50MB+ for Qt version
  • Fast Builds: Compiles in seconds, not minutes

Screenshots



Building

Quick Setup

The setup script detects your OS, installs all build dependencies, and validates your environment:

./setup.sh              # Install core build deps (interactive)
./setup.sh --check      # Just report what's missing
./setup.sh --all        # Core + Windows/macOS cross-compile + Sapling params
./setup.sh --win        # Also install mingw-w64 + libsodium-win

Manual Prerequisites

Click to expand manual install commands

Linux (Ubuntu/Debian):

sudo apt install build-essential cmake git pkg-config
sudo apt install libgl1-mesa-dev libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev
sudo apt install libsodium-dev libcurl4-openssl-dev

Linux (Arch):

sudo pacman -S base-devel cmake git pkg-config mesa libx11 libxcursor libxrandr libxinerama libxi libsodium curl

macOS:

xcode-select --install
brew install cmake

Windows:

  • Visual Studio 2019+ with C++ workload
  • CMake 3.20+

Binaries

Download linux and windows binaries of latest releases and place in binary directories:

DragonX daemon (https://git.dragonx.is/DragonX/dragonx):

  • prebuilt-binaries/dragonxd-linux/
  • prebuilt-binaries/dragonxd-win/
  • prebuilt-binaries/dragonxd-mac/

DRG-XMRig fork (https://git.dragonx.is/DragonX/drg-xmrig):

  • prebuilt-binaries/drg-xmrig/

Build Steps

### Clone repository (if not already)
git clone https://git.dragonx.is/dragonx/ObsidianDragon.git
cd ObsidianDragon/

Windows Build

./build.sh --win-release

Release Build

./build.sh --linux-release    # Linux release + AppImage
./build.sh --win-release      # Windows cross-compile
./build.sh --mac-release      # macOS .app bundle + DMG
./build.sh --clean --linux-release  # Clean + Release

Running

  1. Start dragonxd (if not using embedded daemon):

    dragonxd -daemon
    
  2. Run the wallet:

    cd build/bin
    ./ObsidianDragon
    

The wallet will automatically connect to the daemon using credentials from ~/.hush/DRAGONX/DRAGONX.conf.

Using Custom Node Binaries

The wallet checks its own directory first when looking for DragonX node binaries. This means you can test new or different branch builds of hush-arrakis-chain/hushd without waiting for a new wallet release:

  1. Build or download the node binaries you want to test
  2. Place them in the same directory as the wallet executable (e.g. build/bin/)
  3. Launch the wallet — it will use the local binaries instead of the bundled ones

Search order:

  1. Wallet executable directory (highest priority)
  2. Embedded/extracted daemon (app data directory)
  3. System-wide locations (/usr/local/bin, ~/dragonx/src, etc.)

This is useful for testing new branches or hotfixes to the node software before they are bundled into a wallet release.

Configuration

Configuration is stored in ~/.hush/DRAGONX/DRAGONX.conf:

rpcuser=your_rpc_user
rpcpassword=your_rpc_password
rpcport=21769

Project Structure

ObsidianDragon/
├── src/
│   ├── main.cpp           # Entry point, SDL/ImGui setup
│   ├── app.cpp/h          # Main application class
│   ├── data/              # WalletState, address book, exchange info
│   ├── config/            # Settings persistence and committed/generated version.h
│   ├── ui/
│   │   ├── schema/        # TOML UI schema and skin manager
│   │   ├── material/      # Material components, typography, layout
│   │   ├── windows/       # Tabs and dialogs
│   │   └── pages/         # Multi-page screens such as Settings
│   ├── rpc/
│   │   ├── rpc_client.cpp # JSON-RPC client
│   │   └── connection.cpp # Daemon connection
│   ├── resources/         # Embedded resource extraction
│   ├── platform/          # Windows DX11/backdrop helpers
│   ├── util/
│   │   ├── i18n.cpp       # Internationalization
│   │   └── ...
│   └── daemon/
│       └── embedded_daemon.cpp
├── res/
│   ├── fonts/             # Ubuntu, icon, and CJK fonts
│   └── lang/              # Translation files
├── libs/
│   └── qrcode/            # QR code generation
├── CMakeLists.txt
├── build.sh               # Release/cross-platform build script
└── scripts/create-appimage.sh # AppImage packaging

Dependencies

Fetched or discovered by CMake:

  • SDL3 — Cross-platform windowing/input
  • nlohmann/json — JSON parsing
  • toml++ — TOML parsing (UI schema/themes)
  • libcurl — HTTP/HTTPS transport for daemon RPC and network calls (system on Linux/macOS, fetched on Windows)

Bundled in libs/:

  • Dear ImGui — Immediate mode GUI
  • libsodium — Cryptographic operations (system on Linux or fetched by scripts/fetch-libsodium.sh)
  • QR-Code-generator — QR code rendering
  • miniz — ZIP compression
  • GLAD — OpenGL loader (Linux/macOS)
  • stb_image — Image loading
  • incbin — Binary resource embedding (Windows builds)

Keyboard Shortcuts

Shortcut Action
Ctrl+, Settings
F5 Refresh
Alt+F4 Exit

Translation

Current language files live in res/lang/ as de, es, fr, ja, ko, pt, ru, and zh JSON files, with built-in English fallbacks.

To add a new language:

  1. Copy res/lang/es.json to res/lang/<code>.json
  2. Translate all strings
  3. The language will appear in Settings automatically

License

This project is licensed under the GNU General Public License v3 (GPLv3).

Credits

  • The Hush Developers
  • DragonX Community
  • Dear ImGui by Omar Cornut
  • SDL by Sam Lantinga
S
Description
No description provided
Readme GPL-3.0
128 MiB
2026-09-04 05:12:06 -05:00
Languages
C++ 76.6%
C 18.3%
Shell 1.7%
Python 1.6%
HTML 1.3%
Other 0.5%