Evince

De Pontão Nós Digitais
Revisão de 18h58min de 22 de julho de 2011 por V1z (discussão | contribs)

(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)

O que é?

Evince é um visualizador de documentos de múltiplos formatos.

O seu objetivo é substituir os diversos visualizadores (diferentes) de documentos que existe no GNOME por apenas um aplicativo simples.

Git

Para obter a última versão do evince pelo git, pode-se usar o comando

git clone git://git.gnome.org/evince

E também será necessário utilizar algumas bibliotecas do poppler,

git clone git://git.freedesktop.org/git/poppler/poppler

Outros comandos

Informações

Bug List

Lista de e-mail do Evince

Documentação do Código

IRC: #evince , no servidor irc.gimp.net

Desenvolvimento

Nivaldo Bondança

- A princípio, na parte de compilação, tive basante dificuldade com as dependências.

- Acabei tendo que pegar as versões mais recentes das autotools do linux para poder compilar o código.

- Tentei por bastante tempo consertar alguns bugs, mas descobri que isso não é muito possível sem conhecer a biblioteca Gtk.

- Depois de estudar bastante a Gtk, consegui consertar um bug e até já postei o patch.

Daniel Calocci

Primeiras Experiências

Alexandre Koji Imai Negrão

Compilando

Pacotes mais problemáticos:

gtk+ - http://ftp.gnome.org/pub/gnome/sources/gtk+/3.0/gtk+-3.0.10.tar.gz
gio - sudo apt-get install libghc6-gio-dev
gnome-keyring - sudo apt-get install libgnome-keyring-dev

Comando de configuração:

./autogen.sh --disable-nautilus

Sem o disable nautilus não foi.

Vídeo do dia(13/07/2011): http://vimeo.com/26397065

Problema com as libraries depois da instalação, na hora de executar o Evince - sudo ldconfig

Corrigindo um bug

A primeira dificuldade consistia em encontrar um bug que eu conseguisse resolver, considerando o tamanho do projeto, para resolver um bug até sexta-feira teria que ser algo simples. Fui para a lista de bugs do Evince e procurei um "Easy fix": https://bugzilla.gnome.org/show_bug.cgi?id=648115

A facilidade nesse bug era a string. Sabia que ela deveria aparecer completa em algum lugar, fui até a pasta do Evince e digitei:

find . -name "*.c" | xargs grep -in "end of presentation"

o que retornou o arquivo /libview/ev-view-presentation.c

Dentro do arquivo, houve grande dificuldade em entender o código, principalmente por eu não conhecer o Gtk. Após estudar um pouco da teoria de signals e callbacks do Gtk, pude ter uma compreensão muito melhor, assim tentei traçar a origem da chamada do "end of presentation", e concomitantemente, do clique do mouse que faria sair da apresentação.

ev_view_presentation_draw_end_page () -> ev_view_presentation_draw ()
case EV_PRESENTATION_END:
               ev_view_presentation_draw_end_page (pview, cr);

descobri a flag booleana que marcava a condição de fim da apresentação, resolvi traçar ela e encontrei a função que levantava essa flag:

ev_view_presentation_set_end () -> ev_view_presentation_next_page ()

consequentemente, cheguei na função:

ev_view_presentation_change_page ()

Esta função era a que decidia a mudança de páginas e possuia uma flag booleana (GTK_SCROLL_PAGE_FORWARD) que decidia quando ir para a próxima página da apresentação. Assim sendo, eu já saberia onde editar para corrigir o bug. resolvi seguir a flag para ver se encontrava o clique do mouse/setas associad@s a flag. eis o que encontrei:

add_change_page_binding_keypad (binding_set, GDK_KEY_Right, 0, GTK_SCROLL_PAGE_FORWARD);
add_change_page_binding_keypad (binding_set, GDK_KEY_Down,  0, GTK_SCROLL_PAGE_FORWARD);

chegando na função ev_view_presentation_class_init (), onde todos os bindings estavam sendo inicializados. Assim pude ver todas as funções relacionadas às teclas e ao mouse.

widget_class->button_release_event = ev_view_presentation_button_release_event;

Sabia que esse evento estava relacionado ao mouse, pois se estivesse ao teclado não seria 'button', seria 'key'. Dentro da função encontrei o que eu esperava:

 if (pview->state == EV_PRESENTATION_END) {
                       g_signal_emit (pview, signals[FINISHED], 0, NULL);

Sendo este exatamente o sinal de final de apresentação emitido pelo mouse somente quando a flag EV_PRESENTATION_END estava levantada(na tela preta do final da apresentação), não hesitei em usá-lo para terminar a apresentação de outra forma.