A tiling window manager for Windows 10 based on binary space partitioning

Overview

yatta

BSP Tiling Window Manager for Windows 10

demo

Getting Started

This project is still heavily under development and there are no prebuilt binaries available yet.

If you would like to use yatta, you will need a working Rust development environment on Windows 10. If you are using the x86_64-pc-windows-msvc toolchain, make sure you have also installed the Build Tools for Visual Studio 2019.

You can then clone this repo and compile the source code to install the binaries for yatta and yattac:

cargo install --path yatta
cargo install --path yattac

By running yattac start at a Powershell prompt, you should see the following output:

Start-Process yatta -WindowStyle hidden

This means that yatta is now running in the background, tiling all your windows, and listening for commands sent to it by yattac.

You can similarly stop the process by running yattac stop, and you should see the following output:

Stop-Process -Name yatta

Keybindings

This project does not handle anything related to keybindings and keyboard shortcuts. I am currently using AutoHotKey to manage my window management keyboard shortcuts. Here is a sample yatta.ahk AHK script that you can use as a starting point for your own:

; Start yatta, this command makes sure no duplicate processes will be created
Run, yattac.exe start, Hide

; Send the configuration options for yatta here
;
; Ensure there are 3 virtual desktops
Run, yattac.exe ensure-desktops 3, Hide

; Always open Signal in Desktop 2
Run, yattac.exe exe-desktop Signal.exe 2, Hide
; Always open Ferdi in Desktop 2
Run, yattac.exe exe-desktop Ferdi.exe 2, Hide

; Always float IntelliJ popups, matching on class
Run, yattac.exe float-class SunAwtDialog, Hide
; Always float Control Panel, matching on class
Run, yattac.exe float-class CabinetWClass, Hide
; Always float Task Manager, matching on class
Run, yattac.exe float-class TaskManagerWindow, Hide
; Always float Wally, matching on executable name
Run, yattac.exe float-exe Wally.exe, Hide
; Always float Calculator app, matching on window title
Run, yattac.exe float-title Calculator, Hide

; Change the focused window, Alt + Vim direction keys
!h::
; This sends an Alt key which is a hack to steal focus when Windows doesn't feel like respecting SetForegroundWindow
; https://stackoverflow.com/questions/10740346/setforegroundwindow-only-working-while-visual-studio-is-open
Send !
Run, yattac.exe focus left, , Hide
return

!j::
Send !
Run, yattac.exe focus down, , Hide
return

!k::
Send !
Run, yattac.exe focus up, , Hide
return

!l::
Send !
Run, yattac.exe focus right, , Hide
return

; Move the focused window in a given direction, Alt + Shift + Vim direction keys
!+h::
Run, yattac.exe move left, Hide
return

!+j::
Run, yattac.exe move down, Hide
return

!+k::
Run, yattac.exe move up, Hide
return

!+l::
Run, yattac.exe move right, Hide
return

; Promote the focused window to the top of the tree, Alt + Shift + Enter
!+Enter::
Run, yattac.exe promote, Hide
return

; Switch to an equal-width, max-height column layout, Alt + Shift + C
!+c::
Run, yattac.exe layout columns, Hide
return

; Switch to the default vertical bsp tiling layout, Alt + Shift + T
!+t::
Run, yattac.exe layout bspv, Hide
return

; Force a retile if things get janky, Alt + Shift + R
!+r::
Run, yattac.exe retile, Hide
return

; Float the focused window, Alt + Shift + F
!+f::
Run, yattac.exe toggle-float, Hide
return

; Pause responding to any window events or yattac commands, Alt + P
!p::
Run, yattac.exe toggle-pause, Hide
return

As more commands are still being added and some commands and arguments may change before the CLI is stabilised, I recommend running yattac.exe help to see the full list of commands and operations available to be bound to keyboard shortcuts.

Comments
  • Workspaces

    Workspaces

    This pull request adds workspaces. It is not quite ready for merge yet, but functionality-wise it works just fine.

    There are infinite workspaces that are indexed by numbers starting from 0. They are created automatically when you move to them or move a window to them. To open a workspace, I added the yattac set-workspace command and to move the currently focused window to a specified workspace I added yattac move-window-to-workspace.

    Windows not on the current workspace are completely hidden (they don't appear in Alt+Tab or the taskbar).

    The behavior with multiple monitors is that each monitor has its own set of workspaces and each monitor's workspace can be switched separately.

    Also, this implentation of workspaces does not have support for workspaces as tags (having a window on multiple workspaces / having multiple workspaces open at the same time), but as far as I know bspwm does not have this functionality either and in my opinion implementing this would just be unnecessarily complicated for a feature that few people actually use.

    There are still a few issues that need to be fixed before merge:

    • [ ] Minimized windows appear on all workspaces
    • [ ] There is no way to specify a default workspace for a window
    • [ ] Weird behavior when switching windows virtual desktops
    • [ ] When a window shows itself the workspace should automatically be switched to the one where the window is on (for example, if you click on a Firefox link, the Firefox window appears and then disappears immediately again, instead the workspace should be switched to the one Firefox is on)
    • [x] If a window closes itself while not on the current workspace, resize adjustments may not be carried over (I could not find any way to produce this hypothetical bug so it probably doesn't exist)
    • [x] Messy code
    • [x] Restore focus on workspace switch
    • [x] Add example hotkeys
    • [x] When Yatta is closed with open windows on other workspaces, they become permanently irretrievable and can only be closed via Task Manager
    • [x] Some programs (Firefox, IntelliJ on startup) may appear on multiple workspaces at once or just switch workspaces themselves
    • [x] Minimizing windows leads to very weird behavior, such as making a different window appear on multiple workspaces at once

    Fixes #14

    opened by ghost 35
  • Resizing windows with yattac

    Resizing windows with yattac

    Oh and also, is there supposed to be a way to resize windows? Or at least make it so manually resizing windows makes yatta aware of the new size? (Feel free to tell me to open another issue because i guess I'm getting off-topic 😁 )

    Originally posted by @eramdam in https://github.com/LGUG2Z/yatta/issues/2#issuecomment-803249946

    opened by LGUG2Z 7
  • Feature request: Multi-monitor support

    Feature request: Multi-monitor support

    What the title says 😅

    If it's already there, I couldn't find any command to handle that. Very promising project already, as a fan of yabai on macOS I'm very happy to see a (good) equivalent shaping up on Windows 🙇‍♂️ 🙏

    opened by eramdam 7
  • Resizing windows with a mouse

    Resizing windows with a mouse

    Will try to do that later this week! Would it be possible to make it so mouse-resizing updates the tree as well? (Just curious if that's even possible)

    Originally posted by @eramdam in https://github.com/LGUG2Z/yatta/issues/3#issuecomment-807343951

    opened by LGUG2Z 4
  • Add a license

    Add a license

    Because this project has no license, forking and modifying it or using the source code even for just a pull request is illegal. I already made a pull request before noticing this which technically violates your copyright, so if you want me to I can delete my fork and pull request.

    opened by ghost 3
  • Steam, when closed, still takes up space in the layout

    Steam, when closed, still takes up space in the layout

    When you open Steam, and close the window, it still takes up space in the layout and becomes a "phantom window" that only disappears if you close the entire Steam process from tray (which also stops all Steam games and is thus undesirable).

    opened by ghost 2
  • Feature request: Workspaces

    Feature request: Workspaces

    I currently switch to arch + bspwm and happy with the way bspwm manages workspace. With windows desktop, there always lag/unstable and slow animation when switching desktop. Is there any plan for yatta to support a virtual workspace?

    opened by xquangdang 2
  • Building Error

    Building Error

    Is it possible to compile this on WSL? I'm using ubuntu 18.04 and followed the rust setup instructions for WSL. After setting up it gives me this toolchain: stable-x86_64-unknown-linux-gnu.

    I'm getting an error when trying to run cargo install --path yatta, here is the verbose message:

    image

    I have never touched rust before, so I'm not sure if I'm missing a different toolchain or something.

    opened by kai-dg 2
  • Feature request: Tabbing

    Feature request: Tabbing

    Feature: Window tabs

    How it's supposed to behave: Window tabs allows stacks of windows, similar to how a browser tab works, the active tab(window) is the topmost and visible one. That would allow for awesome workflow and less cramped windows.

    Here's stackline from yabai, as reference.

    opened by nodgear 2
  • refactor(windows-rs): upgrade to 0.9.1 and handle all breaking changes

    refactor(windows-rs): upgrade to 0.9.1 and handle all breaking changes

    This was probably the least fun upgrade I've ever done of a dependency. Many imports moved packages, contants were changed to associated constants, and the linker refused to work with wildcards in the build.rs file of the bindings package.

    This commit is the result of patiently going through each error reported by rustc, cross referencing with the new windows-rs docs and updating / making things more semantic where it seemed like the right thing to do.

    I am running this commit locally for a few days to see if any regressions have been introduced, but it seems like everything is alright at first glance.

    opened by LGUG2Z 1
  • Swap windows with mouse

    Swap windows with mouse

    Since the mouse resize WinEvent is shared with mouse moving, I may as well implement a handler for moves where the window that a dragged window is placed over is treated as a swap target.

    opened by LGUG2Z 1
Owner
Jade
Carly Rae Jepsen fanboy @BeameryHQ
Jade
Let Tauri's transparent background rendering window be stacked on Bevy's rendering window in real time to run the game with native-level performance!

Native Bevy with Tauri HUD DEMO 将 Tauri 的透明背景渲染窗口实时叠在 Bevy 的渲染窗口上,以使用原生级别性能运行游戏! Let Tauri's transparent background rendering window be stacked on Bev

伊欧 3 Mar 25, 2024
A scrollable-tiling Wayland compositor.

niri The beginnings of a scrollable-tiling Wayland compositor. Status Heavily work in progress. The occasional thing works, but likely is in a half-br

Ivan Molodetskikh 17 Aug 16, 2023
Rust port of the official Windows Driver Samples on Github. Leverages windows-drivers-rs

Rust Driver Samples This is a Rust port of the driver samples from the original Windows Driver Samples on Github. The repository provides examples and

Microsoft 80 Oct 10, 2023
A program written in Rust, that allows the user to find the current location of the International Space Station and see it on a map.

ISS Location ViewFinder A program written in Rust, that allows the user to find the current location of the International Space Station and see it on

Suvaditya Mukherjee 2 Nov 8, 2021
Removes generated and downloaded files from code projects to free up space

makeclean Removes generated and downloaded files from code projects to free up space. Features: List, cleans and archives projects depending on how lo

Kevin Bader 2 Mar 11, 2022
Cross-platform Window library in Rust for Tauri. [WIP]

Cross-platform application window creation library in Rust that supports all major platforms like Windows, macOS, Linux, iOS and Android. Built for you, maintained for Tauri.

Tauri 899 Jan 1, 2023
Helps insetting the window traffic lights on macOS.

Tauri Plugin Traffic Lights Positioner This plugin helps you set a custom inset for the window controls on macOS. Currently only for Tauri v1.* This i

Ilya 3 Aug 15, 2024
CBOR (binary JSON) for Rust with automatic type based decoding and encoding.

THIS PROJECT IS UNMAINTAINED. USE serde_cbor INSTEAD. This crate provides an implementation of RFC 7049, which specifies Concise Binary Object Represe

Andrew Gallant 121 Dec 27, 2022
🚧 (Alpha stage software) Binary that supports remote filesystem and process operations. 🚧

distant Binary to connect with a remote machine to edit files and run programs. ?? (Alpha stage software) This program is in rapid development and may

Chip Senkbeil 296 Dec 28, 2022
Fast binary serialization with versioning.

BinVerSe (Binary Versioned Serializer) Provides fast binary serialization with versioning to store data in a backwards-compatible, compact way. Right

Linus Dikomey 4 Mar 25, 2022
A swiss army knife for creating binary modules for Garry's Mod in Rust.

A swiss army knife for creating binary modules for Garry's Mod in Rust.

William 38 Dec 24, 2022
Rust+Cargo lightweight hello world with the most minimum binary size possible.

Lightweight Cargo Hello World Rust+Cargo lightweight hello world with the most minimum binary size possible. requirements 1: Rustup (Rustc, Cargo) Ins

Raymond 1 Dec 13, 2021
A dynamic binary tracing tool

Backlight Backlight is a dynamic binary tracing tool. Install $ git clone [email protected]:JoshMcguigan/backlight.git $ cd backlight $ cargo install-b

Josh Mcguigan 42 Dec 3, 2022
Small utility to display hour in a binary format on the Novation's Launchpad X.

lpx-binary-clock Small utility to display hour in a binary format on the Novation's Launchpad X. Hours, minutes and seconds are displayed one digit pe

Alexis LOUIS 1 Feb 13, 2022
Transmute - a binary that works alone or in coordination with coverage formatter to report test quality

Transmute is a binary that works alone or in coordination with coverage formatter to report test quality. It will change your code and make the tests fail. If don't, we will raise it for you.

Victor Antoniazzi 5 Nov 17, 2022
An unofficial and incomplete no_std Rust library for implementing the ElectricUI Binary Protocol

An unofficial and incomplete no_std Rust library for implementing the ElectricUI Binary Protocol

Jon 2 Mar 29, 2022
Nix binary cache implemented in rust using libnix-store

harmonia Build Whole application nix-shell --run cargo b C Library Wrapper around libnixstore nix-shell --run make Note: The makefile is only to pro

Helsinki Systems 84 Dec 24, 2022
A self-contained, single-binary Rust and Leptos application for remote Wake-on-LAN

Remote Wake-on-LAN with Rust and Leptos A self-contained, single-binary Rust and Leptos application serving a web interface to wake another device on

Valentin Bersier 6 Jan 28, 2023
A rewrite of Phonelink for Windows Forms written in Rust, with cross-platform support.

phonelink-rs A rewrite of Phonelink for Windows Forms written in Rust, with cross-platform support. Usage Clone the repository and build, or download

ahsan-a 4 Aug 6, 2022