2014-01-26 16:51:32 +01:00
|
|
|
|
#!/usr/bin/env perl
|
|
|
|
|
# vim:ts=4:sw=4:expandtab
|
|
|
|
|
# © 2012 Michael Stapelberg
|
2017-09-24 10:19:07 +02:00
|
|
|
|
# Licensed under BSD license, see https://github.com/i3/i3/blob/next/LICENSE
|
2014-01-26 16:51:32 +01:00
|
|
|
|
#
|
|
|
|
|
# Append this line to your i3 config file:
|
|
|
|
|
# exec_always ~/per-workspace-layout.pl
|
|
|
|
|
#
|
|
|
|
|
# Then, change the %layouts hash like you want your workspaces to be set up.
|
|
|
|
|
# This script requires i3 >= v4.4 for the extended workspace event.
|
|
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
|
use warnings;
|
|
|
|
|
use AnyEvent;
|
|
|
|
|
use AnyEvent::I3;
|
|
|
|
|
use v5.10;
|
|
|
|
|
|
|
|
|
|
my %layouts = (
|
|
|
|
|
'4' => 'tabbed',
|
|
|
|
|
'5' => 'stacked',
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
my $i3 = i3();
|
|
|
|
|
|
|
|
|
|
die "Could not connect to i3: $!" unless $i3->connect->recv();
|
|
|
|
|
|
|
|
|
|
die "Could not subscribe to the workspace event: $!" unless
|
|
|
|
|
$i3->subscribe({
|
|
|
|
|
workspace => sub {
|
|
|
|
|
my ($msg) = @_;
|
|
|
|
|
return unless $msg->{change} eq 'focus';
|
|
|
|
|
die "Your version of i3 is too old. You need >= v4.4"
|
|
|
|
|
unless exists($msg->{current});
|
|
|
|
|
my $ws = $msg->{current};
|
|
|
|
|
|
|
|
|
|
# If the workspace already has children, don’t change the layout.
|
|
|
|
|
return unless scalar @{$ws->{nodes}} == 0;
|
|
|
|
|
|
|
|
|
|
my $name = $ws->{name};
|
|
|
|
|
my $con_id = $ws->{id};
|
|
|
|
|
|
|
|
|
|
return unless exists $layouts{$name};
|
|
|
|
|
|
|
|
|
|
$i3->command(qq|[con_id="$con_id"] layout | . $layouts{$name});
|
|
|
|
|
},
|
|
|
|
|
_error => sub {
|
|
|
|
|
my ($msg) = @_;
|
|
|
|
|
say "AnyEvent::I3 error: $msg";
|
|
|
|
|
say "Exiting.";
|
|
|
|
|
exit 1;
|
|
|
|
|
},
|
|
|
|
|
})->recv->{success};
|
|
|
|
|
|
|
|
|
|
# Run forever.
|
|
|
|
|
AnyEvent->condvar->recv
|