Skip to content

Repository files navigation

LightWM

Minimalist Tiling Window Manager for Microsoft Windows

Written with C and Windows API and utilizes existing Windows facilities, resulting in very slim code.

Executable and DLL are very small (<20KB total)

Make sure you place the DLL next to the executable, so it can find it.

Video in which I make the PoC of this project: https://youtu.be/cuPirXZ6AWo

Usage

After building, run the executable lightwm.exe which will reside in the release and/or debug folder, depending on what you built.

Upon running, it will immediately tile all the non-minimized windows on your screen. The program will run in the background.

If you want to configure it to run when you login, you can use the Run utility and type shell:startup, then create a LightWM shortcut in that folder.

Hotkeys

  • alt+q - quit LightWM
  • alt+j - focus on next window
  • alt+k - focus on previous window
  • alt+f - toggle fullscreen mode (disables tiling and puts the focused window in fullscreen, pressing alt+f again will enable tiling again and tile all non-minimized windows)
  • alt+1 up until alt+9 - go to workspace number 1 until 9 respectively
  • You can move the current focused window to a different workspace number by adding shift to the above command.
  • You can "force" retile by using alt+t, you can use this as a trick to send the current focused window to the left.
  • alt+\ toggles whether the automatic tiling is enabled/disabled. This is useful if you also use programs which don't play well with LightWM automatic tiling

Building

You can build using the "x64 Native Tools Command Prompt for VS 2022" that comes with Microsoft Visual Studio Build Tools:

In the console you can run nmake to build according to the Makefile

nmake

I haven't tried building with a different VS version or building x86, but that may work as well.

Contributing

One of my main goals with this project is to keep it as minimal as possible, for example I decided against using a dynamic configuration on purpose.

Thus, make sure to keep the contributions as simple as possible.

If you plan on adding a completely new feature, let's discuss it on the issues beforehand.

Also notice that this project does not use any C library functions on purpose, only Windows API. This keeps everything as minimal as possible.

Coding Conventions

Spacing

Tabs > Spaces

Function and variable names

Functions and variables should be in camelCase

Comments

In general comments should be avoided unless they are absolutely necessary

Avoid adding obvious comments on the code like:

// Prints hello on the screenprintf("Hello!\n");

Avoid comments explaining the logic in other words:

// Allocate memory for the string and for the null terminatormalloc(1024+1);

Instead something like this is much better:

constintnullTermSize=1;
malloc(strlen(path) +nullTermSize);

Example of when a comment is necessary and has added value:

// This DLL is loaded into many processes on the computer, therefore we need to keep the logic here as simple as possible to avoid slowing down the system

Pointers

int* and not int *

for/while/switch/if blocks

