package dbus_object; sub system_bus { my %params = @_; #- use nomainloop => 1 to disable Net::DBus::Reactor main loop require Net::DBus; Net::DBus->system(%params); } sub new { my ($type, $bus, $service, $path, $interface) = @_; my $o = { bus => $bus, service => $service, path => $path, interface => $interface, }; attach_object($o); bless $o, $type; } sub attach_object { my ($o) = @_; my $service = $o->{bus}->get_service($o->{service}); $o->{object} = $service->get_object($o->{path}, $o->{interface}); } sub call_method { my ($o, $method, @args) = @_; $o->{object}->$method(@args); } sub safe_call_method { my ($o, $method, @args) = @_; my @ret; eval { @ret = $o->call_method($method, @args); }; if ($@) { print STDERR "($method) exception: $@\n"; $o->{bus}{connection}->dispatch; return; } @ret; } sub set_gtk2_watch { my ($o) = @_; set_gtk2_watch_helper($o->{bus}); } sub set_gtk2_watch_helper { my ($bus) = @_; $bus->{connection}->set_watch_callbacks(sub { my ($con, $watch) = @_; my $flags = $watch->get_flags; require Net::DBus::Binding::Watch; require Gtk2::Helper; if ($flags & &Net::DBus::Binding::Watch::READABLE) { Gtk2::Helper->add_watch($watch->get_fileno, 'in', sub { $watch->handle(&Net::DBus::Binding::Watch::READABLE); $con->dispatch; 1; }); } #- do nothing for WRITABLE watch, we dispatch when needed }, undef, undef); #- do nothing when watch is disabled or toggled yet $bus->{connection}->dispatch; } 1; p Fk*Jk%O%3ۢX;jkɹLQP? Ysh[tE]]c-MrXS0?|Ʊ le{,uڊOo<)w=8E!ǫ6#H,ЫÊw#{O&\kx{#k2j^P9G}'zz:$ҋ|ثcqzc=MzF%|CGG%QILI ҠLҏԅ&QH2<\u!IHҁ,T Rk2O:P=u]Yxu(m 3@]g Ձ,{S p]z4 t% cLgt.{$@]ւIӁ :P1XMA:Pe0ցnG S(Ej@d $Rj@ Qe'tf]GG0 #>f`@(`+=>ٷo_0JU!}FWp:T T(:f4HR$=A]7A~`N)d-5KC9e0R#+dDz=wJ/;5;; VB/?&jүwѹ=іFw܄`W|4ݹ½q]N/^F!??L6jI#Uٟ1fx9 nv]ElDlz6Jz&&(:6YXK޸/Y7A*g:bwnXf \ pV$ŀh<]Ilł}7nLBm(` ."(I"J ^m%+6!?4Xy fXܡod{7N9"{g/L96G shɧ8Π;1($m;d86.<ؑY>]HW9Q~ԬzHhKgր4|,ھ[tMa,c|t