Stable v0.1.0

gartk

X11/Cairo UI toolkit for gardesk components

gartk is a shared X11/Cairo toolkit providing common UI functionality for gardesk components. It includes core types (Color, Rect, Theme), Cairo/Pango rendering with shape primitives and text layout, and an X11 backend with window management, event handling, and monitor detection. Used by garlaunch, garlock, gardm-greeter, garshot, and other gar components.

🎯 RPM Available

Overview

gartk is a Rust library providing common UI functionality for the gardesk desktop environment. It extracts shared patterns from garlaunch, garbar, gardm-greeter, and other components into reusable crates.

Crate Structure

Option Type Default Description
gartk-core - - Fundamental types: Color, Rect, Theme, InputEvent
gartk-render - - Cairo/Pango rendering: surfaces, shapes, text
gartk-x11 - - X11 integration: windows, event loop, monitors

Installation

As a Dependency

Add to your Cargo.toml:

[dependencies]
gartk-core = { path = "../gartk/gartk-core" }
gartk-x11 = { path = "../gartk/gartk-x11" }
gartk-render = { path = "../gartk/gartk-render" }

Build Dependencies

$sudo dnf install libxcb-devel libX11-devel cairo-devel pango-devel# Fedora/RHEL
$sudo apt install libxcb1-dev libx11-dev libcairo2-dev libpango1.0-dev# Debian/Ubuntu
$sudo pacman -S libxcb libx11 cairo pango# Arch Linux

Quick Start

Minimal window example:

use gartk_core::{Color, Theme, InputEvent, Key};
use gartk_x11::{Connection, Window, WindowConfig, EventLoop, EventLoopConfig};
use gartk_render::Renderer;

fn main() -> anyhow::Result<()> {
    // Connect to X11
    let conn = Connection::connect(None)?;

    // Create window
    let window = Window::create(
        conn.clone(),
        WindowConfig::new()
            .title("Hello gartk")
            .class("hello-gartk")
            .size(400, 300),
    )?;

    // Create renderer with theme
    let theme = Theme::dark();
    let mut renderer = Renderer::with_theme(400, 300, theme)?;

    // Event loop
    let mut event_loop = EventLoop::new(&window, EventLoopConfig::default())?;

    event_loop.run(|ev_loop, event| {
        match event {
            InputEvent::Expose | InputEvent::Idle => {
                if ev_loop.needs_redraw() {
                    renderer.clear()?;
                    renderer.text_default("Hello, World!", 50.0, 150.0, Color::WHITE)?;
                    renderer.flush();
                    ev_loop.redraw_done();
                }
            }
            InputEvent::Key(e) if e.pressed && e.key == Key::Escape => {
                return Ok(false); // Exit
            }
            InputEvent::CloseRequested => return Ok(false),
            _ => {}
        }
        Ok(true) // Continue
    })?;

    Ok(())
}

Usage in gardesk

gartk is used by these components:

  • garlaunch - Application launcher popup
  • garlock - Screen locker UI
  • gardm-greeter - Display manager login screen
  • garshot - Screenshot annotation editor
  • garclip-picker - Clipboard history picker