Opening braces { in the same line as the block definition

if (cond) {
}

and not:

if (cond)
{
}

Space between the block name and the brackets

if (statement) and not if(statement)

Function blocks

Opening braces { in a new line after the function definition

voidinit()
{
}

and not:

voidinit() {
}

About

Minimalist Tiling Window Manager for Microsoft Windows (<20KB)

Resources

Stars

317 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - nir9/lightwm: Minimalist Tiling Window Manager for Microsoft Windows (<20KB) · GitHub
Skip to content

Repository files navigation

LightWM

Minimalist Tiling Window Manager for Microsoft Windows

Written with C and Windows API and utilizes existing Windows facilities, resulting in very slim code.

Executable and DLL are very small (<20KB total)

Make sure you place the DLL next to the executable, so it can find it.

Video in which I make the PoC of this project: https://youtu.be/cuPirXZ6AWo

Usage

After building, run the executable lightwm.exe which will reside in the release and/or debug folder, depending on what you built.

Upon running, it will immediately tile all the non-minimized windows on your screen. The program will run in the background.

If you want to configure it to run when you login, you can use the Run utility and type shell:startup, then create a LightWM shortcut in that folder.

Hotkeys

  • alt+q - quit LightWM
  • alt+j - focus on next window
  • alt+k - focus on previous window
  • alt+f - toggle fullscreen mode (disables tiling and puts the focused window in fullscreen, pressing alt+f again will enable tiling again and tile all non-minimized windows)
  • alt+1 up until alt+9 - go to workspace number 1 until 9 respectively
  • You can move the current focused window to a different workspace number by adding shift to the above command.
  • You can "force" retile by using alt+t, you can use this as a trick to send the current focused window to the left.
  • alt+\ toggles whether the automatic tiling is enabled/disabled. This is useful if you also use programs which don't play well with LightWM automatic tiling

Building

You can build using the "x64 Native Tools Command Prompt for VS 2022" that comes with Microsoft Visual Studio Build Tools:

In the console you can run nmake to build according to the Makefile

nmake

I haven't tried building with a different VS version or building x86, but that may work as well.

Contributing

One of my main goals with this project is to keep it as minimal as possible, for example I decided against using a dynamic configuration on purpose.

Thus, make sure to keep the contributions as simple as possible.

If you plan on adding a completely new feature, let's discuss it on the issues beforehand.

Also notice that this project does not use any C library functions on purpose, only Windows API. This keeps everything as minimal as possible.

Coding Conventions

Spacing

Tabs > Spaces

Function and variable names

Functions and variables should be in camelCase

Comments

In general comments should be avoided unless they are absolutely necessary

Avoid adding obvious comments on the code like:

// Prints hello on the screenprintf("Hello!\n");

Avoid comments explaining the logic in other words:

// Allocate memory for the string and for the null terminatormalloc(1024+1);

Instead something like this is much better:

constintnullTermSize=1;
malloc(strlen(path) +nullTermSize);

Example of when a comment is necessary and has added value:

// This DLL is loaded into many processes on the computer, therefore we need to keep the logic here as simple as possible to avoid slowing down the system

Pointers

int* and not int *

for/while/switch/if blocks

Opening braces { in the same line as the block definition

if (cond) {
}

and not:

if (cond)
{
}

Space between the block name and the brackets

if (statement) and not if(statement)

Function blocks

Opening braces { in a new line after the function definition

voidinit()
{
}

and not:

voidinit() {
}

About

Minimalist Tiling Window Manager for Microsoft Windows (<20KB)

Resources

Stars

317 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - nir9/lightwm: Minimalist Tiling Window Manager for Microsoft Windows (<20KB) · GitHub
Skip to content

Repository files navigation

LightWM

Minimalist Tiling Window Manager for Microsoft Windows

Written with C and Windows API and utilizes existing Windows facilities, resulting in very slim code.

Executable and DLL are very small (<20KB total)

Make sure you place the DLL next to the executable, so it can find it.

Video in which I make the PoC of this project: https://youtu.be/cuPirXZ6AWo

Usage

After building, run the executable lightwm.exe which will reside in the release and/or debug folder, depending on what you built.

Upon running, it will immediately tile all the non-minimized windows on your screen. The program will run in the background.

If you want to configure it to run when you login, you can use the Run utility and type shell:startup, then create a LightWM shortcut in that folder.

Hotkeys

  • alt+q - quit LightWM
  • alt+j - focus on next window
  • alt+k - focus on previous window
  • alt+f - toggle fullscreen mode (disables tiling and puts the focused window in fullscreen, pressing alt+f again will enable tiling again and tile all non-minimized windows)
  • alt+1 up until alt+9 - go to workspace number 1 until 9 respectively
  • You can move the current focused window to a different workspace number by adding shift to the above command.
  • You can "force" retile by using alt+t, you can use this as a trick to send the current focused window to the left.
  • alt+\ toggles whether the automatic tiling is enabled/disabled. This is useful if you also use programs which don't play well with LightWM automatic tiling

Building

You can build using the "x64 Native Tools Command Prompt for VS 2022" that comes with Microsoft Visual Studio Build Tools:

In the console you can run nmake to build according to the Makefile

nmake

I haven't tried building with a different VS version or building x86, but that may work as well.

Contributing

One of my main goals with this project is to keep it as minimal as possible, for example I decided against using a dynamic configuration on purpose.

Thus, make sure to keep the contributions as simple as possible.

If you plan on adding a completely new feature, let's discuss it on the issues beforehand.

Also notice that this project does not use any C library functions on purpose, only Windows API. This keeps everything as minimal as possible.

Coding Conventions

Spacing

Tabs > Spaces

Function and variable names

Functions and variables should be in camelCase

Comments

In general comments should be avoided unless they are absolutely necessary

Avoid adding obvious comments on the code like:

// Prints hello on the screenprintf("Hello!\n");

Avoid comments explaining the logic in other words:

// Allocate memory for the string and for the null terminatormalloc(1024+1);

Instead something like this is much better:

constintnullTermSize=1;
malloc(strlen(path) +nullTermSize);

Example of when a comment is necessary and has added value:

// This DLL is loaded into many processes on the computer, therefore we need to keep the logic here as simple as possible to avoid slowing down the system

Pointers

int* and not int *

for/while/switch/if blocks

Opening braces { in the same line as the block definition

if (cond) {
}

and not:

if (cond)
{
}

Space between the block name and the brackets

if (statement) and not if(statement)

Function blocks

Opening braces { in a new line after the function definition

voidinit()
{
}

and not:

voidinit() {
}

About

Minimalist Tiling Window Manager for Microsoft Windows (<20KB)

Resources

Stars

317 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - nir9/lightwm: Minimalist Tiling Window Manager for Microsoft Windows (<20KB) · GitHub
Skip to content

Repository files navigation

LightWM

Minimalist Tiling Window Manager for Microsoft Windows

Written with C and Windows API and utilizes existing Windows facilities, resulting in very slim code.

Executable and DLL are very small (<20KB total)

Make sure you place the DLL next to the executable, so it can find it.

Video in which I make the PoC of this project: https://youtu.be/cuPirXZ6AWo

Usage

After building, run the executable lightwm.exe which will reside in the release and/or debug folder, depending on what you built.

Upon running, it will immediately tile all the non-minimized windows on your screen. The program will run in the background.

If you want to configure it to run when you login, you can use the Run utility and type shell:startup, then create a LightWM shortcut in that folder.

Hotkeys

  • alt+q - quit LightWM
  • alt+j - focus on next window
  • alt+k - focus on previous window
  • alt+f - toggle fullscreen mode (disables tiling and puts the focused window in fullscreen, pressing alt+f again will enable tiling again and tile all non-minimized windows)
  • alt+1 up until alt+9 - go to workspace number 1 until 9 respectively
  • You can move the current focused window to a different workspace number by adding shift to the above command.
  • You can "force" retile by using alt+t, you can use this as a trick to send the current focused window to the left.
  • alt+\ toggles whether the automatic tiling is enabled/disabled. This is useful if you also use programs which don't play well with LightWM automatic tiling

Building

You can build using the "x64 Native Tools Command Prompt for VS 2022" that comes with Microsoft Visual Studio Build Tools:

In the console you can run nmake to build according to the Makefile

nmake

I haven't tried building with a different VS version or building x86, but that may work as well.

Contributing

One of my main goals with this project is to keep it as minimal as possible, for example I decided against using a dynamic configuration on purpose.

Thus, make sure to keep the contributions as simple as possible.

If you plan on adding a completely new feature, let's discuss it on the issues beforehand.

Also notice that this project does not use any C library functions on purpose, only Windows API. This keeps everything as minimal as possible.

Coding Conventions

Spacing

Tabs > Spaces

Function and variable names

Functions and variables should be in camelCase

Comments

In general comments should be avoided unless they are absolutely necessary

Avoid adding obvious comments on the code like:

// Prints hello on the screenprintf("Hello!\n");

Avoid comments explaining the logic in other words:

// Allocate memory for the string and for the null terminatormalloc(1024+1);

Instead something like this is much better:

constintnullTermSize=1;
malloc(strlen(path) +nullTermSize);

Example of when a comment is necessary and has added value:

// This DLL is loaded into many processes on the computer, therefore we need to keep the logic here as simple as possible to avoid slowing down the system

Pointers

int* and not int *

for/while/switch/if blocks

Opening braces { in the same line as the block definition

if (cond) {
}

and not:

if (cond)
{
}

Space between the block name and the brackets

if (statement) and not if(statement)

Function blocks

Opening braces { in a new line after the function definition

voidinit()
{
}

and not:

voidinit() {
}

About

Minimalist Tiling Window Manager for Microsoft Windows (<20KB)

Resources

Stars

317 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - nir9/lightwm: Minimalist Tiling Window Manager for Microsoft Windows (<20KB) · GitHub
Skip to content

Repository files navigation

LightWM

Minimalist Tiling Window Manager for Microsoft Windows

Written with C and Windows API and utilizes existing Windows facilities, resulting in very slim code.

Executable and DLL are very small (<20KB total)

Make sure you place the DLL next to the executable, so it can find it.

Video in which I make the PoC of this project: https://youtu.be/cuPirXZ6AWo

Usage

After building, run the executable lightwm.exe which will reside in the release and/or debug folder, depending on what you built.

Upon running, it will immediately tile all the non-minimized windows on your screen. The program will run in the background.

If you want to configure it to run when you login, you can use the Run utility and type shell:startup, then create a LightWM shortcut in that folder.

Hotkeys

  • alt+q - quit LightWM
  • alt+j - focus on next window
  • alt+k - focus on previous window
  • alt+f - toggle fullscreen mode (disables tiling and puts the focused window in fullscreen, pressing alt+f again will enable tiling again and tile all non-minimized windows)
  • alt+1 up until alt+9 - go to workspace number 1 until 9 respectively
  • You can move the current focused window to a different workspace number by adding shift to the above command.
  • You can "force" retile by using alt+t, you can use this as a trick to send the current focused window to the left.
  • alt+\ toggles whether the automatic tiling is enabled/disabled. This is useful if you also use programs which don't play well with LightWM automatic tiling

Building

You can build using the "x64 Native Tools Command Prompt for VS 2022" that comes with Microsoft Visual Studio Build Tools:

In the console you can run nmake to build according to the Makefile

nmake

I haven't tried building with a different VS version or building x86, but that may work as well.

Contributing

One of my main goals with this project is to keep it as minimal as possible, for example I decided against using a dynamic configuration on purpose.

Thus, make sure to keep the contributions as simple as possible.

If you plan on adding a completely new feature, let's discuss it on the issues beforehand.

Also notice that this project does not use any C library functions on purpose, only Windows API. This keeps everything as minimal as possible.

Coding Conventions

Spacing

Tabs > Spaces

Function and variable names

Functions and variables should be in camelCase

Comments

In general comments should be avoided unless they are absolutely necessary

Avoid adding obvious comments on the code like:

// Prints hello on the screenprintf("Hello!\n");

Avoid comments explaining the logic in other words:

// Allocate memory for the string and for the null terminatormalloc(1024+1);

Instead something like this is much better:

constintnullTermSize=1;
malloc(strlen(path) +nullTermSize);

Example of when a comment is necessary and has added value:

// This DLL is loaded into many processes on the computer, therefore we need to keep the logic here as simple as possible to avoid slowing down the system

Pointers

int* and not int *

for/while/switch/if blocks

Opening braces { in the same line as the block definition

if (cond) {
}

and not:

if (cond)
{
}

Space between the block name and the brackets

if (statement) and not if(statement)

Function blocks

Opening braces { in a new line after the function definition

voidinit()
{
}

and not:

voidinit() {
}

About

Minimalist Tiling Window Manager for Microsoft Windows (<20KB)

Resources

Stars

317 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - nir9/lightwm: Minimalist Tiling Window Manager for Microsoft Windows (<20KB) · GitHub
Skip to content

Repository files navigation

LightWM

Minimalist Tiling Window Manager for Microsoft Windows

Written with C and Windows API and utilizes existing Windows facilities, resulting in very slim code.

Executable and DLL are very small (<20KB total)

Make sure you place the DLL next to the executable, so it can find it.

Video in which I make the PoC of this project: https://youtu.be/cuPirXZ6AWo

Usage

After building, run the executable lightwm.exe which will reside in the release and/or debug folder, depending on what you built.

Upon running, it will immediately tile all the non-minimized windows on your screen. The program will run in the background.

If you want to configure it to run when you login, you can use the Run utility and type shell:startup, then create a LightWM shortcut in that folder.

Hotkeys

  • alt+q - quit LightWM
  • alt+j - focus on next window
  • alt+k - focus on previous window
  • alt+f - toggle fullscreen mode (disables tiling and puts the focused window in fullscreen, pressing alt+f again will enable tiling again and tile all non-minimized windows)
  • alt+1 up until alt+9 - go to workspace number 1 until 9 respectively
  • You can move the current focused window to a different workspace number by adding shift to the above command.
  • You can "force" retile by using alt+t, you can use this as a trick to send the current focused window to the left.
  • alt+\ toggles whether the automatic tiling is enabled/disabled. This is useful if you also use programs which don't play well with LightWM automatic tiling

Building

You can build using the "x64 Native Tools Command Prompt for VS 2022" that comes with Microsoft Visual Studio Build Tools:

In the console you can run nmake to build according to the Makefile

nmake

I haven't tried building with a different VS version or building x86, but that may work as well.

Contributing

One of my main goals with this project is to keep it as minimal as possible, for example I decided against using a dynamic configuration on purpose.

Thus, make sure to keep the contributions as simple as possible.

If you plan on adding a completely new feature, let's discuss it on the issues beforehand.

Also notice that this project does not use any C library functions on purpose, only Windows API. This keeps everything as minimal as possible.

Coding Conventions

Spacing

Tabs > Spaces

Function and variable names

Functions and variables should be in camelCase

Comments

In general comments should be avoided unless they are absolutely necessary

Avoid adding obvious comments on the code like:

// Prints hello on the screenprintf("Hello!\n");

Avoid comments explaining the logic in other words:

// Allocate memory for the string and for the null terminatormalloc(1024+1);

Instead something like this is much better:

constintnullTermSize=1;
malloc(strlen(path) +nullTermSize);

Example of when a comment is necessary and has added value:

// This DLL is loaded into many processes on the computer, therefore we need to keep the logic here as simple as possible to avoid slowing down the system

Pointers

int* and not int *

for/while/switch/if blocks

Opening braces { in the same line as the block definition

if (cond) {
}

and not:

if (cond)
{
}

Space between the block name and the brackets

if (statement) and not if(statement)

Function blocks

Opening braces { in a new line after the function definition

voidinit()
{
}

and not:

voidinit() {
}

About

Minimalist Tiling Window Manager for Microsoft Windows (<20KB)

Resources

Stars

317 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - nir9/lightwm: Minimalist Tiling Window Manager for Microsoft Windows (<20KB) · GitHub
Skip to content

Repository files navigation

LightWM

Minimalist Tiling Window Manager for Microsoft Windows

Written with C and Windows API and utilizes existing Windows facilities, resulting in very slim code.

Executable and DLL are very small (<20KB total)

Make sure you place the DLL next to the executable, so it can find it.

Video in which I make the PoC of this project: https://youtu.be/cuPirXZ6AWo

Usage

After building, run the executable lightwm.exe which will reside in the release and/or debug folder, depending on what you built.

Upon running, it will immediately tile all the non-minimized windows on your screen. The program will run in the background.

If you want to configure it to run when you login, you can use the Run utility and type shell:startup, then create a LightWM shortcut in that folder.

Hotkeys

  • alt+q - quit LightWM
  • alt+j - focus on next window
  • alt+k - focus on previous window
  • alt+f - toggle fullscreen mode (disables tiling and puts the focused window in fullscreen, pressing alt+f again will enable tiling again and tile all non-minimized windows)
  • alt+1 up until alt+9 - go to workspace number 1 until 9 respectively
  • You can move the current focused window to a different workspace number by adding shift to the above command.
  • You can "force" retile by using alt+t, you can use this as a trick to send the current focused window to the left.
  • alt+\ toggles whether the automatic tiling is enabled/disabled. This is useful if you also use programs which don't play well with LightWM automatic tiling

Building

You can build using the "x64 Native Tools Command Prompt for VS 2022" that comes with Microsoft Visual Studio Build Tools:

In the console you can run nmake to build according to the Makefile

nmake

I haven't tried building with a different VS version or building x86, but that may work as well.

Contributing

One of my main goals with this project is to keep it as minimal as possible, for example I decided against using a dynamic configuration on purpose.

Thus, make sure to keep the contributions as simple as possible.

If you plan on adding a completely new feature, let's discuss it on the issues beforehand.

Also notice that this project does not use any C library functions on purpose, only Windows API. This keeps everything as minimal as possible.

Coding Conventions

Spacing

Tabs > Spaces

Function and variable names

Functions and variables should be in camelCase

Comments

In general comments should be avoided unless they are absolutely necessary

Avoid adding obvious comments on the code like:

// Prints hello on the screenprintf("Hello!\n");

Avoid comments explaining the logic in other words:

// Allocate memory for the string and for the null terminatormalloc(1024+1);

Instead something like this is much better:

constintnullTermSize=1;
malloc(strlen(path) +nullTermSize);

Example of when a comment is necessary and has added value:

// This DLL is loaded into many processes on the computer, therefore we need to keep the logic here as simple as possible to avoid slowing down the system

Pointers

int* and not int *

for/while/switch/if blocks

Opening braces { in the same line as the block definition

if (cond) {
}

and not:

if (cond)
{
}

Space between the block name and the brackets

if (statement) and not if(statement)

Function blocks

Opening braces { in a new line after the function definition

voidinit()
{
}

and not:

voidinit() {
}

About

Minimalist Tiling Window Manager for Microsoft Windows (<20KB)

Resources

Stars

317 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - nir9/lightwm: Minimalist Tiling Window Manager for Microsoft Windows (<20KB) · GitHub
Skip to content

Repository files navigation

LightWM

Minimalist Tiling Window Manager for Microsoft Windows

Written with C and Windows API and utilizes existing Windows facilities, resulting in very slim code.

Executable and DLL are very small (<20KB total)

Make sure you place the DLL next to the executable, so it can find it.

Video in which I make the PoC of this project: https://youtu.be/cuPirXZ6AWo

Usage

After building, run the executable lightwm.exe which will reside in the release and/or debug folder, depending on what you built.

Upon running, it will immediately tile all the non-minimized windows on your screen. The program will run in the background.

If you want to configure it to run when you login, you can use the Run utility and type shell:startup, then create a LightWM shortcut in that folder.

Hotkeys

  • alt+q - quit LightWM
  • alt+j - focus on next window
  • alt+k - focus on previous window
  • alt+f - toggle fullscreen mode (disables tiling and puts the focused window in fullscreen, pressing alt+f again will enable tiling again and tile all non-minimized windows)
  • alt+1 up until alt+9 - go to workspace number 1 until 9 respectively
  • You can move the current focused window to a different workspace number by adding shift to the above command.
  • You can "force" retile by using alt+t, you can use this as a trick to send the current focused window to the left.
  • alt+\ toggles whether the automatic tiling is enabled/disabled. This is useful if you also use programs which don't play well with LightWM automatic tiling

Building

You can build using the "x64 Native Tools Command Prompt for VS 2022" that comes with Microsoft Visual Studio Build Tools:

In the console you can run nmake to build according to the Makefile

nmake

I haven't tried building with a different VS version or building x86, but that may work as well.

Contributing

One of my main goals with this project is to keep it as minimal as possible, for example I decided against using a dynamic configuration on purpose.

Thus, make sure to keep the contributions as simple as possible.

If you plan on adding a completely new feature, let's discuss it on the issues beforehand.

Also notice that this project does not use any C library functions on purpose, only Windows API. This keeps everything as minimal as possible.

Coding Conventions

Spacing

Tabs > Spaces

Function and variable names

Functions and variables should be in camelCase

Comments

In general comments should be avoided unless they are absolutely necessary

Avoid adding obvious comments on the code like:

// Prints hello on the screenprintf("Hello!\n");

Avoid comments explaining the logic in other words:

// Allocate memory for the string and for the null terminatormalloc(1024+1);

Instead something like this is much better:

constintnullTermSize=1;
malloc(strlen(path) +nullTermSize);

Example of when a comment is necessary and has added value:

// This DLL is loaded into many processes on the computer, therefore we need to keep the logic here as simple as possible to avoid slowing down the system

Pointers

int* and not int *

for/while/switch/if blocks

Opening braces { in the same line as the block definition

if (cond) {
}

and not:

if (cond)
{
}

Space between the block name and the brackets

if (statement) and not if(statement)

Function blocks

Opening braces { in a new line after the function definition

voidinit()
{
}

and not:

voidinit() {
}

About

Minimalist Tiling Window Manager for Microsoft Windows (<20KB)

Resources

Stars

317 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages