# Tiling Shell: advanced and modern window management for GNOME
#
# Copyright (C) 2025 Domenico Ferraro
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
#
# SPDX-License-Identifier: GPL-3.0-or-later
require 'pathname'
CPUS = 4
MEMORY = 4096
PROJECT_DIR = Pathname.new(__FILE__).realpath.dirname
SYNCED_FOLDER = "/home/vagrant/#{PROJECT_DIR.basename}"
UUID = "tilingshell@ferrarodomenico.com"
# Shared configuration for all GNOME VMs
def configure_gnome_vm(vm_config, box_name)
vm_config.vm.box = box_name
vm_config.vm.provider :virtualbox do |v|
v.gui = true
v.cpus = CPUS
v.memory = MEMORY
v.customize ["modifyvm", :id, "--vram=128"]
v.customize ["modifyvm", :id, "--accelerate-3d", "on"]
v.customize ["setextradata", :id, "GUI/LastGuestSizeHint", "1920,1080"]
v.customize ["modifyvm", :id, "--clipboard", "bidirectional"]
v.default_nic_type = "virtio"
end
# One-time system setup
vm_config.vm.provision 'install-deps', type: 'shell', privileged: true, run: 'once', inline: <<-SCRIPT
echo 'fastestmirror=1' | sudo tee -a /etc/dnf/dnf.conf
echo 'max_parallel_downloads=10' | sudo tee -a /etc/dnf/dnf.conf
echo 'deltarpm=true' | sudo tee -a /etc/dnf/dnf.conf
dnf -y update
dnf install -y gnome-shell gnome-session gdm glib2-devel \
gnome-extensions-app gnome-terminal \
nautilus gnome-backgrounds nodejs npm
passwd --delete vagrant
# Enable GDM autologin
systemctl enable gdm
systemctl set-default graphical.target
mkdir -p /etc/gdm
cat < /etc/gdm/custom.conf
[daemon]
AutomaticLoginEnable=True
AutomaticLogin=vagrant
EOF
systemctl restart gdm
# Install extension dependencies
echo "🛠️ Installing npm dependencies..."
cd #{SYNCED_FOLDER}
npm install
SCRIPT
# Build extension
vm_config.vm.provision "build-extension", type: "shell", privileged: true, run: "always", inline: <<-SCRIPT
set -e
cd #{SYNCED_FOLDER}
echo "🛠️ Installing npm dependencies and building the extension..."
npm install
npm run build
SCRIPT
# Install extension
vm_config.vm.provision "install-extension", type: "shell", privileged: false, run: "always", inline: <<-SCRIPT
set -e
EXT_DIR="$HOME/.local/share/gnome-shell/extensions/#{UUID}"
rm -rf "$EXT_DIR"
cd #{SYNCED_FOLDER}
npm run install:extension
SCRIPT
# Reload GNOME
vm_config.vm.provision "reload", type: "shell", privileged: true, run: "always", inline: <<-SCRIPT
set -e
echo "⏳ Restarting GDM to reload GNOME Shell..."
systemctl restart gdm
SCRIPT
# Enable extension once
vm_config.vm.provision "enable-extension", type: "shell", privileged: false, run: "once", inline: <<-SCRIPT
set -e
echo "🚀 Enabling extension..."
gnome-extensions enable #{UUID}
SCRIPT
# Debug logs (manual)
vm_config.vm.provision "show-logs", type: "shell", run: "never", inline: <<-SCRIPT
journalctl --follow /usr/bin/gnome-shell
SCRIPT
end
Vagrant.configure("2") do |config|
# Shared synced folder
config.vm.synced_folder '.', SYNCED_FOLDER,
type: 'rsync',
rsync__exclude: [".git/", "node_modules/", "dist/", "dist_legacy/", "*.zip", "doc/"],
rsync__args: ['-avcS'],
rsync__auto: true
# GNOME 44 on Fedora 38
config.vm.define "gnome44" do |gnome44|
configure_gnome_vm(gnome44, "bento/fedora-38")
end
# GNOME 46 on Fedora 40
config.vm.define "gnome46", primary: true do |gnome46|
configure_gnome_vm(gnome46, "bento/fedora-40")
end
# GNOME 47 on Fedora 41
config.vm.define "gnome47", primary: true do |gnome46|
configure_gnome_vm(gnome46, "bento/fedora-41")
end
# GNOME 48 on Fedora 42
config.vm.define "gnome48" do |gnome48|
configure_gnome_vm(gnome48, "bento/fedora-42")
end
# GNOME 49 on Fedora 43
config.vm.define "gnome49" do |gnome49|
configure_gnome_vm(gnome49, "bento/fedora-43")
end
end