Fórum Ubuntu Linux - PT

Suporte Técnico => Programação e Scripts => Tópico iniciado por: vampire_thunder em 05 de Maio de 2011, 14:43

Título: dbus, zenity e kdialog
Enviado por: vampire_thunder em 05 de Maio de 2011, 14:43
Pergunta difícil, mas lá vai:

Estou tentando converter um script que usa kdialog (KDE) para zenity (GTK).
Já mudei quase tudo, adaptando os diálogos do kdialog para o zenity, mas chegou numa parte que não estou conseguindo avançar. É a seguinte:
Código: [Selecionar]
dcopRef=$(kdialog --title $"mencoder" --progressbar $"Iniciando..." 12 2> /dev/null)
qdbus $dcopRef org.freedesktop.DBus.Properties.Set org.kde.kdialog.ProgressDialog maximum 100 2> /dev/null
qdbus $dcopRef org.kde.kdialog.ProgressDialog.showCancelButton true 2> /dev/null

A primeira linha substituí por essa:
Código: [Selecionar]
dcopRef=$(zenity --progress --title $"Mencoder"  --text $"Iniciando..." 12 2> /dev/null)

O problema são as outras. Fiquei um bom tempo no Google mas não encontrei nada equivalente ao "org.kde.kdialog.ProgressDialog" para o zenity. O máximo que percebi foi que eu devo usar o dbus-send no lugar do qdbus.

Alguém sabe?


Outro problema que estou tendo é com a função de seleção de arquivos. No kdialog é assim:
Código: [Selecionar]
kdialog --multiple --separate-output --getopenfilename

Substituí por isso:
Código: [Selecionar]
zenity --file-selection --multiple

Acontece que no kdialog, o parâmtro --separate-output divide os múltiplos arquivos em uma lista, um embaixo do outro, enquanto no zenity não tem essa opção e os nomes dos arquivos ficam um do lado do outro, na mesma linha. Como faço para burlar isso?
Título: Re: dbus, zenity e kdialog
Enviado por: irtigor em 05 de Maio de 2011, 18:18
Se colocar o código original - inteiro - a coisa fica mais fácil, ou pelo menos informa o que o programa deveria fazer (as vezes a única forma é escrever do zero).
---
Olhe: http://linuxlibrary.org/index.php/command-line/zenity-simple-gui-creation-tool/
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 05 de Maio de 2011, 20:28
Os comandos do zenity e do kdialog eu li no --help-all. A questão mora no dbus, que não sei nada (eu também não sabia os do zenity) e não consigo encontrar. Acredito que eu realmente não esteja sabendo procurar, porque provavelmente deve ter muita diferença entre o qdbus e o dbus-send (ou outro), o que deve diferenciar o org.freedesktop presente no comando.

No entanto, nas pesquisas que fiz encontrei esse script:
http://svn.dmdirc.com/trunk/installer/linux/progressbar.sh

Dando uma olhada nele, vi que o org. alguma coisa só aparece quando usa o kdialog. Quando usa o zenity não aparece. Então talvez eu nem precise desse monte de parâmetros.


Se colocar o código original - inteiro - a coisa fica mais fácil, ou pelo menos informa o que o programa deveria fazer (as vezes a única forma é escrever do zero).
---
Olhe: http://linuxlibrary.org/index.php/command-line/zenity-simple-gui-creation-tool/

O programa é o Big Converter, do Big Linux, que é um frontend do mencoder. Achei no svn deles uma versão mais antiga. Não sei se teve mudanças, mas basicamente é isso:
http://biglinux.googlecode.com/svn/trunk/karmic/bigcontrolcenter-others-convert/usr/share/bigcontrolcenter/categories/others/bigconvert/submit.sh.htm
Título: Re: dbus, zenity e kdialog
Enviado por: irtigor em 05 de Maio de 2011, 20:42
Só serve pra mostrar uma barra de progresso. O mencoder informa isso? Se sim basta passar por um pipe.
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 05 de Maio de 2011, 23:26
Só serve pra mostrar uma barra de progresso. O mencoder informa isso? Se sim basta passar por um pipe.

