X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=i3-save-tree;h=18a1a38068b7da28b9b4efd69c92da4bbb6e4a72;hb=44367572c98bdb69730d86755dd3edb5207bed3c;hp=c64fc72a09ae119b6cd3bc8615781c3595be1551;hpb=3c5df50c54ab6451098c2175a21470312952000e;p=i3%2Fi3 diff --git a/i3-save-tree b/i3-save-tree index c64fc72a..18a1a380 100755 --- a/i3-save-tree +++ b/i3-save-tree @@ -1,7 +1,7 @@ #!/usr/bin/env perl # vim:ts=4:sw=4:expandtab # -# © 2013-2014 Michael Stapelberg +# © 2013 Michael Stapelberg # # Requires perl ≥ v5.10, AnyEvent::I3 and JSON::XS @@ -13,6 +13,7 @@ use POSIX qw(locale_h); use File::Find; use File::Basename qw(basename); use File::Temp qw(tempfile); +use List::Util qw(first); use Getopt::Long; use Pod::Usage; use AnyEvent::I3; @@ -41,11 +42,7 @@ my $result = GetOptions( die "Could not parse command line options" unless $result; -if (!defined($workspace) && !defined($output)) { - die "One of --workspace or --output need to be specified"; -} - -unless (defined($workspace) ^ defined($output)) { +if (defined($workspace) && defined($output)) { die "Only one of --workspace or --output can be specified"; } @@ -57,6 +54,15 @@ if (!$i3->connect->recv) { die "Could not connect to i3"; } +sub get_current_workspace { + my $current = first { $_->{focused} } @{$i3->get_workspaces->recv}; + return $current->{name}; +} + +if (!defined($workspace) && !defined($output)) { + $workspace = get_current_workspace(); +} + sub filter_containers { my ($tree, $pred) = @_; @@ -216,7 +222,7 @@ my $tree = $i3->get_tree->recv; my $dump; if (defined($workspace)) { $dump = filter_containers($tree, sub { - $_->{type} eq 'workspace' && $_->{name} eq $workspace + $_->{type} eq 'workspace' && ($_->{name} eq $workspace || ($workspace =~ /^\d+$/ && $_->{num} eq $workspace)) }); } else { $dump = filter_containers($tree, sub { @@ -246,7 +252,7 @@ for my $key (qw(nodes floating_nodes)) { =head1 SYNOPSIS - i3-save-tree [--workspace=name] [--output=name] + i3-save-tree [--workspace=name|number] [--output=name] =head1 DESCRIPTION @@ -259,19 +265,20 @@ specification. When a window is mapped (made visible on the screen) that matches the specification, i3 will put it into that place and kill the placeholder. +If neither argument is specified, the currently focused workspace will be used. + =head1 OPTIONS =over -=item B<--workspace=name> +=item B<--workspace=name|number> -Specifies the workspace that should be dumped, e.g. 1. Either this or --output -need to be specified. +Specifies the workspace that should be dumped, e.g. 1. This can either be a +name or the number of a workspace. =item B<--output=name> -Specifies the output that should be dumped, e.g. LVDS-1. Either this or ---workspace need to be specified. +Specifies the output that should be dumped, e.g. LVDS-1. =back