lunes, 20 de febrero de 2017

Explicacion del bug en el atajo Alt + Up/Down

Siguiendo con el bug en gedit encontrado , veremos la parte de código donde se produce este , estudiándolo para así llegar a la solución.

primeramente eh visto que el bug no es de gedit sino del widget GtksourceView que afecta no solo a gedit sino a toda aplicación (de gnome)  que haga uso de esta .Entonces veamos el código donde se produce el bug :

*Segun lo visto este es el codigo donde se produce auqnue al modificarlo y compilarlo igual sigue apareciendo , lo que quiza no sea le codigo si alguien sabe si es el codigo del cambio d elinea al hacr atl+up porfavor confirmarmelo*

*Como recomendación , estudiar los archivos para saber que hace cada uno de ellos , usar búsqueda en los archivos (grep) para llegar mas rápido a la parte donde podríamos encontrar el bug*


Nos enfocaremos en el archivo gtksourceview.c , lo podemos ubicar en la carpeta fuente de GtksourceView (https://github.com/GNOME/gtksourceview).

Exactamente nos situaremos en la siguiente linea de codigo y estudiaremos su comportamiento para poner en evidencia el bug:




                                                                                















veamos solo algunas partes del código con un ejemplo :


*Se tendrán dos casos  , cuando la linea se cambiara hacia arriba y cuando la linea se cambiara hacia abajo *


GtkTextBuffer *buf;

                      linea1\n                                     
                      linea2\o

   Tendremos un buffer que en un principio contendrá lo mostrado.
   
        gtk_text_buffer_get_selection_bounds (buf, &s, &e):   s y e serán los limites de acuerdo a donde este el cursor:


             linea1\n                   (s)linea1\n(cursor)(e)
          (s)linea2\o(cursor)(e)          linea2\o
                                        
                                        
text = gtk_text_buffer_get_slice (buf, &s, &e, TRUE) : se cortara la lunea entre los limites (s,e) guardandolo en una variable text

Caso 1:                                   Caso 2 :

       text  =  linea2\o                     text =  linea1\n


tk_text_iter_is_end (&e): veremos que si es un final de archivo es decir no presenta un retorno de carro\r o un salto de linea\n  (Caso 1) se agregara  a "text" el salto de linea teniendo : 

    tmp = g_strdup_printf ("%s\n", text); // se agrega el salto de linea

                         text = linea2\n 

*Ojo  en esta parte se nos asegura que sera la ultima linea del documento , justo el caso donde se produce el bug , mas adelante se vera que aqui viene la modificación para solucionar el bug solo viendo que en el buffer = linea1\n tendremos que borrar ese salto de linea*


gtk_text_buffer_delete (buf, &s, &e) : Se eliminara del buffer el text que este entre los limites(s,e) re localizando estos.

En el buffer se tendra ahora esto:

Caso 1:                         Caso 2 :

        linea1\n(s,e)                   (s,e)linea2\n


f (down)
{
gtk_text_iter_forward_line (&e) : si es el segundo caso el iterador e se movera al final de la linea teniendo :
                                 

Caso 1:                         Caso 2 :
       linea1\n(s,e)                     (s)linea2\o(e)



if (gtk_text_iter_is_end (&e)): si es final de archivo se agregara como en el caso 1 el salto de linea



gtk_text_buffer_insert (buf, &e, "\n", -1); //se inserta \n

En el buffer tendremos :

Caso 1:                          Caso 2 :

       linea1\n(s,e)                      (s)linea2\n(e)

*Ojo aqui nos asegura que hay un \o es decir que es final del archivo por lo que esto nos indicara que estamos en el caso donde se produce el bug por lo que si se ve lo que hay en la variable text = linea1\n solo tendremos que borrar aqui ese salto de linea *

else { gtk_text_iter_backward_line (&e) : pasamos al caso 1 moviendo hacia al principio de linea el iterador e :

En el buffer tendremos :

Caso 1:                          Caso 2 :


       (e)linea1\n(s)                    (s)linea2\n(e)


y en text tendremos

Caso 1:                           Caso 2 :
        linea2\n                          linea1\n



gtk_text_buffer_insert (buf, &e, text, -1):juntaremos en el buffer lo que tenemos en text



Caso 1:                           Caso 2 :
       (e)linea2\n                        (s)linea2\n
          linea1\n(s)                        linea1\n(e)  


Veamos aqui que se ve claramente el bug , al no borrar en los casos indicados el salto de linea  "\n"
a la hora de la inserción este quedara aun en la linea ,  en las condicionales que nos indican que estamos al final del archivos tenemos que borrar ese \n.

----------
Al querer compilar GtksourceView en fedora25 hay algunos errores por lo que la solucione esta por probarse antes de publicarse.


















No hay comentarios:

Publicar un comentario