Não sei bem se ele informa. O que ele faz realmente é mostrar uma saída de 4 em 4 milésimos de segundos com o progresso até a conversão acabar:
(https://ubuntuforum-br.org/proxy.php?request=http%3A%2F%2Fimg843.imageshack.us%2Fimg843%2F6784%2Fcapturadetelaterminal.th.png&hash=8444c35ad4771e44d0ccd2040d14c40ce62ee5b9) (http://img843.imageshack.us/i/capturadetelaterminal.png/)
O script, então, joga isso para um log: "> /tmp/mencoder-log$$ 2> /dev/null"

e nessa parte faz a leitura para atualizar a barra:
Código: [Selecionar]
(...)
  #Adiciona mais dados sobre a barra de progresso
  qdbus $dcopRef org.kde.kdialog.ProgressDialog.setLabelText " Convertendo, aguarde por favor.

$(sed '$!d;s/(.*)//;s/A.*//;s/V//' /tmp/mencoder-log$$)"


  #Faz a leitura do Log e atualiza a barra de progresso
  qdbus $dcopRef org.freedesktop.DBus.Properties.Set org.kde.kdialog.ProgressDialog value $(sed '$!d;s/.*(//; s/%.*//' /tmp/mencoder-log$$)


O resultado:
(https://ubuntuforum-br.org/proxy.php?request=http%3A%2F%2Fimg709.imageshack.us%2Fimg709%2F8969%2Fcapturadetela3u.th.png&hash=4ed93394f70873f50b1246cb47e591700ee91881) (http://img709.imageshack.us/i/capturadetela3u.png/)

O zenity com o comando "--progress --percentage=" mostra a porcentagem a partir do número mencionado, mas não continua a encher automaticamente.
Título: Re: dbus, zenity e kdialog
Enviado por: irtigor em 06 de Maio de 2011, 07:21
Você pode tirar o "--percentage=", você só precisa passar a porcentagem pro zenity, ex:
Código: [Selecionar]
(
echo "00"; sleep 1
echo "33"; sleep 1
echo "66"; sleep 1
echo "100"
) |
zenity --progress --title="Aguarde..."

Se for pra seguir o original, uma saída é ler o arquivo enquanto o mencoder existe, algo como
Código: [Selecionar]
while [ -n "`mencoder`" ] ; do
      cat /tmp/mencoder-log | filtro | zenity --progress --title="Aguarde..."
done
O "filtro" é a remoção de qualquer coisa diferente da porcentagem.
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 06 de Maio de 2011, 20:11
Você pode tirar o "--percentage=", você só precisa passar a porcentagem pro zenity, ex:
Código: [Selecionar]
(
echo "00"; sleep 1
echo "33"; sleep 1
echo "66"; sleep 1
echo "100"
) |
zenity --progress --title="Aguarde..."

Se for pra seguir o original, uma saída é ler o arquivo enquanto o mencoder existe, algo como
Código: [Selecionar]
while [ -n "`mencoder`" ] ; do
      cat /tmp/mencoder-log | filtro | zenity --progress --title="Aguarde..."
done
O "filtro" é a remoção de qualquer coisa diferente da porcentagem.

Humm...
E como poderia ser esse filtro?

Tentei colocar o que já tinha no script:
Código: [Selecionar]
cat /tmp/mencoder-log$$ | sed '$!d;s/(.*)//;s/A.*//;s/V//' /tmp/mencoder-log$$  | zenity --progress --title "Aguarde..."Não funcionou. Ficou uma janela com um botão OK na tela direto. Eu dava OK e ela reaparecia, mesmo depois da conversão concluída.

Então tive a ideia de jogar o filtro para dentro do zenity:
Código: [Selecionar]
cat /tmp/mencoder-log$$ | zenity --progress --title "Aguarde..." --text $(sed '$!d;s/(.*)//;s/A.*//;s/V//' /tmp/mencoder-log$$)

Também não deu certo, porque dá erro no sed.

Então gerei outro log só com a saída e tentei inseri-lo no zenity:
Código: [Selecionar]
cat /tmp/mencoder-log$$ | sed '$!d;s/(.*)//;s/A.*//;s/V//' /tmp/mencoder-log$$  > /tmp/mencoder-percent$$ 2> /dev/null | zenity --progress --title "Aguarde..." --text $(cat /tmp/mencoder-percent$$)
E também não funcionou  :-\

Já a primeira opção, só funcionaria se a porcentagem estivesse associada ao mencoder, não? Ou eu estou enganado? E para ficar legal teria de ter mais parâmetros, pois vídeos grandes demorariam muito para a barra de progresso aumentar.

Mesmo com isso tudo, acredito que já estamos chegando no objetivo.
Título: Re: dbus, zenity e kdialog
Enviado por: irtigor em 06 de Maio de 2011, 20:59
Por isso tem o while, só que eu errei na verificação... o correto seria algo como
Código: [Selecionar]
while [ -n "`pidof mencoder`" ] ; doOnde "mencoder" é o nome exato do processo. O do firefox, por exemplo, é firefox-bin. Outra opção seria zerar o tamanho do arquivo no final e fazer a verificação enquanto ele tem tamanho... o importante é fazer o zenity parar de receber informação, caso contrário ele não ele não fecha mesmo, se quiser testar:
Código: [Selecionar]
while [ 1 ] ; do echo 100 | zenity --progress --title="Aguarde..."; done(vai ter que matar)
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 06 de Maio de 2011, 22:08
Desculpe, sou meio noob.

Tentei a linha while [ -n "`pidof mencoder`" ] ; do echo 100 | zenity --progress --title="Aguarde..."; done

Aparece a janela "aguarde"... com a barra toda cheia e um botão OK. Ela não desaparece sozinha, só quando dá OK.

Daí fiz o casamento:
Código: [Selecionar]
while [ -n "`pidof mencoder`" ] ; do
(
echo "00"; sleep 1
echo "33"; sleep 1
echo "66"; sleep 1
echo "100"
) |
 zenity --progress --title="Aguarde..."; done

Assim a barra vai enchendo, mas bem rápido, como havia imaginado, e se eu der OK ela enche de novo.

Mas afinal, o que eu fiz estava certo?

Título: Re: dbus, zenity e kdialog
Enviado por: irtigor em 07 de Maio de 2011, 00:51
- 0 é 0% de progresso, 33 é 33% de progresso, 66... por isso você deve pegar o pregresso apresentado no terminal.

- A condição é enquanto não é nulo (ou seja, enquanto o programa tem id -- está rodando)... se o processo ainda existe a janela vai ser recriada. Mas dá mudar pra, por exemplo, "while [ -e "/tmp/mencoder-log" ]" enquanto o mencoder-log existe (ai pra fechar você teria que colocar um rm apagando o logo depois do comando do mencoder). Olhe: http://aurelio.net/shell/canivete/#test
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 07 de Maio de 2011, 01:50
A parte da porcentagem eu até entendi. O que eu não entendi foi como associá-la ao log do mencoder.

Lá no script original tem uma parte que deleta o log:

Código: [Selecionar]
 #Remove o arquivo de log
  rm -f /tmp/mencoder-log$$

Mas isso é feito depois que a conversão acaba, naturalmente.

Outra coisa que não entendi foi o fato de ter um botão OK ativo, enquanto o cancelar está inativo. E se eu quiser parar o processo?

Estava dando uma olhada no Yad, um zenity "melhorado", e vi que lá dá para controlar melhor a criação de botões:
http://www.webupd8.org/2010/12/yad-zenity-on-steroids-display.html

Será que vale a pena trocar o zenty pelo yad?

Edit: achei isso:
http://code.google.com/p/yad/wiki/TimeoutIndicator

Colei o código dentro do script mas não funcionou também. E aqui também não tinha nenhum arquivo .gtkrc-2.0.
Título: Re: dbus, zenity e kdialog
Enviado por: irtigor em 07 de Maio de 2011, 09:29
-O botão "cancel" é desabilitado quando o progresso é 100% e o "ok" é habilitado. Sem uma opção de habilitar manualmente o botão (acho que não existe no zenity), vai ser necessário um recurso técnico do tipo: verifica se o mencoder informou progresso de 100, se ele ainda está rodando, mostre 99 caso contrário mostre 100.

-O zenity é meio engessado mesmo, mas não achei o yad vantagem nesse caso. O ideal seria escrever em algo que desse pleno controle, como python ou perl (poderia ser qualquer linguagem, desde que fosse possível usar o gtk sem amarras).
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 07 de Maio de 2011, 10:11
-O botão "cancel" é desabilitado quando o progresso é 100% e o "ok" é habilitado. Sem uma opção de habilitar manualmente o botão (acho que não existe no zenity), vai ser necessário um recurso técnico do tipo: verifica se o mencoder informou progresso de 100, se ele ainda está rodando, mostre 99 caso contrário mostre 100.


Mas é exatamente isso que o script faz usando o qdbus+kdialog. O tal loop.

Eu percebi que a barra do zenity aparece cheia porque o log foi criado, então eu cancelei a criação do log. Deixei o mencoder puro.
Código: [Selecionar]
~/.convert/mencoder | while [ -n "`pidof mencoder`" ] ; do
(
echo "00"; sleep 1
echo "33"; sleep 1
echo "66"; sleep 1
echo "100"
) |
 zenity --progress --title $"Mencoder" --text="por favor aguarde um instante." --auto-close --auto-kill; done

Com isso a barra passou a encher, mas daquele jeito: enche rápido e depois dá um loop, voltando a encher, sem parar, até depois da conversão.
(https://ubuntuforum-br.org/proxy.php?request=http%3A%2F%2Fimg51.imageshack.us%2Fimg51%2F4615%2Fcapturadetela4g.th.png&hash=8cac8e4419452b33ddf5db1de372cda908f7684f) (http://img51.imageshack.us/i/capturadetela4g.png/)

Se eu desabilito essas linhas que vem em baixo, e não sei para que servem, o script não funciona:
 IFS=$ORI_IFS
(...)
  IFS=$'\n'
fi
done
IFS=$ORI_IFS

Naquela página do shell, eu vi que tem uma opção de dar loop segundo um arquivo:
Citar
Loop nas linhas de um arquivo ou saída de comando
cat /etc/passwd | while read LINHA; do echo "$LINHA"; done
grep 'root' /etc/passwd | while read LINHA; do echo "$LINHA"; done
while read LINHA; do echo "$LINHA"; done < /etc/passwd
while read LINHA; do echo "$LINHA"; done < <(grep 'root' /etc/passwd)

De repente o caminho é por aí. Só não sei como se faz.
Título: Re: dbus, zenity e kdialog
Enviado por: irtigor em 07 de Maio de 2011, 11:02
No exemplo eu usei um valor arbitrário qualquer, é claro que ele não vai refletir o real progresso. Olhe a terceira mensagem.

---
A minha terceira mensagem.
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 07 de Maio de 2011, 11:30
Tirei tudo e deixei assim:
Código: [Selecionar]
~/.convert/mencoder | while [ -n "`pidof mencoder`" ] ; do
      zenity --progress --title $"Mencoder" --text="por favor aguarde um instante." --auto-close --auto-kill
done

Quase funcionou. A barra não enche mas pelo menos fecha sozinha depois que a conversão acaba.
Título: Re: dbus, zenity e kdialog
Enviado por: Kriptolix em 07 de Maio de 2011, 11:41
certo, venho lendo esse topico por que ha tempos ando procurando coisas sobre o d-bus, mas ate agora nao ache nada simples que desse pra entender. o que pude compreender desse script indica que o qdbus é usado para enviar progresso do mencoder para o dbus, de onde ele é lido pelo kdialog. Com certeza deve ser possivel fazer o mesmo com o zenity mas é complicado, tem que entender de d-bus.

acho que o primeiro passo é ver que tipo de saida o mencoder da quando esta convertendo, ele da alguma saida? se der vamos analiza-la e ver como poderiamos usar pra abastecer o zenity, talvez seja possivel fazer isso wsem necessidade de mexer no d-bus, tudo vai depender de que tipo de saida o mencoder da, se ele desse uma percentagem seria facilimo, se ele nao der nenhuma ae complica, so atraves de d-bus mesmo.
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 07 de Maio de 2011, 11:55
O mencoder dá porcentagem, sim. Veja o print do terminal no meu terceiro post.
Título: Re: dbus, zenity e kdialog
Enviado por: Kriptolix em 07 de Maio de 2011, 14:54
certo, é que aqui nao apareceu a imgem no forum, so quando cliquei em cima. sendo assim fica facil, basta pegar a saida padrao do mencoder, fazer um pipe rederecionando ela para um sed feito pra pegar so a percentagem, depois disso voce faz outro pipe jogando o resultado desse sed para o progress do zenity.

so testando pra ver, talvez possa ser feito assim direto "comando-do-mencoder | sed pra pegar a percentagem | zenity --progres ...etc", caso nao de certo assim direto é possivel tambem redirecionar a saida do mencoder para um arquivo dando um "tail -f" nesse arquivo e redirecionar o resultado do tail com um pipe para o progress do zenity.

eu ja fiz isso antes de ambas as formas, tou sem tempo de trabalhar nesse script diretamente agora mas creio que isso resolvera.

Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 07 de Maio de 2011, 19:55
O problema é que eu n tenho a mínima ideia de como se faz isso  :-\

Eu pensei em algo do tipo cut "parâmetro" para sumir com tudo q não é a porcentagem e jogar isso para o --percentage do zenity.
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 08 de Maio de 2011, 01:28
Encontrei uma informação que pode ajudar:

Citar

A opção --pulsate é útil aqui porque só estou dizendo "agüente aí que estou trabalhando". Não tenho nenhuma porcentagem real a oferecer, então essa opção faz a barra de progresso se mover de uma lado para o outro, que nem a luz no capô da Super Máquina. Se precisar exibir informações quanto ao nível de progresso, "ecoe" as porcentagens para o zenity:
Código: [Selecionar]
( for FILE in find $START_DIR --name $FILE_NAME;
do
echo 1;
echo $FILE >> $OUTPUT_FILE;
done
echo 100;
echo "#Todos os arquivos estão listados em $OUTPUT_FILE"
) | zenity --progress --percentage=0 --text "Procurando arquivos..." --title "Encontrar e listar arquivos";

http://www.hardware.com.br/artigos/zenity2/

Edit: agora está quente!

Este comando joga a saída do mencoder para um log (comando do script original):
Código: [Selecionar]
~/.convert/mencoder > /tmp/mencoder-log$$ 2> /dev/null &
Este lê a linha onde tem a porcentagem e joga em outro log:
Código: [Selecionar]
cat /tmp/mencoder-log$$ | sed '$!d' /tmp/mencoder-log$$ |  grep Pos  > /tmp/mencoder-percent$$ 2> /dev/null
E este lê o log da porcentagem e mostra apenas o valor numérico:
Código: [Selecionar]
cat /tmp/mencoder-percent$$ | sed '$!d;s/.*(//; s/%.*//'
Agora só faltam duas coisas: passar essa saída para a porcentagem do zenity e garantir que esses logs sejam atualizados (loop).
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 09 de Maio de 2011, 21:58
Na comunidade do Ubuntu no Orkut me deram a dica do seletor de arquivos:
Código: [Selecionar]
$ zenity --file-selection --multiple | tr '|' '\n'ou
Código: [Selecionar]
$ zenity --file-selection --multiple --separator='
> '

Já a da barra de progresso... empaquei
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 10 de Maio de 2011, 14:46
Progresso, progresso...

Quase não dormi ontem. Fiquei direto tentando resolver essa questão da barra. Consegui deixar ela finalmente 90%.
Vou postar tudo do jeito que está. Assim vocês podem me apontar o que está faltando para ficar 100%:

Código: [Selecionar]
#Executa o mencoder
IFS=$'\n'
/usr/share/lineduccontrolpanel/categories/others/convert/mencoder "$i" 2> /dev/null
chmod +x ~/.convert/mencoder
~/.convert/mencoder > /tmp/mencoder-log$$ 2> /dev/null &

 IFS=$ORI_IFS

#Aguarda 4 segundos para assegurar que o log ja foi criado
sleep 4

# Cria o log da porcentagem
 while [ -n "`pidof mencoder`" ] ; do
      cat /tmp/mencoder-log$$ |  grep Pos | sed '$!d;s/.*(//; s/%.*//' > /tmp/mencoder-percent$$ # 2> /dev/null
 done &

# Lê a porcentagem e joga para a barra
while [ -e "/tmp/mencoder-log$$" ] ; do
 (
 echo "00"; sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo "100"
 ) |
 zenity --progress --title "Mencoder" --auto-close --text "Convertendo, aguarde por favor. \n $i \n $(sed '$!d;s/(.*)//;s/A.*//;s/V//' /tmp/mencoder-log$$)"; done

  #Remove o arquivo de log
 rm -f /tmp/mencoder-log$$
 rm -f /tmp/mencoder-percent$$
 
  IFS=$'\n'
fi
done
IFS=$ORI_IFS

Do jeito que está, a barra vai enchendo até um certo ponto, depois o zenity fecha sozinho e abre aonde parou. Acho que se eu colocar 100 linhas "echo $(cat /tmp/mencoder-percent$$)", ele vai até o fim, mas penso que deve haver algo mais simples.

Dois problemas: o botão de cancelar não cancelou o processo e o zenity não fechou depois que a conversão terminou, pois o log não foi deletado. Tentei colocar um "&" depois do done, na linha do zenity, mas com isso o log foi deletado logo de cara.

Print:
(https://ubuntuforum-br.org/proxy.php?request=http%3A%2F%2Fimg4.imageshack.us%2Fimg4%2F3821%2Fprogresso.th.png&hash=a4674b393901e5a123c58a7dcad737d0878ad901) (http://img4.imageshack.us/i/progresso.png/)

PS: o vídeo "cobaia" foi o do galactus, rsrsrs.
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 11 de Maio de 2011, 23:54
Na comunidade do Orkut, um camarada me passou uma que funciona. Só que o botão de cancelar não está funcionando. Acredito que um "if alguma coisa" antes dos parâmetros da conversão (no original tinha um) e um elif ou else, não sei, para o cancelamento, o fariam funcionar.

O código como está:

Código: [Selecionar]
ORI_IFS=$IFS
 IFS=$'\n'
 for i in $(cat ~/.convert/videos); do
 IFS=$ORI_IFS

# if [ "$cancelado" != "yes" ]; then <---- esse era o original
#Executa o mencoder
IFS=$'\n'
/usr/share/lineduccontrolpanel/categories/others/convert/mencoder "$i" 2> /dev/null
chmod +x ~/.convert/mencoder
~/.convert/mencoder 2> /dev/null |
tr '\r' '\n' 2> /dev/null |
grep "^Pos:" 2> /dev/null|
sed -e 's/( *//;s/)//' 2> /dev/null|
awk '{ print $4 "\n#Aguarde (" $4 " " NR ")" }' 2> /dev/null |
zenity --progress --title=Conversão --auto-kill

  IFS=$'\n'
# fi
done
 IFS=$ORI_IFS
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 13 de Maio de 2011, 01:31
Ainda não consegui mas agora tenho certeza que estou quase lá.

Fiz uma coisa aqui que quase funcionou. "Quebrei" a primeira versão que me passaram na Ubuntu Brasil com um if:

Código: [Selecionar]
ORI_IFS=$IFS
IFS=$'\n'
for i in $(cat ~/.convert/videos); do
IFS=$ORI_IFS

#Executa o mencoder
IFS=$'\n'
/usr/share/lineduccontrolpanel/categories/others/convert/mencoder "$i" 2> /dev/null
chmod +x ~/.convert/mencoder
~/.convert/mencoder 2> /dev/null |

if [ -n "`mencoder`" ] ; then
tr '\r' '\n' 2> /dev/null |
grep "^Pos:" 2> /dev/null|
sed -e 's/( *//;s/)//' 2> /dev/null|
awk '{ print $4 "\n#Aguarde (" $4 " " NR ")" }' 2> /dev/null |
zenity --progress --title=Conversão --auto-kill

IFS=$'\n'
fi
done
IFS=$ORI_IFS

if [ $? = 0 ] ; then
zenity --title="Ops !" --info --text "Operação cancelada pelo operador !"
exit 2;
fi

Agora falta só acertar o tipo de "if", pois do jeito que está, o aviso de cancelamento aparece também quando o vídeo é concluído.
Título: Re: dbus, zenity e kdialog
Enviado por: vampire_thunder em 15 de Maio de 2011, 10:26
Finalmente funcionou, graças a dica do usuário Passageiro, da comunidade do Ubuntu. Ele me indiciou a colocar o "if" na linha do zenity.
O código ficou assim:

Código: [Selecionar]
##############
## CONVERTENDO
##############


 ORI_IFS=$IFS
 IFS=$'\n'
 for i in $(cat ~/.convert/videos); do
 IFS=$ORI_IFS

#Executa o mencoder
 IFS=$'\n'
/usr/share/lineduccontrolpanel/categories/others/convert/mencoder "$i" 2> /dev/null
chmod +x ~/.convert/mencoder
~/.convert/mencoder > /tmp/mencoder-log$$ 2> /dev/null &

 IFS=$ORI_IFS

#Aguarda 4 segundos para assegurar que o log ja foi criado
sleep 4

# Cria o log da porcentagem
 while [ -n "`pidof mencoder`" ] ; do
      cat /tmp/mencoder-log$$ |  grep Pos | sed '$!d;s/.*(//; s/%.*//' > /tmp/mencoder-percent$$ # 2> /dev/null
 done &

# Lê a porcentagem e joga para a barra de progresso
while [ -n "`pidof mencoder`" ] ; do

 (
 echo "00"; sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3 
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo $(cat /tmp/mencoder-percent$$); sleep 3
 echo "100"
 ) |
   if zenity --progress --title "Mencoder" --auto-close --text "Convertendo, aguarde por favor. \n $i \n $(sed '$!d;s/(.*)//;s/A.*//;s/V//' /tmp/mencoder-log$$)"; then
     zenity --title="Fim" --info --text "Fim normal de operação"
   else
     zenity --title="Ops !" --error --text "Operação cancelada pelo operador !"
     killall mencoder
   fi
done

  #Remove o arquivo de log
 rm -f /tmp/mencoder-log$$
 rm -f /tmp/mencoder-percent$$
 
  IFS=$'\n'
 done
IFS=$ORI_IFS

Resultado:
(https://ubuntuforum-br.org/proxy.php?request=http%3A%2F%2Fimg862.imageshack.us%2Fimg862%2F3491%2Fcapturadetela1g.th.png&hash=0fa0be870a96d2c3f5f2b3f3042dfd8e8a0869b5) (http://img862.imageshack.us/i/capturadetela1g.png/)

A parte do echo que enche a barra ainda precisa melhorar, pois se o vídeo for grande, a mensagem "Fim normal de operação" aparece várias vezes antes da conversão realmente terminar.
Outro pequeno problema é que está demorando muito para a tela de conversão concluída aparecer:
(https://ubuntuforum-br.org/proxy.php?request=http%3A%2F%2Fimg807.imageshack.us%2Fimg807%2F3650%2Fcapturadetela2.th.png&hash=ad50d45f73707a05510c24c45fb2d84a9523fda0) (http://img807.imageshack.us/i/capturadetela2.png/)