Skip to content

Instantly share code, notes, and snippets.

@MortenStabenau
Last active April 20, 2024 19:46
Show Gist options
  • Select an option

  • Save MortenStabenau/130a35a0f2b57b09ca518d202bac0bbe to your computer and use it in GitHub Desktop.

Select an option

Save MortenStabenau/130a35a0f2b57b09ca518d202bac0bbe to your computer and use it in GitHub Desktop.
Moving windows programmatically in Gnome under Wayland (or X)
#!/bin/bash
# -------- THIS SCRIPT IS OUTDATED -------
# Gnome has removed the Shell.Eval endpoint, so it won't work anymore.
# Feel free to use it as inspiration for something else.
# Original comment below.
# ----------------------------------------
# This script programmatically moves around the windows on my screens.
# The JavaScript can be prototyped in Looking Glass (ALT+F2 lg). The documentation of MetaWindow can be found here:
# https://developer.gnome.org/meta/stable/MetaWindow.html
set -e
if [ -z "$1" ]; then
echo "Please give a configuration (1-5)."
exit 1;
fi
case $1 in
1)
# Main screen left
X=0
Y=0
W=1146
H=1410
M=2 # Maximization mode, 1 -> horizontal, 2 -> vertical, 3 -> both
;;
2)
# Main screen middle
X=1146
Y=0
W=1148 # Middle one is a few pixels wider
H=1410
M=2
;;
3)
# Main screen right
X=2294
Y=0
W=1146
H=1410
M=2
;;
4) # Secondary screen (fullscreen)
X=3440
Y=0
W=1080
H=1920
M=3
;;
5)
# Main screen middle - wider (60%)
X=688
Y=0
W=2064
H=1410
M=2
;;
*)
echo "Invalid configuration $1."
exit 1
esac
JS="""
const GLib = imports.gi.GLib;
global.get_window_actors().forEach(function (w) {
var mw = w.meta_window;
if (mw.has_focus()) {
if (mw.get_maximized()) {
mw.unmaximize(3); // 3 is META_MAXIMIZE_BOTH, so unmaximizing the window in both directions
}
mw.move_resize_frame(0, $X, $Y, $W, $H);
if ($M) {
// Maximization needs to be delayed a little, so that the window has time to move
GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, function() { mw.maximize($M); });
}
}
});
"""
gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "$JS"
@marvinthepa
Copy link
Copy Markdown

marvinthepa commented Jun 14, 2022

https://developer.gnome.org/meta/stable/MetaWindow.html

This leads to a 404.
Try https://gjs-docs.gnome.org/meta9~9_api/ (or https://gjs-docs.gnome.org/ and searching for Meta, when that one breaks as well).
I also found https://gjs-docs.gnome.org/shell01~0.1_api/ helpful.

@MortenStabenau
Copy link
Copy Markdown
Author

Actually, this gist is outdated. Newer versions of Gnome have removed the Shell.Eval method so this exact method won't work anymore. One would have to write a full Gnome Extension, I think.

@VINTX2
Copy link
Copy Markdown

VINTX2 commented Apr 20, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment