aMule Forum
Spanish => Nuevas funciones => Topic started by: tx2z on April 07, 2006, 01:49:18 PM
-
Hola, llevo usando amule bastante tiempo en ubuntu y la verdad q me gusta bastante. El problema era que cuando lo dejaba encendido mucho tiempo al volver a mirarlo iba demasiado lento y era bastante incordio, asi q decidí usar el demonio de amule (amuled) con amulegui (el amuleweb no me gusta mucho). Hasta ahora ningún problema y todo va como la seda... :D , lo unico que cuando quiero iniciarlo tengo que dar a dos lanzadores que he hecho (al demonio y a la gui cuando quiero verlo)
Bueno, a lo que iba (q me lio). ¿seria posible que amuled se iconificara en el area de notificación del sistema y cuando dieses ahi se cargase amulegui? Esto libraria al sistema de bastantes recursos y el uso sería igual que el de amule normal.
Quizá se podría hacer de otra forma: ¿Se podria hacer un script (seguro que si, lo que pasa que yo no se :P) para que iniciase amuled y amulegui si le pinchas por primera vez y si ya esta corriendo el demonio lanzase solo amulegui? Se colocaria este script como un lanzador en el panel y serviría para lo mismo que lo otro.
Bueno, eso es todo. Un saludo.
Gracias por el amule (es un gran trabajo).
-
Lo primero no porque el amuled no es un programa grafico. Lo segundo ya seria mas posible, e incluso facil, asi que dejo al siguiente que responda que te cree el script ;)
-
que buen rollo
tx2z:
lo que pasa que yo no se
bueno, yo no vayas a creer que se.
Pero si utilizas linux y perl, creo que me puedo acercar a lo que deseas
dinos bajo que sistema operativo lo utilizas si utilizas linux y perl, se podría partir de aquí:
#!/usr/bin/perl -w
use Gtk2::TrayIcon;
use strict;
Gtk2->init;
my $pic = Gtk2::Gdk::Pixbuf->new_from_file ("/usr/share/pixmaps/amule.xpm");
my $img = Gtk2::Image->new_from_pixbuf($pic->scale_simple(24, 24, 'tiles'));
my $tray= Gtk2::TrayIcon->new("trayicon");
my $paraEvent = Gtk2::EventBox->new;
$paraEvent->add($img);
$tray->add($paraEvent);
$tray->signal_connect (button_press_event => sub{Gtk2->main_quit;1});
$tray->show_all;
Gtk2->main;
-
jo, he estado leyendo el script y me he dado cuenta q no tengo ni idea de eso (es perl no?). Con eso se conseguiría hacer un icono en el area de notificación ¿no? pero no leo nada de amuled por nigún lado :] jejeje
Vamos, el resultado de usarlo es ninguno. (dándole permisos de ejecución).
Yo me habia imaginado algo como:
ejecuta amuled amulegui
si amuled esta ejecuntandose
ejecuta solo amulegui
(asi es como entiendo yo los scrips :P)
Uso ubuntu dapper (no pude aguantar). perl está instalado, pero no todos lo paquetes (quizá haga falta alguno de los q no tengo)
Un saludo y muchas gracias
-
¿No dije que puede partir? sinonimo de empezar, arrancar ...
para que seguir si yo no lo necesito. Y si tu ubieses sido usuario de Mac, Windows o otro ... deiferente a linux no hace falta seguir.
Crea el Icono del emule y responde a eventos.
Te van a tener que ayudar entonces ... es bien sencillo terminarlo con fork sobre amulecmd y enviando SIGN_KILL
A proposito, en perl utiliza CPAN
perl -MCPAN -e shell
install nombre::paquete::que::sea
bye
-
ok gracias de todas maneras... ya te dije q no tengo ni idea de esto de los scritps...
bueno, estudiare el tema entonces a ver si saco algo en claro
Un saludo
-
Yo es que no se mucho. Lo del fork exec y SIGTERM lo he digo enseguida, pero aplicarlo ya es otra cosa, para uno que esta verde como yo. Si me sale bien sigo el hilo.
-
últimas modificaciones en el archivo de este mensaje (http://forum.amule.org/thread.php?sid=&postid=54232#post54232)
#!/usr/bin/perl -w
#
# file aMulet.pl
# Copyright by AnimAlf
#
# This lines are under the GNU General Public License.
# http://www.gnu.org/copyleft/gpl.html
#
# aMulet - la t final en catalán le indica diminutivo
# También se traduce como amuleto
use strict;
my $binaMuled = 'amuled -f';
my $apppid = "$ENV{HOME}/.tx2z.pid";
my $logMode = "msg"; # debug warning msg
my $verbose = 1; # true false
if (!defined($ENV{'DISPLAY'})){
print &appRel . "\nATENCIÓN: Este script necesita ser ejecutado bajo las X Window\n";
exit -1;
}
eval "use Gtk2::TrayIcon;";
if ($@) {
print &appRel;
print "\n\nATENCIÓN: Este script necesita el módulo Gtk2::TrayIcon\n\n";
print "Puede instalarlo a través de CPAN del siguiente modo:\n\n";
print "\t\tperl -MCPAN -e shell\n";
print "\t\tinstall Gtk2::TrayIcon\n\n";
print "bye\n";
exit -1;
}
my $modUniCode;
eval "use Unicode::MapUTF8 qw(from_utf8);";
$modUniCode = !$@;
my $config = {};
my @appList = ( 'aMuleGui', 'wxCas', 'aLinkCreator');
# Los procesos hijo envían esta señal al padre cuando terminan y ésta
# debe ser atendida, si no se quedan zombies hasta que termine el padre.
$SIG{CHLD} = \&finalHijo;
# Si se recibe cualquier señal que pueda provocar la interrupción del
# normal funcionamiento, entonces nos encargamos de finalizar correctamente.
$SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = $SIG{INT} = \&finalizar;
# TODO: Hacer algo si finaliza la sesión de las X. No se cómo detectarlo.
# Iniciando Gtk2
Gtk2->init;
# Comprobaciones iniciales. Cargar configuración.
if (!&inicializar){
logsys ("msg", &appRel ." ha abortado el arranque.");
unlink $apppid or die "No puedo eliminar el archivo de bloqueo";
exit -1;
}
logsys ("msg", &appRel ." iniciado");
# Formas Gtk2
my $menu = Gtk2::Menu->new();
my $menu_opciones = Gtk2::MenuItem->new("opciones");
my $menu_aLinkCreator = Gtk2::MenuItem->new("aLinkCreator");
my $menu_wxCas = Gtk2::MenuItem->new("wxCas");
my $menu_aMuleGui = Gtk2::MenuItem->new("aMuleGui");
my $menu_verLog = Gtk2::MenuItem->new("aMule log");
my $menuSalir = Gtk2::MenuItem->new("Salir");
my $pic;
eval {$pic = Gtk2::Gdk::Pixbuf->new_from_file ($config->{'iconPath'});};
if ($@){
my @aMulet_xpm = ('18 24 17 1', ' c None', '. c #312A28', '+ c #524842',
'@ c #D42238', '# c #835128', '$ c #985A20', '% c #6A6B6A',
'& c #AA7B50', '* c #EC5867', '= c #BF7B3F', '- c #C9792F',
'; c #898989', '> c #E39854', ', c #CB9D83', '" c #A9AAAA',
') c #CDCBC9', '! c #F4F5F3', ' ',
' $ ',
' !> ',
' #! )$$ ',
' ## #-$ ',
' )##$ -,# ',
' .+##)$,) ',
' ...$,!" ',
' ".$=-$" ',
' ;==-!= ',
' " >! " ',
' ; !& ; ',
' " !)))" ',
' """"""! ',
' %!.""""); ',
' ;))";;;"%;;) ',
' ">-)";;;;"->"" ',
' )-=$,;;%@,->$) ',
' ;%--#=>>**+%%; ',
' +....&=>>>>#!))! ',
'%"-=##$>>>>=&$--;;',
'+)-=##&=>>>=#=->)+',
'%;;=$+.+>>++$->,;%', ' " . ');
$pic = Gtk2::Gdk::Pixbuf->new_from_xpm_data (@aMulet_xpm);
logsys ("warning", "Error al cargar el icono: " . $config->{'iconPath'});
logsys ("msg", "Se procede a cargar el icono interno.");
}
my $img= Gtk2::Image->new_from_pixbuf($pic->scale_simple(18, 24, "tiles"));
my $tray= Gtk2::TrayIcon->new("trayicon");
my $paraEvent = Gtk2::EventBox->new;
my $trayTooltip = Gtk2::Tooltips->new;
my $SeparadorMenu1 = Gtk2::SeparatorMenuItem->new;
my $SeparadorMenu2 = Gtk2::SeparatorMenuItem->new;
my $SeparadorMenu3 = Gtk2::SeparatorMenuItem->new;
$menu->append($menu_verLog);
$menu->append($SeparadorMenu1);
$menu->append($menu_opciones);
$menu->append($SeparadorMenu2);
$menu->append($menu_aLinkCreator);
$menu->append($menu_wxCas);
$menu->append($menu_aMuleGui);
$menu->append($SeparadorMenu3);
$menu->append($menuSalir);
$paraEvent->add($img);
$tray->add($paraEvent);
$trayTooltip->set_tip($tray, &appRel ." - Click derecho para opciones");
# Tratamiento de señales
logsys ("debug", "Asignación de señales");
$tray->signal_connect ('button-press-event' => \&ClickOnIcon);
$menu_opciones->signal_connect('activate' => \&opcionesGui);
$menu_verLog->signal_connect('activate' => \&visorTexto);
$menu_aLinkCreator->signal_connect('activate' => sub {&extAppStatus('aLinkCreator')});
$menu_wxCas->signal_connect('activate' => sub {&extAppStatus('wxCas')});
$menu_aMuleGui->signal_connect('activate' => sub {&extAppStatus('aMuleGui')});
$menuSalir->signal_connect('activate' => \&finalizar);
# show sobre los witgets para que sean visibles
logsys ("debug", "Show sobre los witgets");
$menu->show_all;
$tray->show_all;
&popUpsAct;
# iniciando bucle de mensajes
logsys ("debug", "Inicio del bucle de mensajes");
Gtk2->main;
# Fin. Aquí termina el flujo.
#############
# Funciones #
#############
# Respuesta a la señal de los hijos (cuando terminan la mandan)
sub finalHijo {
$SIG{CHLD} = \&finalHijo;
my $pid = wait;
return unless $config->{$pid}; # El system() realiza un fork() también.
logsys ("msg", "Acaba de finalizar: " . $config->{$pid} .
" [" . $config->{$config->{$pid} . 'Pid'} . "]");
undef $config->{$config->{$pid} . 'Pid'};
undef $config->{$pid};
}
# finalizar correctamente y eliminar bloqueo
sub finalizar {
$SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = $SIG{INT} = \&finalizar;
logsys ("msg", "Finalizando ...");
#Finalizar el bucle de mensajes
Gtk2->main_quit;
#Comprobar que no quede ninguna aplicación hijo en funcionamiento
#y si existe eliminarlas antes de finalizar no vayan a quedar zombies.
logsys ("msg", "Finalizando posibles hijos");
# Ahora la señal de retorno del hijo la trataremos aquí.
$SIG{CHLD} = 'DEFAULT';
foreach my $app (@appList) {
if (defined $config->{$app . "Pid"}){
logsys ("msg", "[$app] está en marcha. Finalizándolo ...");
kill ('SIGTERM', $config->{$app . "Pid"});
waitpid($config->{$app . "Pid"}, 0);
}
}
logsys ("msg", "No quedan procesos hijo de " . &appRel . " en el sistema");
#TODO Si archivo de bloqueo es usado para log volcar a otro sitio.
logsys ("warning", "TODO: volcar archivo log a log final [si se le ordena]");
logsys ("msg", "Terminada la ejecución");
logsys ("msg", "bye ;-)\n\n".&appRel."\n");
# borrar archivo de bloqueo
unlink $apppid or die "No puedo eliminar el archivo de bloqueo $apppid";
}
# flushChars transforma utf8 a iso-8859-1
sub flushChars {
my ($tmpStr) = @_;
$tmpStr =~ s/([\200-\377]+)/from_utf8({ -string => $1, -charset => 'ISO-8859-1'})/eg
if $modUniCode;
return $tmpStr;
}
#logsys Mini sistema de logs.
sub logsys {
my ($mode, $text) = @_;
my $tmpStr;
if (open LOG, ">>$apppid") {
if (($logMode eq "debug" && ($mode eq "debug" or $mode eq "warning")) ||
($logMode eq "warning" && ($mode eq "warning" or $mode eq "msg")) ||
($logMode eq "msg" && $mode eq "msg")){
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime (time);
$year += 1900; $mon ++;
$tmpStr="[" . uc($mode) . "] " . sprintf("%02d",$mday) . "-" .
sprintf("%02d",$mon) . "-$year " . sprintf("%02d",$hour) . ":" .
sprintf("%02d",$min) . ":" . sprintf("%02d",$sec) . " $text\n";
print LOG $tmpStr; print $tmpStr if $verbose;
}
close LOG;
}
}
# ClickOnIcon se lanzará tras un click en el TrayIcon.
# Para diferenciar el botón del ratón que se pulsó.
sub ClickOnIcon {
logsys ("debug", "sub: ClickOnIcon start");
my ($widget, $event) = @_;
return 1 if $event->button == 2;
$menu->popup(undef, undef, undef, undef, $event->button,$event->time) if $event->button == 3;
&extAppStatus($config->{'appOnClick'}) if $event->button == 1;
}
# extAppStatus lanzará una instancia de la aplicación si no existe
sub extAppStatus {
logsys ("debug", "sub: extAppStatus start");
my ($refApp) = @_;
$config->{ $refApp . 'Pid'} = fork()
unless ($config->{ $refApp . 'Pid'}); # Crea un proceso hijo
die "error al hacer fork: $!" if !defined($config->{$refApp . 'Pid'});
if ( $config->{$refApp . 'Pid'} == 0) { # Si se trata del proceso hijo
logsys ("msg", "Iniciando proceso hijo con [$refApp]");
if ($config->{$refApp . 'Ok'}) {
$SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = $SIG{INT} = 'DEFAULT';
logsys ("warning", "Redirección de STDOUT para $refApp a $apppid");
open STDOUT, ">>$apppid";
exec ($config->{$refApp . 'App'}) ||
die "ATENCIÓN: Falló la ejecución de $refApp";
} else {exit -1}
} else { # Circuito del proceso padre
logsys ("msg", "Circuito del proceso padre [hijo=>$refApp pid:"
. $config->{$refApp . 'Pid'} . "]");
# Asigno una clave en la configuración con el valor de la pid con el padre
$config->{$config->{$refApp . 'Pid'}} = $refApp
unless $config->{$config->{$refApp . 'Pid'}};
# a ejecutar por el proceso padre
# TODO: Enviar setFocus a la aplicación
#
}
}
# appRel nombre y versión del script
sub appRel {
$0=~/.*\/(.*)$/;
my $fileRun = $1;
$fileRun = $0 unless $fileRun;
$fileRun = "aMulet.pl [$1]" if $fileRun ne 'aMulet.pl';
return $fileRun . " v.1.1 beta";
}
# popUpsAct des/activar apartados del menú
sub popUpsAct {
$menu_aLinkCreator->set_sensitive($config->{'aLinkCreatorOk'});
$menu_wxCas->set_sensitive($config->{'wxCasOk'});
$menu_aMuleGui->set_sensitive($config->{'aMuleGuiOk'});
}
# pathsVerify comprobar la ruta de las aplicaciones
sub pathsVerify{
foreach my $app (@appList) {
$config->{$app . 'Ok'} = (-x $config->{$app . 'App'});
}
}
# inicializar comprobaciones iniciales
sub inicializar {
my $tmpStr;
my $runDaemon;
# Comprobar si ya estamos en marcha
if (-f $apppid){
my $appVerify=0;
# Comprobar si realmente la aplicación está en marcha.
if (open(APPPID, $apppid)){
my $line;
while ($line = ) {
chop($line); last;
}
close(APPPID);
$appVerify=&isRunProcess($line);
}
if ($appVerify){
$tmpStr = "" .appRel . " ya está funcionando!\n\n";
$SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = $SIG{INT} = 'DEFAULT';
&showMessage( 'error', flushChars($tmpStr), 'ok');
exit -1;
} else {unlink $apppid}
}
# Iniciar Bloqueo
logsys ("msg", "Iniciando archivo de bloqueo");
if (open LOG, ">$apppid"){print LOG "$$\n"}
# Cargar la configuración
logsys ("msg", "Cargando la configuración");
&loadConfig;
# Comprobar el estado del aMule como servicio
if ($config->{'aMuledOn'}){
logsys ("msg", "Iniciando la verificación de la existencia de amuled");
if (open(PROCESOS,"ps -A |")){
while (){
$runDaemon = 1 if ($_ =~ /amuled/);
}
close PROCESOS;
}
if (!$runDaemon) { $runDaemon = 1;
logsys ("msg", "No se detecta. Iniciando amuled ...");
if (open(AMULED,"$binaMuled |")){
my $aMuleRun;
while (){
logsys ("msg", $_);
logsys ("msg", "ATENCIÓN: Cambie la orden [$binaMuled] bajo su responsabilidad") if $_ =~ /binary requires/;
undef $runDaemon if $_ =~ /binary requires/;
$aMuleRun = 1 if $_ =~ /Raising current running instance/;
}
close AMULED;
if ($aMuleRun){
logsys ("msg", "*"x56 );
logsys ("msg", "*"x5 ." Se ha detectado que el aMule está en marcha " ."*"x6 );
logsys ("msg", "*"x56 );
logsys ("msg", "aMulet.pl se diseñó pensando en las herramientas remotas" );
logsys ("msg", "*"x56 );
logsys ("msg", "* FUNCIONARÍA, pero no veo la necesidad de ello. STOP!!" );
logsys ("msg", "*"x56 );
undef $runDaemon;
};
logsys ("msg", "El amuled ha sido puesto en marcha.") if $runDaemon;
} else {
undef $runDaemon;
logsys ("msg", "No se ha podido ejecutar el amuled!");
logsys ("msg", "Se puede indicar en la configuración que se salte este paso");
$tmpStr = "No se ha podido ejecutar aMuled.\n\n";
$tmpStr .= "¿Desactivo la opción de arrancar el amuled en la configuración?\n\n";
$tmpStr .= "Desactive esta opción si el aMuled está residente en otra máquina de su red.";
$tmpStr .= "\n\nNo he detectado el aMuleGui." unless $config->{'aMuleGuiOk'};
$tmpStr .= "\nDeberá indicar donde está situado éste en la configuración" unless $config->{'aMuleGuiOk'};
my $confirmacion= &showMessage( 'question', flushChars($tmpStr), 'yes-no');
if ($confirmacion eq 'yes'){
$config->{'aMuledOn'}=0;
&saveConfig;
$runDaemon = 1;
};
}
} else {logsys ("msg", "El aMuled ha sido detectado :))");}
} else {
$runDaemon = 1;
logsys ("msg", "ATENCIÓN No se detectará ni arrancará el aMuled");
logsys ("msg", " Se puede modificar esto en la configuración");
}
# Comprobar que la aplicación se arranca tras el click en el icono existe.
# No afectará al retorno de la función.
if ($runDaemon){
logsys ("msg", "Verificando la aplicación que responde al click del icono.");
if (!$config->{$config->{'appOnClick'} . 'Ok'}){
$tmpStr = "Debe indicar en la configuración dónde residen el ejecutable\n";
$tmpStr .= "de la aplicación $config->{'appOnClick'} o escoger otra\n";
$tmpStr .= "aplicación que responda al click en el icono";
&showMessage( 'warning', flushChars($tmpStr), 'ok');
&opcionesGui;
}
} # TODO: Intentar mostrarlo como modal y esperar respuesta.
return $runDaemon;
}
# visorTexto Crea una ventana Gtk en la que muestra el logfile del aMule
sub visorTexto {
logsys ("debug", "sub: visorTexto start");
my ($widget, $event) = @_;
logsys ("debug", "Deshabilitando la llamada en el menú");
$widget->set_sensitive(0);
my $visorTextWin = Gtk2::Window->new("toplevel");
my $vbox = Gtk2::VBox->new;
my $scrolledwindow = Gtk2::ScrolledWindow->new;
my $textBuffer = Gtk2::TextBuffer->new;
my $ok = Gtk2::Button->new_from_stock("gtk-close");
my $textView = Gtk2::TextView->new_with_buffer($textBuffer);
my $LineaLog;
$visorTextWin->set_title('Visor de Texto');
$visorTextWin->set_position('center');
$visorTextWin->set_default_size(640, 300);
logsys ("debug", "Leyendo " . $config->{'aMuleDir'} . "/logfile");
open (LOGFILE, $config->{'aMuleDir'} . "/logfile") || logsys ("warning", $config->{'aMuleDir'} . "/logfile: $!");
while () {$LineaLog .= $_;}
close LOGFILE;
$textView->set_editable(0);
$textView->set_cursor_visible(0);
$textBuffer->set_text($LineaLog);
$scrolledwindow->set_policy('automatic', 'automatic');
$scrolledwindow->add($textView);
$vbox->add($scrolledwindow );
$vbox->pack_end($ok, 0, 0, 3);
$visorTextWin->add($vbox);
$ok->signal_connect("clicked", sub { $visorTextWin->destroy; } );
$visorTextWin->signal_connect('destroy' => sub { $widget->set_sensitive(1); });
logsys ("msg", "Mostrando la ventana de logs");
$visorTextWin->show_all;
}
# isRunProcess comprobará si un proceso está en ejecución
sub isRunProcess {
my ($proceso) = @_;
my $runDaemon = 0;
if (open(PROCESOS,"ps -A |")){
while (){$runDaemon = 1 if $_ =~ /^$proceso\s/;}
close PROCESOS;
}
return $runDaemon;
}
# opcionesGui muestra la ventana de opciones
sub opcionesGui {
my ($widget, $event) = @_;
logsys ("debug", "Deshabilitando la llamada en el menú");
$widget->set_sensitive(0) if defined $widget;
my $guiOpciones = Gtk2::Window->new;
my $vboxPrincipal = Gtk2::VBox->new;
my $notebook = Gtk2::Notebook->new;
my $select_aMuleGui = Gtk2::RadioButton->new('appOnClick', 'aMuleGui');
my @grupo = $select_aMuleGui->get_group;
my $select_alc = Gtk2::RadioButton->new_with_label(@grupo, 'aLinkCreator');
my $select_wxcas = Gtk2::RadioButton->new_with_label(@grupo, 'wxCas');
my $check_aMuled_on = new Gtk2::CheckButton->new(flushChars('Arrancar aMule como servicio al principio (si no lo está)'));
my $vBoxTabRutas = Gtk2::VBox->new;
my $vBoxTabAbout = Gtk2::VBox->new;
my $hboxPrincipal = Gtk2::HBox->new;
my $hBoxTabRutas1 = Gtk2::HBox->new;
my $hBoxTabRutas2 = Gtk2::HBox->new;
my $hBoxTabRutas3 = Gtk2::HBox->new(1);
my $hseparator1 = Gtk2::HSeparator->new;
my $hseparator2 = Gtk2::HSeparator->new;
my $hseparator3 = Gtk2::HSeparator->new;
my $labelTabRutas = Gtk2::Label->new('General');
my $labelTabAbout = Gtk2::Label->new('About');
my $labelTabRut1 = Gtk2::Label->new('Relacionado con el Servicio amuled');
my $labelTabRut2 = Gtk2::Label->new('aMule Home Dir');
my $labelTabRut3 = Gtk2::Label->new('Ruta a las aplicaciones');
my $labelTabRut4 = Gtk2::Label->new('aMuleGui: ');
my $labelTabRut5 = Gtk2::Label->new('wxCas: ');
my $labelTabRut6 = Gtk2::Label->new('aLinkCreator: ');
my $labelTabRut7 = Gtk2::Label->new(flushChars('Icono que se mostrará en la barra'));
my $labelTabRut8 = Gtk2::Label->new('Icono:');
my $labelTabRut9 = Gtk2::Label->new(flushChars('¿Qué aplicación arrancará tras hacer click en el icono?'));
my $labelAbout1 = Gtk2::Label->new('aMulet.pl');
my $labelAbout2 = Gtk2::Label->new('by AnimAlf - AnimAlf@engendro.sytes.net');
my $labelAbout3 = Gtk2::Label->new('una idea de tx2z en http://forum.amule.org');
my $labelAbout4 = Gtk2::Label->new('Distribuido bajo la licencia GPL');
my $labelAbout5 = Gtk2::Label->new('http://www.gnu.org/copyleft/gpl.html');
my $edit_home_aMule = Gtk2::Entry->new;
my $edit_aMuleGui_path = Gtk2::Entry->new;
my $edit_wxcas_path = Gtk2::Entry->new;
my $edit_alc_path = Gtk2::Entry->new;
my $edit_icon_path = Gtk2::Entry->new;
my $btnOk = Gtk2::Button->new_from_stock("gtk-apply");
my $btnCancel = Gtk2::Button->new_from_stock("gtk-cancel");
my $btnRutas1 = Gtk2::Button->new('...');
my $btnRutas2 = Gtk2::Button->new('...');
my $btnRutas3 = Gtk2::Button->new('...');
my $btnRutas4 = Gtk2::Button->new('...');
my $btnRutas5 = Gtk2::Button->new('Selecciona');
my $tableTabRutas = Gtk2::Table->new(3, 3, 0 );
# Posicionando en la ventana principal
$guiOpciones->add($vboxPrincipal);
# Posicionando en el notebook (contenedor de pestañas)
$vboxPrincipal->add($notebook);
# primera pestaña
$notebook->append_page($vBoxTabRutas, $labelTabRutas);
$vBoxTabRutas->pack_start($labelTabRut1, 0, 0, 3);
$vBoxTabRutas->pack_start($hBoxTabRutas1, 0, 0, 3);
$hBoxTabRutas1->pack_start($labelTabRut2, 0, 0, 3);
$hBoxTabRutas1->add($edit_home_aMule);
$hBoxTabRutas1->pack_end($btnRutas1, 0, 0, 3);
$vBoxTabRutas->pack_start($check_aMuled_on, 0, 0, 3);
$vBoxTabRutas->pack_start($hseparator2, 0, 0, 3);
$vBoxTabRutas->pack_start($labelTabRut3, 0, 0, 3);
$vBoxTabRutas->pack_start($tableTabRutas, 0, 0, 3);
$tableTabRutas->attach($labelTabRut4, 0, 1, 0, 1, ['fill'], [], 0, 0 );
$tableTabRutas->attach($edit_aMuleGui_path, 1, 2, 0, 1, ['expand', 'fill'], [], 0, 0 );
$tableTabRutas->attach($btnRutas2, 2, 3, 0, 1, ['fill'], [], 0, 0 );
$tableTabRutas->attach($labelTabRut5, 0, 1, 1, 2, ['fill'], [], 0, 0 );
$tableTabRutas->attach($edit_wxcas_path, 1, 2, 1, 2, ['expand', 'fill'], [], 0, 0 );
$tableTabRutas->attach($btnRutas3, 2, 3, 1, 2, ['fill'], [], 0, 0 );
$tableTabRutas->attach($labelTabRut6, 0, 1, 2, 3, ['fill'], [], 0, 0 );
$tableTabRutas->attach($edit_alc_path, 1, 2, 2, 3, ['expand', 'fill'], [], 0, 0 );
$tableTabRutas->attach($btnRutas4, 2, 3, 2, 3, ['fill'], [], 0, 0 );
$vBoxTabRutas->pack_start($hseparator1, 0, 0, 3);
$vBoxTabRutas->pack_start($labelTabRut9, 0, 0, 3);
$vBoxTabRutas->pack_start($hBoxTabRutas3, 0, 0, 3);
$hBoxTabRutas3->pack_start($select_aMuleGui, 0, 0, 3);
$hBoxTabRutas3->pack_start($select_alc, 0, 0, 3);
$hBoxTabRutas3->pack_start($select_wxcas, 0, 0, 3);
$vBoxTabRutas->pack_end($hBoxTabRutas2, 0, 0, 3);
$hBoxTabRutas2->pack_start($labelTabRut8, 0, 0, 3);
$hBoxTabRutas2->add($edit_icon_path);
$hBoxTabRutas2->pack_end($btnRutas5, 0, 0, 3);
$vBoxTabRutas->pack_end($labelTabRut7, 0, 0, 3);
$vBoxTabRutas->pack_end($hseparator3, 0, 0, 3);
# Segunda pestaña
$notebook->append_page($vBoxTabAbout, $labelTabAbout);
$vBoxTabAbout->pack_start($labelAbout1, 0, 0, 3);
$vBoxTabAbout->pack_start($labelAbout2, 0, 0, 3);
$vBoxTabAbout->pack_start($labelAbout3, 0, 0, 3);
$vBoxTabAbout->pack_start($labelAbout4, 0, 0, 3);
$vBoxTabAbout->pack_start($labelAbout5, 0, 0, 3);
# Posicionando en la parte inferior de la ventana principal
$vboxPrincipal->pack_end($hboxPrincipal, 0, 0, 3);
$hboxPrincipal->pack_start($btnOk, 0, 0, 3);
$hboxPrincipal->pack_end($btnCancel, 0, 0, 3);
$labelAbout1->set_markup('' . appRel . ' ');
#TODO: Intentar conseguir una UrlLabel, fácil con gnome-open (pero y si no existe gnome?)
#http://forum.amule.org/thread.php?threadid=9751
$labelAbout3->set_markup('Una idea de tx2z en http://forum.amule.org');
# Propiedades de la ventana principal
$guiOpciones->set_title('Opciones aMulet.pl');
$guiOpciones->set_position('center');
#TODO: Intentar que actuase como una ventana modal, como el showMessage
# y el punto de la llamada esperase la respuesta ok-cancel
logsys ("msg", "Mostrando la ventana de opciones");
logsys ("warning", "*"x36) unless $widget;
logsys ("warning", "TODO: Que sea modal tipo showMessage") unless $widget;
logsys ("warning", "*"x36) unless $widget;
# Propiedades del notebook
$notebook->set_tab_pos('top');
$notebook->set_show_tabs (1);
$notebook->set_show_border(1);
$notebook->set_scrollable (0);
$notebook->set_tab_hborder(2);
$notebook->set_tab_vborder(2);
# alineando de algunas etiquetas
$labelTabRut4->set_alignment(1,0.5);
$labelTabRut5->set_alignment(1,0.5);
$labelTabRut6->set_alignment(1,0.5);
# Asignando la configuración.
$edit_home_aMule->set_text($config->{'aMuleDir'});
$edit_aMuleGui_path->set_text($config->{'aMuleGuiApp'});
$edit_wxcas_path->set_text($config->{'wxCasApp'});
$edit_alc_path->set_text($config->{'aLinkCreatorApp'});
$edit_icon_path->set_text($config->{'iconPath'});
$check_aMuled_on->set_active($config->{'aMuledOn'});
$select_wxcas->set_active($config->{'appOnClick'} eq 'wxCas');
$select_alc->set_active($config->{'appOnClick'} eq 'aLinkCreator');
$select_aMuleGui->set_active($config->{'appOnClick'} eq 'aMuleGui');
$select_wxcas->set_sensitive($config->{'wxCasOk'});
$select_alc->set_sensitive($config->{'aLinkCreatorOk'});
$select_aMuleGui->set_sensitive($config->{'aMuleGuiOk'});
# Lo mostramos todo
$guiOpciones->show_all;
# La asignación de señales
$btnOk->signal_connect("clicked", sub {
my ($tmpStr, $tmpStr1);
$tmpStr1 = 'wxCas' if $select_wxcas->get_active;
$tmpStr1 = 'aLinkCreator' if $select_alc->get_active;
$tmpStr1 = 'aMuleGui' if $select_aMuleGui->get_active;
$tmpStr .= $edit_home_aMule->get_text . ": No es un directorio\n"
if !(-d $edit_home_aMule->get_text);
$tmpStr .= $edit_aMuleGui_path->get_text . ": No es un ejecutable (o no existe)\n"
if !(-x $edit_aMuleGui_path->get_text);
$tmpStr .= $edit_wxcas_path->get_text . ": No es un ejecutable (o no existe)\n"
if !(-x $edit_wxcas_path->get_text);
$tmpStr .= $edit_alc_path->get_text . ": No es un ejecutable (o no existe)\n"
if !(-x $edit_alc_path->get_text);
$tmpStr .= $edit_icon_path->get_text . ": No parece que exista\n"
if !(-e $edit_icon_path->get_text);
if (defined $tmpStr){
$tmpStr = "Se ha detectado lo siguiente:\n\n$tmpStr\n\n" . flushChars("¿Desea continuar de todos modos?");
my $confirmacion= &showMessage( 'question', $tmpStr, 'yes-no');
return if ($confirmacion eq 'no');
}
$config->{'appOnClick'} = 'wxCas' if $select_wxcas->get_active;
$config->{'appOnClick'} = 'aLinkCreator' if $select_alc->get_active;
$config->{'appOnClick'} = 'aMuleGui' if $select_aMuleGui->get_active;
$config->{'aMuleDir'} = $edit_home_aMule->get_text;
$config->{'aMuleGuiApp'} = $edit_aMuleGui_path->get_text;
$config->{'wxCasApp'} = $edit_wxcas_path->get_text;
$config->{'aLinkCreatorApp'} = $edit_alc_path->get_text;
&showMessage( 'info', flushChars("El icono cambiará cuando reinicie la aplicación."), 'ok')
if $config->{'iconPath'} ne $edit_icon_path->get_text;
$config->{'iconPath'} = $edit_icon_path->get_text;
$config->{'aMuledOn'} = $check_aMuled_on->get_active;
&saveConfig; pathsVerify; popUpsAct;
$guiOpciones->destroy;
}
);
$btnCancel->signal_connect("clicked", sub { $guiOpciones->destroy; } );
$guiOpciones->signal_connect('destroy' => sub {$widget->set_sensitive(1) if defined $widget;});
$btnRutas1->signal_connect('clicked' => sub { dialogOpen($edit_home_aMule,
'Seleccione el directorio home de aMule', 'select-folder'); });
$btnRutas2->signal_connect('clicked' => sub { dialogOpen($edit_aMuleGui_path,
flushChars('Seleccione la aplicación aMuleGui'), 'open'); });
$btnRutas3->signal_connect('clicked' => sub { dialogOpen($edit_wxcas_path,
flushChars('Seleccione la aplicación wxCas'), 'open'); });
$btnRutas4->signal_connect('clicked' => sub { dialogOpen($edit_alc_path,
flushChars('Seleccione la aplicación aLinCreator'), 'open'); });
$btnRutas5->signal_connect('clicked' => sub { dialogOpen($edit_icon_path,
flushChars('Seleccione el icono que utilizará aMulet'), 'open'); });
}
# loadConfig carga la configuración o la crea si no existe
sub loadConfig {
if ( open( CONFIGFILE, "$ENV{HOME}/.aMule/amulet.rc" ) ) {
while () {
if ( $_ =~ /(\w+)\s=\s(.+)/ ) { $config->{$1} = $2 }
}
close CONFIGFILE;
} else {
# es la primera vez.
mkdir "$ENV{HOME}/.aMule" unless (-d "$ENV{HOME}/.aMule");
$config = { # Por defecto
'aMuleDir' => "$ENV{'HOME'}/.aMule",
'aMuleGuiApp' => 'amulegui',
'wxCasApp' => 'wxcas',
'aLinkCreatorApp' => 'alc',
'iconPath' => '/usr/share/pixmaps/amule.xpm',
'appOnClick' => 'aMuleGui',
'aMuledOn' => 1
};
foreach my $app (@appList) {
$config->{$app . 'App'} = which($config->{$app . 'App'});
}
pathsVerify;
&saveConfig;
}
pathsVerify;
}
# saveConfig guarda la configuración en un archivo
sub saveConfig {
my @keyList = ('aMuleDir', 'aMuleGuiApp', 'wxCasApp',
'aLinkCreatorApp', 'iconPath', 'appOnClick', 'aMuledOn');
if ( open( CONFIGFILE, '>', "$ENV{HOME}/.aMule/amulet.rc" ) ) {
foreach my $key (@keyList) {
print CONFIGFILE "$key = $config->{$key}\n" if $config->{$key} ne '';
}
close CONFIGFILE;
}else {logSys("warning", "No se puede escribir en el archivo de configuración!");}
};
# showMessage Muestra una ventana con un mensaje, y espera respuesta.
sub showMessage {
#$icon info warning error question
#$type none ok close cancel yes-no ok-cancel
my ($icon,$text,$type) = @_;
my $dialog = Gtk2::MessageDialog->new_with_markup (undef,
[qw/modal destroy-with-parent/], $icon, $type, sprintf "$text");
my $retval = $dialog->run;
$dialog->destroy;
return $retval;
}
# which Devuelve el path completo a la aplicación.
sub which {
my $appFile = shift;
foreach (split(':', $ENV{PATH})) {
my $tmpStr = "$_/$appFile";
if (-x $tmpStr) {
$appFile = $tmpStr;
last;
}
}
return $appFile;
}
# dialogOpen ventana de selección de archivos o directorios y escribe
# el resultado en en el entry que debe ser el primer parámetro.
sub dialogOpen {
# $widget debe ser un entry
# $type open save select-folder create-folder
my($widget,$caption,$type) =@_;
my $chooserDialog = Gtk2::FileChooserDialog->new ($caption, undef, $type,
'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok');
my $filename = $chooserDialog->get_filename if 'ok' eq $chooserDialog->run;
$widget->set_text ($filename) if defined $filename;
$chooserDialog->destroy;
return;
}
-
Lo que hace ahora el script es lo siguiente.
Se inicia en la barra de iconos.
Si no encuentra al amuled funcionando lo arranca (opcional).
Tras un click en el icono se hace una llamada al amulegui (o a escoger).
En el menú contextual aparecen:
Lanzadores para el amulegui, el wxCas y el aLinkCreator. Un Visor de logs del aMule.
Lanza una solo proceso por aplicación.
Y sólo en este archivo (http://forum.amule.org/thread.php?sid=&postid=54232#post54232) además se muestra el ratio de subida y bajada en el tooltip y en el about muestra un resumen del contenido de amulesig.dat si está activada esta opción en el aMule
TODO:
- Intentar pulsar el botón Conectar por código (si se guardó la contraseña) en el aMuleGui.
- Hacer un setfocus (o similar) sobre la aplicación que esté en marcha en caso de repetir la llamada.
-
Hola, estoy muy entretenido aquí con este escript (¿puedo seguir haciendo esto?)
Necesito ayuda.
Ya veo donde tengo el error
no llamo bien a la señal, creo que tiene que ir la función sóla por una lado y por el otro tiene que ir los argumentos.
signal_connect(instance, detailed_signal, callback, data=NULL)
lo que ahora tengo así:
$menu_wxCasi->signal_connect('activate' => extAppStatus ($wxcas_pid, $appwxcas,"wxCas") );
tendría que ser así o similar:
$menu_wxCas->signal_connect('activate' => \&extAppStatus, (intepid=>$wxcas_pid, interapp=>$appwxcas, interdesc=>"wxCas") );
Pero no se cómo hacer la llamada, veo por donde tiene que ir pero no se como hacerlo. ¿Alguien puede darme una pista?
-
El archivo que hay aquí es el terminado el 20 de abril. El código está tomando un camino diferente desde que quiero cazar la señal de termino de sesión X.
Como no puedo seguir por donde no conozco. Lo he solucionado así:
No se si ha alguien le interesará este código, pero tras esto está muy estable. Lo hecho hasta ahora lo subo en un Attachment a este mensaje, ya que parece que no da error. Y si el moredador no tiene inconveniente yo seguiré modificando el código en el mensaje en el que está el listado anterior (nunca pensé que aprendería gtk para perl de un modo tan ameno, (Se nota que estoy verde perl y OPP, no creo que sea sencillo hacer llegar los parámetros sin heredar o algo similar, je je, que pronto que creí que se podría solucionar)).
Lo he solucionado dejando la llamada como se que tienen que estar (es decir que no se más de ellas) cuando asigno las señales lo dejo así:
$menu_wxCas->signal_connect('activate' => \&extAppStatus );
Luego en extAppStatus comparo el widget de donde procede y asigno los valores ahí:
if ($widget == $menu_wxCas) {$intepid=$wxcas_pid; $interapp=$appwxcas; $interdesc = "wxCas"};
if (($widget == $menu_aMulegui) or ($widget == $tray)) {$intepid=$amulegui_pid; $interapp=$appgui; $interdesc = "aMuleGUI"};
Jo... esto se esta convirtiendo en un monólogo. Espero que no te importe lector.
He reescrito la función (ahora la veo guapa) solo me queda sustituir el exec que ahora utilizo por open, para ver si así no me queda difunto el proceso. (me refiero durante la ejecución) Al finalizar no dejo nada por ahí haciendo de Elvis :))
había un error en la función extAppStatus. En principio sólo la usaba para lanzar el amulegui, pero tras modificarla para que aceptara las demás aplicaciones (por ahora sólo wxCas), pero pensando en el aLinkCreator. Pues escribía la pid de la aplicación en una variable interna de la función, pero olvidé luego asignarla a la variable pid de la aplicación que corresponda, para que no abriese más que una vez la aplicación.
El descuido está corregido 0:-))
Tengo que cambiarlo, no me gusta nada. Quizás me he puesto nervioso y no me salía ninguna cosa que le mandaba, pero ahora es un lío el interior de la función. Intentaré que al asignar el valor a la variable sea por referencia, para así no tener que asignar dos veces.
Lo he cambiado totalmente. Creo que he revisado todos los puntos por los que el script podría caer.
hasta luego.
Este archivo ya no lo voy a sobreescribir más. Se queda así. Lo considero la primera versión estable.
-
joer, me voy unos dias y lias una.... :P
Eres un artistazo voy a probarlo y te comento... La verdad q no puedo ayudarte mucho pq no tengo ni idea.
Un saludo y muchas gracias :baby:
-
mmmm ejecutarlo me sale:
Can't locate Gtk2/TrayIcon.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.7 /usr/local/share/perl/5.8.7 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at ./aMulet.pl line 12.
BEGIN failed--compilation aborted at ./aMulet.pl line 12.
me falta algo por instalar o hago algo mal??
un saludo
-
vale, instalé libgtk2-trayicon-perl y libgtk2-traymanager-perl y se inicia el script, pero solo me inicia amuled, no pone ningún icono en el a de notificación:
tx2z@portatil:~$ ./aMulet.pl
[DEBUG] Fri Apr 14 23:21:34 2006 Iniciando Gtk2
[MSG] Fri Apr 14 23:21:34 2006 aMulet.pl iniciado
[DEBUG] Fri Apr 14 23:21:34 2006 sub:inicializar start
amuled: OnInit - starting timer
Initialising aMule
Checking if there is an instance already running...
No other instances are running.
amuled: forking to background - see you
parece que no puedo ejecutar el servicio. at ./aMulet.pl line 244.
sigo mirando a ver...
[aqui me he quedado, por mas que miro el script no se que me puede fallar ¿alguna ayuda?]
-
joer, me voy unos dias y lias una....
si, je, je, es que esto es de vicio
pero solo me inicia amuled, no pone ningún icono en el a de notificación
ahora lo miraré. La primera vez que lo escribií funcionó y ya no lo comprobé, ya que siempre está activo el amuled en mi sistema. Le echaré un vistazo, esto no tendría que pasarte.
system ("amuled -f") or die "parece que no puedo ejecutar el servicio." unless $rundemon;
Se te para en esta línea, pero lo tendría que hacer esta línea ejecuta el programa y si no lo consigue finaliza, pero parece que a ti te ejecuta el "amuled -f" pero después finaliza igualmente. ;(
Por ahora lo cambio el die por logsys y así continuará. Voy a echarle un vistazo. (así tendría que funcionarte bien)
También he añadido una opción al menú para mostrar los logs. En el listado (http://forum.amule.org/thread.php?threadid=9751&page=1#post53706) ya lo he modificado, y el archivo (http://forum.amule.org/thread.php?sid=&postid=53843#post53843) también está sustituido
Voy a hacer que haga las comprobaciones iniciales. A ver si me sale bien. Y que muestre en panatallla que cosas no son localizadas para corregir la ruta.
-
Ya lo corregí. Cambié
system ("amuled -f") or die "parece que no puedo ejecutar el servicio." unless $rundemon;
por
if (!$rundemon) { $rundemon = 1;
open(AMULED,"$binaMuled |") || die "No puedo ejecutar $binaMuled";
while (){
logsys ("msg", $_);
logsys ("msg", "ATENCION: Cambie la orden [$binaMuled] bajo su responsabilidad") if $_ =~ /binary requires/;
undef $rundemon if $_ =~ /binary requires/;
}
close AMULED;
}
Ahora la orden amuled -f se declara al principio del script
bye
-
funciona :baby: :baby: :baby: :baby:
Si señor, eres un maestro.
Muchas gracias y un saludo
PD: Me quedo con la mala sensación de que me has hecho un script, a ver si puedo ayudar en algo para mejorarlo o en cualquier otra cosa...
-
je, je, gracias.
Soy aprendiz en esto. Me gusta, y además tú idea no tenía desperdicio.
voy a seguir con ello, ya que estoy.
He creado una ventana de opciones. En el listado, está. Sólo está la interface, aún no hace nada, sólo está.
Quiero que al arrancar, si no existe un archivo de configuración. Cree uno por defecto (los valores que ahora se asignan por variables) y que estos se modifiquen a través de ese menu. También habrá la opción de que arranque el amuled o no y que se elija que programa arrancará si se hace click sobre el icono. La ventana de las opciones se mostrará automáticamente la primera vez si no encuentra algún archivo, para que se localice navegando. No se, lo jodido ya está hecho (la ventana) y no la voy a dejar así ;)
-
Hola, ahora está el script (http://forum.amule.org/thread.php?sid=&postid=53706#post53706) como yo lo quería ver. Creo que mira todos los errores que pudiesen aparecer en su ejecución, desde el principio de los módulos, la existencia de los archivos (je je también he puesto un icono por si no lee correctamente el de la configuración), la configuración ya está activa. Se le puede indicar que aplicación se abra tras el click. El visor ahora sólo tiene la posibilidad de abrirse una sola vez.
si aparece algún error o algo que falle avisarme please
La ventana de config tengo que cambiarla (quitarle la pestaña central y ponerlo en la primera pestaña) que queda muy fea. ... hasta luego
-
muy wapo si señor.
Sólo dos pequeños problemas un poco tontos :P :,
- Me dice que amulegui no es ejecutable, pero si ignoro el problema lo ejecuta perfectamente. Si elijo como ruta "/usr/bin/amulegui" no da ese mensaje.
- las tildes salen mal en la ventana opciones, supongo q problema de locales no?
Un saludo.
PD: Gracias por inclurme en el "about", pero realmente no he hecho nada...
-
Mea culpa. Sólo puse el nombre del archivo, para que la primera vez buscara el camino en el sistema con la función which, sólo lo hace la primera vez. Todo funcionaba bien, pero sin más se me ocurre agrupar la comprobación de que existen los archivos en una función, y sin querer borré la asignación que se le hacían tras pasar por which.
Ya vuelve a estar en su sítio.
Las tildes y los interrogantes es por el soporte utf8. A mí también se me ve igual de mal. Lo dejé así, pensando que quizás sólo me ocurría a mi, por una mala compilación de los modulos gtk2.
He echo un pupurri en el archivo (http://forum.amule.org/thread.php?sid=&postid=53843#post53843). Los caracteres que tienen que aparecer dentro de un widget estan en 8859-1 y el resto en utf-8.
De todos modos el listado (http://forum.amule.org/thread.php?sid=&postid=53706#post53706) mantiene la uniformidad.
He cambiado la ventana del options quitandole la pestaña central que quedaba muy fea. Ahora también puede arrancar aunque no localice los archivos :))
-
Bueno, se acabó.
Por fin no se me quedan difuntos los procesos hijos. Resulta que cada vez que un proceso hijo termina, envia una señal SIG{CHLD} al proceso padre y esta tiene que ser atendida, si no el proceso se queda zombie hasta que termine el proceso padre. Lo he dejado así:
$SIG{CHLD} = 'IGNORE';
Para lo del tratamiento de los caracteres en las formas gtk he añadido una función que cambia los caracteres de utf8 a iso-8859-1 (flushChars) y he añadido esta llamada en aquellas cadenas que lo podían necesitar. PERO. ésto sólo ocurrirá si se tiene en el sistema el módulo Unicode::MapUTF8 si no seguirá viendose como hasta ahora.
Desisto de enviar señales a la aplicación que ya ha sido arrancada, no soy capaz ni de enviar un setfocus. No tengo ni idea de que señal mandar.
Pues hasta aquí el script. A no ser que aparezca algún error o algo que se quiera añadir.
Hasta otra
-
hay una cosa que me gustaría que ocurriese.
Si se finaliza una sesión en las Xwindow entonces el archivo de bloqueo no es eliminado. Ahora he relizado una pequeña modificación al código para que si se está ejecutando en una terminal y esta se cierra accidentalmente, entonces se finalicen normalmente, igual que si se iterrumpe su ejecución con Ctrl+C, son las señales SIGHUP y SIGINT, pero no se que señal es enviada cuando finaliza una sesión de X.
Creía que sería SIGTERM pero veo que no es así. Los cambios:
# Señales de finalización de proceso
$SIG{'HUP'} = \&finalizar; # Si se cierra la ventana de terminal
$SIG{'INT'} = \&finalizar; # Si se pulsa Ctr+C
$SIG{'TERM'} = \&finalizar;# Creía que era por si se cierran las X
Y he englobado la sequencia de finalizar en una función.
¿Sabe alguien que señal es esa?
-
Permíteme que te haga una correción, aunque sólo sea ortográfica. En la línea 49, provocar va con V, no con B. Es que hace daño a a la vista... :D
Por otra parte, eres un genio con los scripts... yo sé hacer scripts, pero tú me ganas. ;)
-
Gracias ya está corregida, y alguna más que se me coló :]
yo sé hacer scripts, pero tú me ganas
yo no apostaría por ello ;)
-
Terminado.
No encontré lo de la señal de final de sesión en X. Lo he solucionado con el pid al principio del archivo de bloqueo, ahora comprueba el archivo de bloqueo y el identificador del proceso.
No he podido evitarlo. Ha añadido la tasa de subida y bajada en el tooltip y un resumen del contenido de amulesig.dat que se ve en opciones->about Sólo se muestran si OnlineSignature está activada en las opciones del aMule (se van refrescando al mismo tiempo que se refresca amulesig.dat)
Esto sólo está disponible en este archivo, no puedo ponerlo en el listado (excede).
bye