AnyEvent-Sway

 view release on metacpan or  search on metacpan

bin/sway.pl  view on Meta::CPAN


use strict;
use warnings;

use lib './lib';
use AnyEvent::Sway qw(:all);

my $sway = sway();

$sway->connect->recv or die "Error connecting";
say "Connected to Sway";

my $workspaces = $sway->message(TYPE_GET_WORKSPACES)->recv;
say "Currently, you use " . @{$workspaces} . " workspaces";

lib/AnyEvent/Sway.pm  view on Meta::CPAN


This module connects to the Sway window manager using the UNIX socket based
IPC interface it provides (if enabled in the configuration file). You can
then subscribe to events or send messages and receive their replies.

    use AnyEvent::Sway qw(:all);

    my $sway = sway();

    $sway->connect->recv or die "Error connecting";
    say "Connected to Sway";

    my $workspaces = $sway->message(TYPE_GET_WORKSPACES)->recv;
    say "Currently, you use " . @{$workspaces} . " workspaces";

...or, using the sugar methods:

    use AnyEvent::Sway;

    my $workspaces = Sway->get_workspaces->recv;
    say "Currently, you use " . @{$workspaces} . " workspaces";

A somewhat more involved example which dumps the Sway layout tree whenever there
is a workspace event:

    use Data::Dumper;
    use AnyEvent;
    use AnyEvent::Sway;

    my $sway = sway();

    $sway->connect->recv or die "Error connecting to Sway";

    $sway->subscribe({
        workspace => sub {
            $sway->get_tree->cb(sub {
                my ($tree) = @_;
                say "tree: " . Dumper($tree);
            });
        }
    })->recv->{success} or die "Error subscribing to events";

    AE::cv->recv

=head1 EXPORT

=head2 $sway = sway([ $path ]);

lib/AnyEvent/Sway.pm  view on Meta::CPAN

    bless { path => $path } => $class;
}

=head2 $sway->connect

Establishes the connection to Sway. Returns an C<AnyEvent::CondVar> which will
be triggered with a boolean (true if the connection was established) as soon as
the connection has been established.

    if ($sway->connect->recv) {
        say "Connected to Sway";
    }

=cut
sub connect
{
    my ($self) = @_;
    my $cv = AnyEvent->condvar;

    tcp_connect "unix/", $self->{path}, sub {
        my ($fh) = @_;

lib/AnyEvent/Sway.pm  view on Meta::CPAN

    # (when connection is lost, all one-time callbacks get triggered)
    delete $self->{callbacks}->{$type};
}

=head2 $sway->subscribe(\%callbacks)

Subscribes to the given event types. This function awaits a hashref with the
key being the name of the event and the value being a callback.

    my %callbacks = (
        workspace => sub { say "Workspaces changed" }
    );

    if ($sway->subscribe(\%callbacks)->recv->{success}) {
        say "Successfully subscribed";
    }

The special callback with name C<_error> is called when the connection to Sway
is killed (because of a crash, exit or restart of Sway most likely). You can
use it to print an appropriate message and exit cleanly or to try to reconnect.

    my %callbacks = (
        _error => sub {
            my ($msg) = @_;
            say "I am sorry. I am so sorry: $msg";
            exit 1;
        }
    );

    $sway->subscribe(\%callbacks)->recv;

=cut
sub subscribe
{
    my ($self, $callbacks) = @_;

lib/AnyEvent/Sway.pm  view on Meta::CPAN

}

=head2 $sway->message($type, $content)

Sends a message of the specified C<type> to Sway, possibly containing the data
structure C<content> (or C<content>, encoded as utf8, if C<content> is a
scalar), if specified.

    my $reply = $sway->message(TYPE_RUN_COMMAND, "reload")->recv;
    if ($reply->{success}) {
        say "Configuration successfully reloaded";
    }

=cut
sub message
{
    my ($self, $type, $content) = @_;

    confess "No message type specified" unless defined($type);

    confess "No connection to Sway" unless defined($self->{ipchdl});

lib/AnyEvent/Sway.pm  view on Meta::CPAN

    return if defined($self->{ipchdl});

    $self->connect->recv or confess "Unable to connect to Sway (socket path " . $self->{path} . ")";
}

=head2 get_workspaces

Gets the current workspaces from Sway.

    my $ws = sway->get_workspaces->recv;
    say Dumper($ws);

=cut
sub get_workspaces
{
    my ($self) = @_;

    $self->_ensure_connection;

    $self->message(TYPE_GET_WORKSPACES)
}

=head2 get_outputs

Gets the current outputs from Sway.

    my $outs = sway->get_outputs->recv;
    say Dumper($outs);

=cut
sub get_outputs
{
    my ($self) = @_;

    $self->_ensure_connection;

    $self->message(TYPE_GET_OUTPUTS)
}

=head2 get_tree

Gets the layout tree from Sway (>= v4.0).

    my $tree = sway->get_tree->recv;
    say Dumper($tree);

=cut
sub get_tree
{
    my ($self) = @_;

    $self->_ensure_connection;

    $self->message(TYPE_GET_TREE)
}

=head2 get_marks

Gets all the window identifier marks from Sway (>= v4.1).

    my $marks = sway->get_marks->recv;
    say Dumper($marks);

=cut
sub get_marks
{
    my ($self) = @_;

    $self->_ensure_connection;

    $self->message(TYPE_GET_MARKS)
}

=head2 get_bar_config

Gets the bar configuration for the specific bar id from Sway (>= v4.1).

    my $config = sway->get_bar_config($id)->recv;
    say Dumper($config);

=cut
sub get_bar_config
{
    my ($self, $id) = @_;

    $self->_ensure_connection;

    $self->message(TYPE_GET_BAR_CONFIG, $id)
}

=head2 get_version

Gets the Sway version via IPC, with a fall-back that parses the output of Sway
--version (for Sway < v4.3).

    my $version = sway->get_version()->recv;
    say "major: " . $version->{major} . ", minor = " . $version->{minor};

=cut
sub get_version
{
    my ($self) = @_;

    $self->_ensure_connection;

    my $cv = AnyEvent->condvar;



( run in 1.435 second using v1.01-cache-2.11-cpan-483215c6ad5 )