Eae pessoal, tudo jóia ???
Pessoal, nesse fim de semana dei uma adiantada boa nos trecos do
LinuxCall... a coisa ainda tá feia pro meu lado aki, mas já deu prá
implementar um monte de coisa... :)
Estou mandando uns screens dessa interface em gtk procês verem como tá
ficando e poderem opinar... ;-)
O BETA da interafce em gtk está quase lá... as telas já estão prontas, e
agora estou trabalhando na interligação com os scripts (muda
completamente a maneira, em relação à interface em XSTEP.)
Gostaria, inclusive, de uma opinião dos coders... ;-)
Coders, em aplicativos gráficos, não é possível a utilização de loops
infinitos, whiles demorados, etc. Pq o toolkit precisa estar o tempo
todo no controle, para que possa redesenhar a janela na tela, interagir
com o window manager, etc...
Quando abrimos o pipe que interliga os scripts (popen(comando...))
precisamos ler as saídas dele ... fgets(....)... o problema, é que esse
loop de leitura pára o toolkit...
Com a ajuda do Marcelo Samsoniuk (autor da xstep), consegui implementar
isso na interface XSTEP da seguinte forma:
Criei um rotina que recebe os dados do pipe (com o fgets, tal) e
associei-a ao evento broadcast da xstep. Esse evento broadcast, seria o
evento de redesenho da tela. Setando animate=1 no programa, o toolkit
gera esses eventos permanentemente...
Ou seja, fiz com que o toolkit chamasse de tempos em tempos (coisa de
milissegundos) a func que recebe as saídas do pipe.
Preciso implementar a mesma coisa no GTK, mas ele não possui o broadcast
como o da Xstep... :)
Pensei em usar threads, mas adicionaríamos uma complexidade enorme para
algo simples...
Olhando alguns programas feitos em GTK que trabalham em tempo real,
observei que eles fazem o seguinte:
Através da função gtk_timeout_add, eles especificam uma determinada
função para que seja executada de tempos em tempos (se não me engano,
uma vez por segundo)...
Bem, essa seria a solução, mas ao implementar a seguinte rotina, tenho
obtido seguidos "SegFaults".... com broken pipes....
static void dial_to_isp(GtkWidget *widget, gpointer data)
{
pipe_ptr = popen(comando, "r");
if (!pipe_ptr) g_print("Problemas com o pipe de discagem!!!\n");
else {
zera_buffers(); /* Limpa os labels */
g_print("Labels limpos...\n");
gtk_widget_show(fix_disca); /* Modifica a janela */
g_print("Tela de discagem exibida...\n");
tmp_timer = gtk_timeout_add(T_MAX, get_messages, janela_principal);
g_print("Timer ativado...\n");
}
}
Ok. Na timeout_add, eu passo como parâmetros:
T_MAX ... definido no começo do arkivo com o valor 100000 ... trata-se
do número de vezes que o timeout irá rodar... chutei alto ??? :P
get_messages ... função que recebe a saída do pipe e manda prá tela (nos
labels)...
janela_principal ... widget ao qual o timeout está associado... se
destruirmos ela, o timeout vai junto (pelo que eu entendi... ;-)))
Ok. Pessoal, alguém aí poderia me ajudar ??? ;-)
Ah! ... depois que o pipe encerra (o script termina), devemos remover o
timer, com a função gtk_timeout_remove (timer)...
É isso ae coders, falta muito pouco prá que o BETA gtk esteja tão
funcional quanto o feito em XSTEP... :) vamos lá, não desanimem...
[]'s
--
André Casteliano
Analista de Sistemas
+-=-=[ dig...@us...]=-=-+
[ Linux User: # 178853 Machine: # 79923 ]
[ Linux Heavy User - Powered by Slackware 7.1 ]
[ http://www.geocities.com/andre_casteliano/ ]
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
[ LinuxCall - The Linux Dialer ]
[ http://linuxcall.sourceforge.net ]
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ |