n

Nacwm

b7a0a1flibrary

Nearly A Compliant Window Manager

0 stars0 forks0BSDupdated 2 weeks ago
Open repo

Nacwm

What’s

Nearly A Compliant Window Manager

This is just my daily-drive Window Manager

In its core it’s a port of dwm to Odin with a few changes in how things are done, more and less

Note
This is pretty much a personal repo made public in case someone finds it some use. There will be sporadic commits and no releases. Also, my config is here rather than sensible defaults
Note
This repo includes Odin’s vendor:x11/xlib package with some modifications given some bindings were incorrect (and thus unusable) and I wanted this to compile with whatever odin version different distros may come with

How to

Compile / Run

odin build nacwm

Then just exec it in your .xinitrc or whatever your Display Manager wants you to do

Config

Copy nacwm/config.def.odin into nacwm/config.odin, remove the #+ignore line at the top, and edit till you get something usable

Note
That’s my personal config right there so unless we have the same programs, username, and keyboard layout (I use Colemak-DH btw) it’ll be quite unusable

Changes from dwm

Features

  • A bunch of features were omitted due to me not needing/caring about them

  • A bunch of features were added due to me needing/caring about them

++

  • Restart

    • Just a simple execvp()

  • Preserve on restart

    • On restart, saves client data on a property which is loaded after

  • Resize corners

    • Similar to resizecorners but without warping the cursor because why would you

  • Any click type ( clkanywhere patch )

  • Resize anchors

    • Ensure a floating window doesn’t move from an anchored corner when it asks to be resized (doesn’t affect user resize)

    • There’s currently no visual indicator for them so just rember

  • IPC

    • May be controlled by setting the _NACWM_COMMAND property on the root window. Check nacwm/ipc.odin for details

  • NOTIFICATION_CLASS

    • Windows won’t be raised over the window defined as NOTIFICATION_CLASS

  • Keybind to center floating window

  • Keybind to unkindly kill windows (they sometimes misbehave)

  • Restricting/Associating certain tags to a monitor

--

  • Sizehints on tiled resizals (Not planned; who uses this?)

  • Urgency hint (Very likely adding soon)

  • Ratio-preserving resizals (Kinda planned, I don’t care too much about it)

  • Increment resizals (I don’t care about this for now)

  • Bar showing window title (I don’t really need it)

  • A bunch of click types (Won’t be using for now)

  • NMaster (I only ever use one)

  • Selecting previous set of tags (I don’t use this)

~~

  • Rather than zooming a client to master, you swap it with another given an offset

  • Moving between monitors is absolute rather than relative

  • Assumes windows send absolute coordinates rather than relative to monitor (most windows sent absolute from what I observed; dwm hid this by centering the window, which happened often)

  • When moving a client to another Monitor, it’s not zoom'd (more of an implementation detail than a conscious change)

Internal

  • Prefers [dynamic]T instead of linked lists

  • Clients are identified with an index into a global array of clients (g_clients)

  • Clients have a monitor field rather than Monitors having a list of clients

  • Split into multiple files (without much logic, really, since I grep the entire thing anyways)

  • Stacking is much more minimalistic (windows are raised on click when floating, buried below the bar on tile)

  • There’s only one focused Client, rather than a focused Client per Monitor; focus/unfocus logic was also changed quite a bit

  • The bar is drawn with cairo and pango which introduces huge dependencies but it’s just simpler code

Bugs

  • None I think

Thank

  • dwm: For being the base of this project

  • dwm-commented: For helping me decipher what was going on

Package Info
Version
b7a0a1f
License
0BSD
Author
@Nahuel2998
Type
library
Forks
0
Created
5 months ago
Updated
2 weeks ago
Health
maintained
has releases
has readme
has license
Activity
last 56 weeks