2.8 KiB
2.8 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Waycast is a GTK4-based application launcher for Wayland compositors, built with Rust using the relm4 framework. It provides a floating launcher interface that displays desktop applications with icons and allows users to search and launch them.
Build and Development Commands
# Build the project
cargo build
# Run the application
cargo run
# Build for release
cargo build --release
# Check code formatting
cargo fmt --check
# Format code
cargo fmt
# Run clippy lints
cargo clippy
# Run tests (if any exist)
cargo test
Architecture
Core Components
-
main.rs: Contains the main GTK4/relm4 application with two primary components:
AppModel
: Main window component with search functionalityListItem
: Factory component for rendering individual launcher items
-
lib.rs: Defines core traits and types:
LauncherListItem
trait: Interface for launchable itemsLaunchError
enum: Error handling for launch operations
-
drun module (
src/drun/mod.rs
): Handles desktop application discoveryDesktopEntry
struct: Represents a .desktop fileall()
function: Scans XDG_DATA_DIRS for desktop applications- Implements
LauncherListItem
trait for desktop entries
-
util module (
src/util/
): Utility functionsfiles.rs
: File system operations, particularlyget_files_with_extension()
Key Technologies
- GTK4: UI framework with gtk4-layer-shell for Wayland layer shell protocol
- relm4: Reactive UI framework for GTK4 applications
- gio: GLib I/O library for desktop app info and icon handling
Important Implementation Details
- Uses gtk4-layer-shell to create a floating overlay window on Wayland
- Desktop applications are discovered by parsing .desktop files from XDG_DATA_DIRS
- Icons are handled through GIO's Icon system (ThemedIcon and FileIcon)
- Factory pattern is used for efficiently rendering lists of launcher items
Lifetime Management
When working with GTK widgets in relm4 view macros, be careful with string references. The view macro context has specific lifetime requirements:
- Avoid returning
&str
from methods called in view macros - Use
self.field.as_ref().map(|s| s.as_str())
pattern for Option to Option<&str> conversion - Static strings work fine, but dynamic references may cause stack overflows
Module Structure
src/
├── main.rs # Main application and UI components
├── lib.rs # Core traits and error types
├── drun/
│ └── mod.rs # Desktop application discovery
└── util/
├── mod.rs # Utility module exports
└── files.rs # File system utilities