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 )