Creating a Window Manager, Suggestions? 07-18-2017, 02:54 AM
#1
Hey All,
Been working on a side project for the last few weeks (when i'm not actually working my shitty job in PHP).
I'm creating a Window Manager in Rust using the XCB X library. I'm getting sick of WM's not supporting simple function like touch and iffy support for HiDPI monitors (like my laptop), so i decided to build one. Rust was a natural choice since it's fucking amazing.
I'm modeling much of the functionality of i3, since I think that's the best WM out there right now. i3 gets layout management and configuration super correct. I'm new to X myself, so i've been learning along the way. Fortunately, X doesn't seem too complicated.
Here are some features i'm planning to implement once i get the base off the ground:
I've been gathering feedback from Reddit and other places, too. My plan is to make is super easy to customize for n00b ricers as well, with an interactive tutorial to boot (in the future, at least). So far I'm working on the config file, grabbing keys, and events.
Wondering what youall want in a WM. If you want to help work on it, PM me or catch me in Discord

P.S
There's no "Rust" subthread in the coding section, so that's why I put this here, i'm pretty sure this is for more general posts, but if it fits anywhere else feel free to move it, i s'pose
Been working on a side project for the last few weeks (when i'm not actually working my shitty job in PHP).
I'm creating a Window Manager in Rust using the XCB X library. I'm getting sick of WM's not supporting simple function like touch and iffy support for HiDPI monitors (like my laptop), so i decided to build one. Rust was a natural choice since it's fucking amazing.
I'm modeling much of the functionality of i3, since I think that's the best WM out there right now. i3 gets layout management and configuration super correct. I'm new to X myself, so i've been learning along the way. Fortunately, X doesn't seem too complicated.
Here are some features i'm planning to implement once i get the base off the ground:
Spoiler:
Configuration files: Recompiling to add rules for a program is dumb.
Mouse control (goes along with Touch Control; could be a simple option like 'mouse: on' since many people might not want this): would be cool to re-order, drag between monitors, or tab together (see below), still within their tiled constraints, with the mouse. Also dragging divisions between windows to resize them rather than having to use the keyboard for that too. This would still require modifier keys to be held, or a dedicated mouse button or two, of course.
Tabbing: I know awesome/i3 have this but dwm doesn't, and it's a great alternative to having windows stacked up to unusably small heights. Sometimes I think it would be nice to have excess windows automatically tab up, but for now I use a stand-alone x-client which can grab-and-tab arbitrary X clients. Would be nice to have WM integration to just drag a window on to a window and tab them up (kinda like fluxbox can, I think, but within tiled constraints still).
Three column: For tiling fun on ultra-wide monitors. Right now I have a layout with two tiers of "num master" counts, but there's got to be a better way to handle it without going full manual control.
"Tag views": Saves the currently viewed set of tags and the layout of the windows (horizontal splits, relative order, etc.) to what I call a tag view (win+shift+F1 through F12 to save to views A-L, win+F1 through F12 to recall them, win+S to save the current layout to the current tag view, win+Q to drop all chanages since the last save, win+tab to toggle between current/previous view (or current and last saved if there's changes)). These behave closer to the traditional virtual desktop model, but they can still have overlapping tags, and therefore windows, present in each of them. Adds a nice sense of grounding and ability to set up a couple quick layouts to tab between when there's too many windows to leave on-screen (e.g. fullscreen IDE and documentation on view A, browser and debugger on view B, and tabbing between them).
Monitor swapping: Swap all the windows of one monitor with my secondary monitor. Sometimes I have a set of windows open on a second monitor and want to work on it temporarily in more comfort on the primary one.
Animation (possibly)(Edging into compositor territory): Would be cool to have windows slide about like a jquery drag-and-drop demo when they're re-orderded to keep from the instant state changes getting me disoriented, especially when dealing with a lot of similar looking terminals. I also currently like to use a compositor to dim inactive windows to make it more obvious where the focus is without resorting to gaps and borders.
Mouse control (goes along with Touch Control; could be a simple option like 'mouse: on' since many people might not want this): would be cool to re-order, drag between monitors, or tab together (see below), still within their tiled constraints, with the mouse. Also dragging divisions between windows to resize them rather than having to use the keyboard for that too. This would still require modifier keys to be held, or a dedicated mouse button or two, of course.
Tabbing: I know awesome/i3 have this but dwm doesn't, and it's a great alternative to having windows stacked up to unusably small heights. Sometimes I think it would be nice to have excess windows automatically tab up, but for now I use a stand-alone x-client which can grab-and-tab arbitrary X clients. Would be nice to have WM integration to just drag a window on to a window and tab them up (kinda like fluxbox can, I think, but within tiled constraints still).
Three column: For tiling fun on ultra-wide monitors. Right now I have a layout with two tiers of "num master" counts, but there's got to be a better way to handle it without going full manual control.
"Tag views": Saves the currently viewed set of tags and the layout of the windows (horizontal splits, relative order, etc.) to what I call a tag view (win+shift+F1 through F12 to save to views A-L, win+F1 through F12 to recall them, win+S to save the current layout to the current tag view, win+Q to drop all chanages since the last save, win+tab to toggle between current/previous view (or current and last saved if there's changes)). These behave closer to the traditional virtual desktop model, but they can still have overlapping tags, and therefore windows, present in each of them. Adds a nice sense of grounding and ability to set up a couple quick layouts to tab between when there's too many windows to leave on-screen (e.g. fullscreen IDE and documentation on view A, browser and debugger on view B, and tabbing between them).
Monitor swapping: Swap all the windows of one monitor with my secondary monitor. Sometimes I have a set of windows open on a second monitor and want to work on it temporarily in more comfort on the primary one.
Animation (possibly)(Edging into compositor territory): Would be cool to have windows slide about like a jquery drag-and-drop demo when they're re-orderded to keep from the instant state changes getting me disoriented, especially when dealing with a lot of similar looking terminals. I also currently like to use a compositor to dim inactive windows to make it more obvious where the focus is without resorting to gaps and borders.
I've been gathering feedback from Reddit and other places, too. My plan is to make is super easy to customize for n00b ricers as well, with an interactive tutorial to boot (in the future, at least). So far I'm working on the config file, grabbing keys, and events.
Wondering what youall want in a WM. If you want to help work on it, PM me or catch me in Discord

P.S
There's no "Rust" subthread in the coding section, so that's why I put this here, i'm pretty sure this is for more general posts, but if it fits anywhere else feel free to move it, i s'pose
(This post was last modified: 07-18-2017, 03:10 AM by insidious.)
![[Image: pBD38Xq.png]](http://i.imgur.com/pBD38Xq.png)
Email: insidious@protonmail.ch







![[+]](https://sinister.li/images/modern/collapse_collapsed.png)


![[Image: a319ef9581853.560e3236d2b0b.png]](https://mir-s3-cdn-cf.behance.net/project_modules/disp/a319ef9581853.560e3236d2b0b.png)















