Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Steps to reproduce the behavior:
If applicable, add screenshots to help explain your problem.

**Information (please complete the following):**
- Tiling Shell version: [e.g. v9.0]
- Tiling Shell version: [e.g. v15.0]
- GNOME version: [e.g. 42, 46]. If you don't know, run `gnome-shell --version`

**Additional context**
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

[![release](https://img.shields.io/badge/Release_v16-blue?style=for-the-badge)]([https://ko-fi.com/domferr](https://github.com/domferr/tilingshell/releases))
![](https://img.shields.io/github/license/domferr/tilingshell?style=for-the-badge)
![](https://img.shields.io/badge/GNOME-42--49-e04196?style=for-the-badge&logo=gnome&logoColor=white)
![](https://img.shields.io/badge/GNOME-42--50-e04196?style=for-the-badge&logo=gnome&logoColor=white)
[![kofi](https://img.shields.io/badge/Donate_on_Ko--fi-purple?logo=ko-fi&style=for-the-badge)](https://ko-fi.com/domferr)
[![patreon](https://img.shields.io/badge/Patreon-F96854?style=for-the-badge&logo=patreon&logoColor=white)](https://patreon.com/domferr)

# Tiling Shell #

This is a Gnome Shell extension implementing modern windows tiling system by extending GNOME's default 2 columns to any layout you want! Can be installed on Gnome Shells from **42 to 49** on X11 and Wayland: the most recent GNOME Shell is supported, and older releases will include all the features and bug fixes!
This is a Gnome Shell extension implementing modern windows tiling system by extending GNOME's default 2 columns to any layout you want! Can be installed on Gnome Shells from **42 to 50** on X11 and Wayland: the most recent GNOME Shell is supported, and older releases will include all the features and bug fixes!

- 🤩 First and only extension that provides Windows 11's **snap assistant**
- 🖥️🖥️ **multiple monitors support**, even with different scaling factors!
Expand All @@ -26,7 +26,7 @@ This is a Gnome Shell extension implementing modern windows tiling system by ext

<details>
<summary><span align="center">See here the video overview</span></summary>

https://github.com/user-attachments/assets/2905f0a1-ecd4-47b5-a6bc-59f91716e685
</details>

Expand All @@ -38,7 +38,7 @@ Have issues, you want to suggest a new feature or contribute? Please open a new
|:---|:---|:---|:---|
| [⬇️](#layout-editor) **Layout editor** | [⬇️](#smart-resize) **Smart resize** | [⬇️](#tile-with-keyboard) **Tile with Keyboard** | [⬇️](#edge-tiling) **Edge Tiling** |
| [⬇️](#tiling-buttons) **Tiling Buttons** | [⬇️](#per-workspace-layout) **Per-workspace layout** | [⬇️](#auto-tiling) **Auto-tiling** | [⬇️](#tiling-context-menu) **Tiling context menu** |
| [⬇️](#smart-border-radius) **Smart border radius** | [⬇️](#windows-suggestions) **Windows Suggestions**
| [⬇️](#smart-border-radius) **Smart border radius** | [⬇️](#windows-suggestions) **Windows Suggestions**

## 🎉🎉 Tiling Shell's AWESOME Supporters!
Thank you to the :star2: **amazing** <a href="https://patreon.com/domferr"><img src="https://img.shields.io/badge/Patreons-F96854?logo=patreon&logoColor=white)" height="14px"/><a/> and **everyone** who donated on <a href="https://ko-fi.com/domferr"><img src="https://img.shields.io/badge/_Ko--fi-794bc4?logo=ko-fi&logoColor=white" height="14px"/><a/>! :medal_sports:Sean, Markus Huggler, Kostja Palović, Mike Empey, Miguel and Jesse Dhillon on Patreon:medal_sports: and Zorin OS, Nick, thy-fi, iatanas0v, Chris, wbezs, DaneshManoharan, Tamas, Ivan Banha and many more on Ko-fi! You are on a mission to **make Linux window management better for everyone**!
Expand Down Expand Up @@ -179,7 +179,7 @@ https://github.com/user-attachments/assets/fbf68458-199d-490b-90cf-3e976d5b511b

_Can I choose to opt in or out?_

Yes. From the extension's preferences you find a section called Windows Suggestions. You can enable and disable windows suggestions for tiling system, snap assistant and screen edges. You can choose which of the three to keep enabled, or all of them, to personalize for your needs and preferences.
Yes. From the extension's preferences you find a section called Windows Suggestions. You can enable and disable windows suggestions for tiling system, snap assistant and screen edges. You can choose which of the three to keep enabled, or all of them, to personalize for your needs and preferences.

<p align="right"><b>Go to Usage</b> <a href="#usage">⬆️</a></p>

Expand All @@ -206,7 +206,7 @@ Clone the repo then run ```npm i``` to install dependencies and then run ```npm
npm run install:extension
```
You can restart your GNOME shell e.g. logout then login, or restart in place with an `alt-F2` and entering `r` (X11 only) and enable the extension. Enjoy it!
To enable via the command line you can run
To enable via the command line you can run
```bash
/usr/bin/gnome-extensions enable tilingshell@ferrarodomenico.com
```
Expand All @@ -224,7 +224,7 @@ journalctl -f -o cat /usr/bin/gjs
```
### Uninstall Tiling Shell

To uninstall, first disable the extension and then remove it. To disable via the command line you can run
To uninstall, first disable the extension and then remove it. To disable via the command line you can run
```bash
/usr/bin/gnome-extensions disable tilingshell@ferrarodomenico.com
```
Expand Down
9 changes: 4 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tilingshell",
"version": "17.3",
"version": "18.0",
"author": "Domenico Ferraro <ferraro.domenico125@gmail.com>",
"private": true,
"license": "GPL v2.0",
Expand Down Expand Up @@ -41,14 +41,13 @@
"@babel/generator": "^7.28.3",
"@babel/parser": "^7.28.4",
"@babel/traverse": "^7.28.4",
"esbuild": "^0.25.10",
"esbuild-sass-plugin": "^3.3.1",
"esbuild": "^0.27.2",
"esbuild-sass-plugin": "^3.6.0",
"eslint": "^9.39.1",
"eslint-config-prettier": "^10.1.8",
"@typescript-eslint/eslint-plugin": "^8.48.0",
"@typescript-eslint/parser": "^8.48.0",
"glob": "^11.0.3",
"globals": "^16.4.0",
"glob": "^13.0.0",
"prettier": "^3.7.3",
"typescript": "^5.9.2"
},
Expand Down
Binary file modified resources/locale/fr/LC_MESSAGES/tilingshell.mo
Binary file not shown.
5 changes: 3 additions & 2 deletions resources/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@
"46",
"47",
"48",
"49"
"49",
"50"
],
"version": 99,
"version-name": "17.3",
"version-name": "18.0",
"url": "https://github.com/domferr/tilingshell",
"settings-schema": "org.gnome.shell.extensions.tilingshell",
"gettext-domain": "tilingshell",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,10 @@
<default><![CDATA[['']]]></default>
<summary>Untile the focused window</summary>
</key>
<key type="as" name="untile-all-windows">
<default><![CDATA[['']]]></default>
<summary>Untile all windows from current workspace</summary>
</key>
<key type="as" name="move-window-center">
<default><![CDATA[['']]]></default>
<summary>Move the focused window to the center of the screen</summary>
Expand Down
6 changes: 4 additions & 2 deletions src/components/tilingsystem/tilingManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -580,10 +580,12 @@ export class TilingManager {
mask = Clutter.ModifierType.MOD1_MASK;
break;
case ActivationKey.SUPER:
mask = Clutter.ModifierType.SUPER_MASK;
// global.get_pointer() returns MOD4_MASK for the Super key,
// not SUPER_MASK (which has a different bit position).
mask = Clutter.ModifierType.MOD4_MASK;
break;
}
return (modifier & mask) === mask;
return (modifier & mask) !== 0;
}

private _onMovingWindow(window: Meta.Window, grabOp: number) {
Expand Down
29 changes: 29 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,11 @@ export default class TilingShellExtension extends Extension {
'untile-window',
this._onKeyboardUntileWindow.bind(this),
);
this._signals.connect(
this._keybindings,
'untile-all-windows',
this._onKeyboardUntileAllWindows.bind(this),
);
this._signals.connect(
this._keybindings,
'move-window-center',
Expand Down Expand Up @@ -746,6 +751,30 @@ export default class TilingShellExtension extends Extension {

monitorTilingManager.onUntileWindow(focus_window, true);
}

private _onKeyboardUntileAllWindows(kb: KeyBindings, display: Meta.Display) {
getWindows().forEach((extWin) => {
if (extWin && !extWin.minimized && (extWin as ExtendedWindow).assignedTile) {
if (
extWin.windowType !== Meta.WindowType.NORMAL ||
(extWin.get_wm_class() &&
extWin.get_wm_class() === 'gjs')
)
return;
// if the window is maximized, unmaximize it
if (
extWin.maximizedHorizontally ||
extWin.maximizedVertically
)
unmaximizeWindow(extWin);
const monitorTilingManager =
this._tilingManagers[extWin.get_monitor()];
if (!monitorTilingManager) return;

monitorTilingManager.onUntileWindow(extWin, true);
}
});
}

private _isFractionalScalingEnabled(
_mutterSettings: Gio.Settings,
Expand Down
26 changes: 26 additions & 0 deletions src/indicator/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,32 @@ export const createButton = (
return btn;
};

/**
* Creates a styled St.Button containing an icon suited for use in an indicator/toolbar.
*
* The returned button is pre-configured with:
* - styleClass: "message-list-clear-button button"
* - canFocus: true
* - xExpand: true
* - child: an St.BoxLayout (center-aligned, reactive, clipToAllocation)
*
* The icon is created as an St.Icon with a fixed iconSize of 16 and padding.
* If a `path` is provided, the icon will be loaded from the file system using
* Gio.icon_new_for_string(`${path}/icons/${iconName}.svg`). Otherwise the
* system icon theme name is set via `icon.iconName = iconName`.
*
* @param iconName - The icon identifier or filename (without ".svg") to use.
* When `path` is omitted this should be a name present in the
* icon theme; when `path` is provided the function loads
* `${path}/icons/${iconName}.svg`.
* @param path - Optional base path to load a custom SVG icon from. If omitted,
* the iconName is treated as a theme icon name.
* @param spacing - Optional spacing (in pixels) applied to the inner BoxLayout.
* Defaults to 0. When > 0 the layout's `style` will include
* `spacing: {spacing}px`.
* @returns A configured St.Button instance containing the icon. The caller is
* responsible for adding it to the UI and wiring up any signal handlers.
*/
export const createIconButton = (
iconName: string,
path?: string,
Expand Down
13 changes: 13 additions & 0 deletions src/keybindings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ export default class KeyBindings extends GObject.Object {
'untile-window': {
param_types: [Meta.Display.$gtype], // Meta.Display
},
'untile-all-windows': {
param_types: [Meta.Display.$gtype], // Meta.Display
},
'move-window-center': {
param_types: [Meta.Display.$gtype], // Meta.Display
},
Expand Down Expand Up @@ -155,6 +158,15 @@ export default class KeyBindings extends GObject.Object {
Shell.ActionMode.NORMAL,
(dp: Meta.Display) => this.emit('untile-window', dp),
);

// untile all windows with keybinding
Main.wm.addKeybinding(
Settings.SETTING_UNTILE_ALL_WINDOWS,
extensionSettings,
Meta.KeyBindingFlags.NONE,
Shell.ActionMode.NORMAL,
(dp: Meta.Display) => this.emit('untile-all-windows', dp),
);

// center the window with keybinding
Main.wm.addKeybinding(
Expand Down Expand Up @@ -373,6 +385,7 @@ export default class KeyBindings extends GObject.Object {
Main.wm.removeKeybinding(Settings.SETTING_SPAN_WINDOW_DOWN);
Main.wm.removeKeybinding(Settings.SETTING_SPAN_WINDOW_ALL_TILES);
Main.wm.removeKeybinding(Settings.SETTING_UNTILE_WINDOW);
Main.wm.removeKeybinding(Settings.SETTING_UNTILE_ALL_WINDOWS);
Main.wm.removeKeybinding(Settings.SETTING_MOVE_WINDOW_CENTER);
Main.wm.removeKeybinding(Settings.SETTING_FOCUS_WINDOW_UP);
Main.wm.removeKeybinding(Settings.SETTING_FOCUS_WINDOW_DOWN);
Expand Down
7 changes: 7 additions & 0 deletions src/prefs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,13 @@ export default class TilingShellExtensionPreferences extends ExtensionPreference
false,
false,
],
[
Settings.SETTING_UNTILE_ALL_WINDOWS,
_('Untile all windows from current workspace'),
undefined,
false,
false,
],
[
Settings.SETTING_MOVE_WINDOW_CENTER, // settings key
_('Move window to the center'), // title
Expand Down
1 change: 1 addition & 0 deletions src/settings/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ export default class Settings {
static SETTING_SPAN_WINDOW_DOWN = 'span-window-down';
static SETTING_SPAN_WINDOW_ALL_TILES = 'span-window-all-tiles';
static SETTING_UNTILE_WINDOW = 'untile-window';
static SETTING_UNTILE_ALL_WINDOWS = 'untile-all-windows';
static SETTING_MOVE_WINDOW_CENTER = 'move-window-center';
static SETTING_FOCUS_WINDOW_RIGHT = 'focus-window-right';
static SETTING_FOCUS_WINDOW_LEFT = 'focus-window-left';
Expand Down
30 changes: 19 additions & 11 deletions translations/de.po
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: Tiling Shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-25 18:00+0100\n"
"PO-Revision-Date: 2025-11-22 16:08+0100\n"
"PO-Revision-Date: 2026-01-31 15:45+0100\n"
"Last-Translator: Christian Lauinger <christian@lauinger-clan.de>\n"
"Language-Team: German\n"
"Language: de\n"
Expand Down Expand Up @@ -56,7 +56,7 @@ msgstr "Editieren starten"

#: dist/components/window_menu/overriddenWindowMenu.js:117
msgid "Move to best tile"
msgstr ""
msgstr "Fenster zur besten Kachel verschieben"

#: dist/components/window_menu/overriddenWindowMenu.js:137
msgid "Move to leftmost tile"
Expand Down Expand Up @@ -179,6 +179,7 @@ msgstr "Intelligenter Rahmenradius"
#: dist/prefs.js:133
msgid "Dynamically adapt to the window's actual border radius"
msgstr ""
"Rahmenradius dynamisch an den tatsächlichen Fensterrahmenradius anpassen."

#: dist/prefs.js:139
msgid "Width"
Expand Down Expand Up @@ -240,13 +241,15 @@ msgstr ""

#: dist/prefs.js:201
msgid "Sync layout when tiling with Snap Assistant"
msgstr ""
msgstr "Layout beim Kacheln mit Snap Assistant synchronisieren"

#: dist/prefs.js:203
msgid ""
"Change the active layout to match the layout used when tiling a window with "
"Snap Assistant"
msgstr ""
"Ändern Sie das aktive Layout so, dass es dem Layout entspricht, das beim "
"Kacheln eines Fensters mit dem Snap Assistant verwendet wird."

#: dist/prefs.js:214
msgid "Enable Tiling System"
Expand Down Expand Up @@ -334,13 +337,15 @@ msgstr ""

#: dist/prefs.js:281
msgid "Raise tiled windows together"
msgstr ""
msgstr "Kachelfenster gemeinsam anheben"

#: dist/prefs.js:283
msgid ""
"When one tiled window is raised, raise all tiled windows into the foreground "
"together"
msgstr ""
"Wenn ein gekacheltes Fenster in den Vordergrund gebracht wird, werden alle "
"gekachelten Fenster gemeinsam in den Vordergrund gebracht."

#: dist/prefs.js:288
msgid "Screen Edges"
Expand Down Expand Up @@ -411,11 +416,13 @@ msgstr ""

#: dist/prefs.js:376
msgid "Enable window suggestions for screen edge tiling"
msgstr ""
msgstr "Fenster-Vorschläge für Bildschirmrand-Kacheln aktivieren"

#: dist/prefs.js:378
msgid "Suggests windows to occupy empty tiles when tiling to screen edges"
msgstr ""
"Schlägt Fenster vor, um leere Kacheln zu belegen, wenn an Bildschirmrändern "
"gekachelt wird"

#: dist/prefs.js:384
msgid "Layouts"
Expand Down Expand Up @@ -724,30 +731,31 @@ msgstr "Neuen Issue öffnen auf"
#: dist/prefs.js:999
msgid "Choose how windows snap to screen edges"
msgstr ""
"Wählen Sie aus, wie Fenster an Bildschirmrändern ausgerichtet werden sollen."

#: dist/prefs.js:1014
msgid "Default"
msgstr ""
msgstr "Standard"

#: dist/prefs.js:1015
msgid "Follow quarters or screen halves"
msgstr ""
msgstr "Viertel oder Hälften des Spielfelds verfolgen"

#: dist/prefs.js:1020
msgid "Adaptive"
msgstr ""
msgstr "Adaptiv"

#: dist/prefs.js:1021
msgid "Follow corners of selected layout or screen halves"
msgstr ""
msgstr "Ecken des ausgewählten Layouts oder der Bildschirmhälften verfolgen"

#: dist/prefs.js:1026
msgid "Granular"
msgstr ""
msgstr "Granular"

#: dist/prefs.js:1027
msgid "Follow currently selected layout"
msgstr ""
msgstr "Aktuell ausgewähltes Layout übernehmen"

#: dist/prefs.js:1216
msgid "Choose custom color"
Expand Down
Loading