# active-win-pos-rs

![Build status](https://github.com/dimusic/active-win-pos-rs/actions/workflows/build.yml/badge.svg)

A small Rust library that lets you get position, size, title and a few other properties of the active window on Windows, MacOS and Linux

## Usage

### Add to Cargo.toml:
```toml
[dependencies]
active-win-pos-rs = "0.11"
```

### Use:
```rust
use active_win_pos_rs::get_active_window;

fn main() {
    match get_active_window() {
        Ok(active_window) => {
            println!("active window: {:#?}", active_window);
        },
        Err(()) => {
            println!("error occurred while getting the active window");
        }
    }
}
```
Would give you an instance of ```ActiveWindow``` struct with unique window id, process id, window position and window title.

Or use ``` active_win_pos_rs::get_position ``` to get the ```WindowPosition``` only.

### Window title on MacOS
On MacOS ```title``` property will always return an empty string
unless you [Enable Screen Recording permission](https://support.apple.com/en-ca/guide/mac-help/mchld6aa7d23/mac) for your app.

### Wayland support on Linux
On Linux, the library now supports both X11 and Wayland. When running on Wayland (detected via the `WAYLAND_DISPLAY` environment variable), the library will attempt to get the active window information from the following compositors, in order:
- **KDE Plasma (KWin)** (via `kdotool`)
- **Hyprland** (via `hyprland` ipc)

If all Wayland backends fail, or if `WAYLAND_DISPLAY` is not set, the library falls back to X11/XCB, maintaining full backward compatibility.

### Linux build dependencies
To build on Linux, install these system packages first:

- `libxcb-ewmh-dev`
- `libxcb-randr0-dev`
- `libdbus-1-dev`
- `pkg-config`

On Debian/Ubuntu:

```sh
sudo apt-get update
sudo apt-get install -y libxcb-ewmh-dev libxcb-randr0-dev libdbus-1-dev pkg-config
```

## Build

```sh
% git clone https://github.com/dimusic/active-win-pos-rs.git
% cd active-win-pos-rs
% cargo build
```

## Example
```sh
% cargo run --example active-window
```
Output:
```
active window: ActiveWindow {
    title: "cmd - cargo  run --example active-window",
    process_path: "C:\\Program Files\\WindowsApps\\Microsoft.WindowsTerminal_1.16.10262.0_x64__8wekyb3d8bbwe\\WindowsTerminal.exe",
    app_name: "WindowsTerminal",
    window_id: "HWND(9700584)",
    process_id: 8460,
    position: WindowPosition {
        x: 6.0,
        y: 296.0,
        width: 1129.0,
        height: 635.0,
    },
}
```

## Project Support
This project is supported by a few maker-focused businesses I run and actively use in my workflow.
If you work with laser cutting, CNC, or digital art, you might find them useful too.
- **[MyLaserTools](https://mylasertools.com)** tools and resources for laser cutting, CNC machining, and 3D printing.
- **[YXE Creations Craft Hub](https://yxecreations.com)** a laser craft supply store for acrylic, plywood, and maker materials.
- **[Lumicry](https://lumicry.com)** digital luminous neon and acrylic art powered by LEDs and custom electronics.
