ArchLabs Linux

Yaxwm

I’ve been working on a window manager since Dec 2019 and it’s finally at a point where I feel ok making it public. Even though I am using it as my daily driver this should still be considered very alpha software and you should expect issues/unwanted behaviour, if you do experience this please post an issue here on or on the tracker linked below, I use a limited set of applications so many issues will go unnoticed unless others bring them to my attention.

https://bitbucket.org/natemaia/yaxwm

Summary

It’s a dynamic, layout based tiling window manager, loosely based off dwm (from scratch, not forked) so you kinda know what to expect. yax has more features and supports more freedesktop standards so integration with other programs should be less problematic.

Some noteworthy features are:

  • Traditional workspaces, each is assigned a monitor, each monitor can have 1-n workspaces
    assigned, where n = num workspaces / num monitors.

  • RANDR extension support for multi-monitor setups.

  • Regex based client window matching and callback function support.

  • Dynamic gaps and borders, meaning they can be changed on the fly.

  • No built-in bar, no text drawing, and no window title support (whether this is a feature or not is up to you).

  • Master/dual-stack with dynamic stack, eg. for a workspace with 6 windows, nmaster set to 1 and nstack set to 2, we would get:

-------------------
|       |    | s2 |
|       | s1 |----|
|   M   |----| s2 |
|       | s1 |----|
|       |    | s2 |
-------------------

Check the project README for installation instructions and more info.

I’ll continue to update this post as things change.


Known Issues/ Things being worked on:

  • Moving windows around with keybinds for both floating and tiled windows (currently all we have is swapping clients to/from master) Partially complete, tiled windows can be moved around

  • Better support for bars displaying the correct windows/workspace on the correct monitor regardless of whether it’s active or not.

  • _NET_ACTIVE_WINDOW client messages from another managed window currently have a focus/stacking order error eg. steam client on one workspace with friends window on another, then activate friends with the button inside the steam client, the workspace will switch, but the friends window isn’t drawn.


Hacking

I learned almost everything I know about window management from dwm and that was only possible because of how short and well written it is, I’m doing my best to keep yax like that. Currently, yaxwm.c is around 2000 sloc, it’s not limited to that and I like features as much as the next guy but keeping it short and understandable is crucial.


Questions/Issues

Make a post here or on the issue tracker.

8 Likes

@natemaia have you tried it on a non-arch base? If you’d like, I will give it a go on MXLinux (assuming I can install it and get it off the ground).

1 Like

You don’t need to ask to try it. Please test and report if any issues.

1 Like

What @dimaom said, should work on any system with the xcb library

Back to what we were talking about:

    win.show_all()
    gdk_win = Gtk.Widget.get_window(win)
    gdk_win.set_override_redirect(True)

Possibly I’m doing something wrong, but this stops my window from being shown at all on X11, and throws numerous warnings on sway.

What I actually need, is just to make the overlay window borderless. Is there a way to set border width 0 to a single window in yaxwm?

Kinda messy but you could use a callback function in the config.h, something like

noborder(Client *c)
{
    resizehint(c, c->x, c->y, c->w, c->h, (c->bw = 0), 0);
/* use resize(c, c->x, c->y, c->w, c->h, (c->bw = 0)); 
* if you don't care about size hints and want to just force a resize */
}

....
Rule rules[] = {
...
    /*  match,        monitor,  workspace, floating, callback */
    { "^somestring$",  NULL,      -1,         1,      noborder},
}

I can’t really recommend doing something like this as a standard approach for applications though, let me do a little looking into pygobject and see what I can find.

1 Like

Compiles and runs without any issues on Void.

One trivial annoyance - on a Toshiba laptop, I get that default, fugly right mouse arrow (bspwm does the same thing).

Adding:

xsetroot -cursor_name left_ptr

to the startup script fixes the problem.

1 Like

I was wondering if you were going to attempt implementing iconify in some way.

My 2 cents: while moving the mouse pointer from one display to another, after leaving screen_0, it appears in the center of screen_1, instead of the proper margin.

Top @natemaia . Thx for the work.

2 Likes

This shouldn’t happen when moving the mouse, the pointer is warped only when the workspace entered is on a different monitor and the switch was not caused by the user moving the mouse.

Just pushed the fix for it, thanks for the catch.

1 Like

I confirm: works well now.

1 Like

Just cloned version: dragging windows between displays (including Alacritty) works properly.

1 Like

Very nice, was meaning to test that out.

1 Like

Question: is there an equivalent to killclient to use from CLI?

xkill?

Sadly i can’t like this post as many times as i want. So happy about discovering yaxwm and this community. Using it daily, includes all i need, growing according our goals. What can be better? Maybe thoughts reading interface, which will project to my eye nerve, using tiling and controlled based on eye guestures? Who knows. Will see quite soon. Stay tuned.

2 Likes

Sadly no, currently there is no way to interact with/use internal functions aside from bindings, key word being currently. I’ve got something in the works but it will be a bit before it’s at a point where I’ll “release” it.

Until then: Most applications will have means of closing themselves, exit for terminals, dropdown menus for most others, for those that don’t we’re stuck with xkill as @dimaom said or I generally use pkill.

Nothing urgent. Just wanted to configure the exit menu with sgtk-bar. But I must say this: i3-msg and swaymsg are the greatest invention since the invention of the wheel. :wink:

A few short videos showcasing some recent work, still in initial stages and only limited options available.

Edit: Sorry, I just realized how shit the compression is on those after uploading, won’t waste my time with imgur for vids again.

3 Likes