[Buoh-dev] Parche para guardar un comic como jpeg



El mar, 16-08-2005 a las 16:31 +0200, Esteban S?nchez escribi?:
> > El lun, 15-08-2005 a las 21:34 +0200, Esteban S?nchez escribi?:
> > > Pues como hemos estado hablando antes de esto, al final me he
> picado y
> > > he hecho el guardar un comic a disco. Este es el c?digo, espero
> > > opiniones :)
> > 
> > hay una cosa que no veo del todo claro. Por que se guarda solo en
> jpeg?
> > quiero decir, guardar una copia es pillar el comic y guardarlo tal
> cual
> > al disco. Si el comic es png o gif y se lo guardamos en jpeg en
> realidad
> > no estamos guardando una copia, lo estamos exportando a otro
> formato. Yo
> > creo que una de dos: o lo llamamos exportar a jpeg o tratamos de
> > respetar el formato que tiene. 
> 
> > Para respetar el formato tenemos dos posibilidades: con
> gdk_pixbuf_save
> > y usando gdk_pixbuf_format_is_writable para ver si el formato est?
> > soportado. Si lo est?, se guarda y si no se le dice al usuario que
> el
> > formato no est? soportado y que se exportar? o algo as?; la otra
> > posibilidad es bajar directamente el comic y guardarlo en disoc tal
> > cual, bit a bit y nos evitamos problemas de formatos.
> 
> Estuve mirando esas funciones y no termin? de verlo claro. Al final lo
> dej? as? pero con idea de seguir mejorandolo en ese aspecto, as? que
> me
> pondr? con ello para permitir exportar a otros formatos. Sin embargo,
> la mayor?a de los comics son GIF y el GdkPixbuf solo permite PNG,
> JPEG,
> ICO y BMP...

vale, pero en ese caso o bajamos el comic y lo guardamos, o le decimos
que le vamos a cambiar el formato, o lo llamamos exportar a jpeg. 

> > Ahora paso de todas formas a comentarte cosas sobre el parche
> > 
> > > Saludos!
> > > 
> > > 
> 
> <snip>
> > > Index: po/Makefile.in.in
> > >
> ===================================================================
> > > RCS file: /cvsroot/buoh/buoh/po/Makefile.in.in,v
> > > retrieving revision 1.2
> > > diff -u -p -u -r1.2 Makefile.in.in
> > > --- po/Makefile.in.in   4 Aug 2005 19:48:12 -0000       1.2
> > > +++ po/Makefile.in.in   15 Aug 2005 19:31:17 -0000
> > > @@ -32,13 +32,13 @@ VPATH = @srcdir@
> > >  prefix = @prefix@
> > >  exec_prefix = @exec_prefix@
> > >  datadir = @datadir@
> > > +datarootdir = @datarootdir@
> > >  libdir = @libdir@
> > >  localedir = $(libdir)/locale
> > >  gnulocaledir = $(datadir)/locale
> > >  gettextsrcdir = $(datadir)/glib-2.0/gettext/po
> > >  subdir = po
> > >  install_sh = @install_sh@
> > > -mkdir_p = @mkdir_p@
> > >  mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
> > >  
> > >  INSTALL = @INSTALL@
> > 
> > este es un fichero generado por el condifure y por lo tanto no
> deber?a
> > estar en el CVS (y menos es un parche)
> 
> Me extra?o verlo cuando ech? un vistazo rapido al parche y como me lio
> un mont?n con estos ficheros prefer? dejarlo...
> 
> > > Index: src/buoh-view.c
> > >
> ===================================================================
> > > RCS file: /cvsroot/buoh/buoh/src/buoh-view.c,v
> > > retrieving revision 1.6
> > > diff -u -p -u -r1.6 buoh-view.c
> > > --- src/buoh-view.c     15 Aug 2005 15:04:09 -0000      1.6
> > > +++ src/buoh-view.c     15 Aug 2005 19:31:19 -0000
> > > @@ -587,3 +587,4 @@ buoh_view_clear (BuohView *view)
> > >  {
> > >          gtk_notebook_set_current_page (GTK_NOTEBOOK (view),
> > > VIEW_PAGE_EMPTY);
> > >  }
> > > +
> > 
> > interesante cambio :-DD
> 
> Uno de esos que cambias sin querer... Creo que sigue compilando :P
> Ahora
> lo quito para que no salga en el parche (hay que hacer de nuevo
> autogen,
> sorry)

era broma, eso pasa mucho

> > > Index: src/buoh-window.c
> > >
> ===================================================================
> > > RCS file: /cvsroot/buoh/buoh/src/buoh-window.c,v
> > > retrieving revision 1.5
> > > diff -u -p -u -r1.5 buoh-window.c
> > > --- src/buoh-window.c   5 Aug 2005 09:14:54 -0000       1.5
> > > +++ src/buoh-window.c   15 Aug 2005 19:31:21 -0000
> > > @@ -59,6 +59,8 @@ static void buoh_window_menu_quit_cb    
> > >                                                         gpointer
> > > gdata);
> > >  static void buoh_window_menu_add_cb
> (GtkMenuItem
> > > *menuitem,
> > >                                                         gpointer
> > > gdata);
> > > +static void buoh_window_menu_save_cb
> (GtkMenuItem
> > > *menuitem,
> > > +                                                       gpointer
> > > gdata);
> > >  static void buoh_window_menu_properties_cb
> (GtkMenuItem
> > > *menuitem,
> > >                                                         gpointer
> > > gdata);
> > >  static void buoh_window_menu_zoom_in_cb
> (GtkMenuItem
> > > *menuitem,
> > > @@ -242,6 +244,10 @@ buoh_window_init (BuohWindow *buoh_windo
> > >         g_signal_connect (G_OBJECT (widget), "activate",
> > >                           G_CALLBACK (buoh_window_menu_add_cb),
> > >                           (gpointer) buoh_window);
> > > +       widget = glade_xml_get_widget (buoh_window->priv->gui,
> > > "menu_save");
> > > +       g_signal_connect (G_OBJECT (widget), "activate",
> > > +                         G_CALLBACK (buoh_window_menu_save_cb),
> > > +                         (gpointer) buoh_window);
> > >         widget = glade_xml_get_widget (buoh_window->priv->gui,
> > > "menu_properties");
> > >         g_signal_connect (G_OBJECT (widget), "activate",
> > >                           G_CALLBACK
> (buoh_window_menu_properties_cb),
> > > @@ -378,6 +384,65 @@ buoh_window_menu_add_cb (GtkMenuItem *me
> > >  }
> > >  
> > >  static void
> > > +buoh_window_menu_save_cb (GtkMenuItem *menuitem, gpointer gdata)
> > > +{
> > > +       GtkWidget     *chooser;
> > > +       GtkFileFilter *filter;
> > > +       gchar         *suggested;
> > > +       gchar         *name;
> > > +       gchar         *page;
> > > +       gchar         *filename = "juas.png";
> > 
> > juas.png??? que es esto tio?
> 
> Una de las pruebas que se te olvida quitar...

no hay ninguna prisa, revisa bien los parches.

> > > +       BuohWindow    *window = BUOH_WINDOW (gdata);
> > > +       BuohComic     *comic;
> > > +       GdkPixbuf     *pixbuf;
> > > +       GtkWidget     *dialog;
> > > +
> > > +       filter = gtk_file_filter_new ();
> > > +       gtk_file_filter_set_name (filter, _("JPEG Images"));
> > 
> > debes decirle al filtro cual es el patr?n de los archivos adem?s del
> > nombre
> 
> Ok
> 
> > > +               
> > > +       chooser = gtk_file_chooser_dialog_new (_("Save comic"),
> > > +                                              GTK_WINDOW
> (window),
> > > +
> > > GTK_FILE_CHOOSER_ACTION_SAVE,
> > > +                                              GTK_STOCK_CANCEL,
> > > GTK_RESPONSE_CANCEL,
> > > +                                              GTK_STOCK_SAVE,
> > > GTK_RESPONSE_ACCEPT,
> > > +                                              NULL);
> > > +       gtk_file_chooser_set_do_overwrite_confirmation
> > > (GTK_FILE_CHOOSER (chooser), TRUE);
> > > +       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser),
> > > filter);
> > > +       
> > > +       comic     = buoh_view_get_comic (window->priv->view);
> > > +       name      = buoh_comic_get_title (comic);
> > > +       page      = buoh_comic_get_page (comic);
> > > +       suggested = g_strconcat (name, " (", page, ").jpeg",
> NULL);
> > > +       
> > > +       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER
> (chooser),
> > > +                                          suggested);
> > > +       
> > > +       if (gtk_dialog_run (GTK_DIALOG (chooser)) ==
> > > GTK_RESPONSE_ACCEPT)
> > > +       {
> > 
> > esa llave deber?a estar arriba
> 
> Cierto
> 
> > > +               pixbuf   = buoh_comic_get_pixbuf (comic);
> > > +               filename = gtk_file_chooser_get_filename
> > > (GTK_FILE_CHOOSER (chooser));
> > > +               
> > > +               if (!gdk_pixbuf_save (pixbuf, filename, "jpeg",
> NULL,
> > > NULL)) {
> > > +                       dialog = gtk_message_dialog_new
> (GTK_WINDOW
> > > (window),
> > > +
> > > GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
> > > +
> > > GTK_MESSAGE_ERROR,
> > > +
> > > GTK_BUTTONS_CLOSE,
> > > +                                                        _("Unable
> to
> > > save comic"));
> > > +                       gtk_dialog_run (dialog);
> > > +                       gtk_widget_destroy (dialog);
> > > +               }
> > > +               g_free (filename);
> > > +       }
> > > +
> > > +       g_object_unref (pixbuf);
> > > +       g_free (name);
> > > +       g_free (page);
> > > +       g_free (suggested);
> > > +       gtk_widget_destroy (chooser);
> > > +       g_object_unref (filter);
> > 
> > mania mia, pero prefiero que las cosas se vayan liberando segun se
> vayan
> > dejando de necesitar en vez de todo al final. Creo que es mas facil
> que
> > no se olvide nada, pero bueno, es mania mia, no digo que est? mal ni
> > mucho menos.

mas abajo veras que mis manias tienen algo de sentido (lo siento pero es
que me lo has puesto a huevo con tu parche)

> Yo prefiero abajo, as? hay un paralelismo entre las variables
> declaradas
> y las liberadas. Manias, manias... :)

eso es muy bonito, pero fuente de problemas, mas abajo ver?s por qu?

> > > +}
> > > +
> > 
> > varias cosas sobre esta funci?n. El filechooser debe ser un dialogo
> > modal. El tema es que cuando se ejecuta el callback, pillas el comic
> que
> > hay en la vista, ya que es el que se quiere guardar. Si el dialogo
> no es
> > modal, se podr?a cambiar el comic de la vista seleccionando otro de
> la
> > lista y ser?a confuso para el user saber que comic es el que se va a
> > guardar (que nosotros sabemos que es el que hab?a cuando se
> seleccion?
> > el menu)
> 
> A mi me sale modal.

toda la raz?n, es que no apliqu? el parche, solo vi el c?digo y como no
vi que lo ponias modal, no sab?a que lo era por defecto, sorry 

> > Por otro lado, si el usuario va a guardar varios comics es muy
> probable
> > que quiera guardarlos en la misma carpeta (por el principio de
> localidad
> > espacial, hoy estuve empollando AIC) por lo que conviene "recordar"
> el
> > ?ltimo directorio accedido en la sessi?n. Para ello basta con usar
> una
> > variable static que guarde la uri de la carpeta.
> 
> Pensaba que era m?s dificil pillar la carpeta, pero luego resulta que
> hay una funci?n en el file chooser, as? que lo cambio en un plis.

insisto en lo del plis, no hay prisa, mas abajo ver?s por que te digo
esto

> > En cuanto al di?logo de error, tiene alguna posiblidad el usuario?
> por
> > que podr?a fallar? lo digo porque si algo falla y el usuario puede
> hacer
> > algo, en este caso se cerrar?n el message_dialog y el fielchooser,
> con
> > lo que el user tendr? que volver a seleccionar guardar en el menu
> para
> > volver a intentarlo. Si hay posibilidad de rectificar para el
> usuario,
> > lo suyo es hacer un bucle y en caso de error volver a hacer el run
> para
> > que el usuario pueda volver a probar en el mismo filechooser.
> 
> Podr?a fallar porque no tuviese permisos de escritura (prueba a
> guardar
> en /). Lo que no he conseguido es sacar el error, porque el
> gdk_pixbuf_save () falla si le pasas un GError (curioso).

como declaras el error y como se lo pasas? porque funciona
perfectamente . . . 

> Tienes raz?n con lo del bucle. No me di cuenta. Voy a cambiarlo.

de nuevo se ve que lo has cambiado con prisas (lo comento abajo)

> > > +static void
> > >  buoh_window_menu_properties_cb (GtkMenuItem *menuitem, gpointer
> > > gdata)
> > >  {
> > >         BuohWindow *window = BUOH_WINDOW (gdata);
> > > @@ -556,6 +621,7 @@ buoh_window_comic_actions_set_sensitive 
> > >         buoh_window_zoom_out_set_sensitive (window, sensitive);
> > >         buoh_window_normal_size_set_sensitive (window, sensitive);
> > >         buoh_window_set_sensitive (window, "menu_properties",
> > > sensitive);
> > > +       buoh_window_set_sensitive (window, "menu_save",
> sensitive);
> > >  }
> > >  
> > >  static void
> 
> 
> Ahi va el nuevo parche
> 
> -- 
> Esteban S?nchez
>  esteban steve-0 com
>  http://steve-o.org
>  http://subanales.com/
>  ------------------------------------------------
>  PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xB6E0F8AF

> Index: interfaces/buoh.glade
> ===================================================================
> RCS file: /cvsroot/buoh/buoh/interfaces/buoh.glade,v
> retrieving revision 1.6
> diff -u -p -u -r1.6 buoh.glade
> --- interfaces/buoh.glade       26 Jul 2005 22:04:44 -0000      1.6
> +++ interfaces/buoh.glade       16 Aug 2005 14:30:58 -0000
> @@ -45,6 +45,27 @@
>                   </child>
>  
>                   <child>
> +                   <widget class="GtkImageMenuItem" id="menu_save">
> +                     <property name="visible">True</property>
> +                     <property name="label"
> translatable="yes">_Guardar una copia</property>

el nombre est? en castellano?????

> +                     <property name="use_underline">True</property>
> +                     <signal name="activate"
> handler="on_menu_save_activate"/>
> +
> +                     <child internal-child="image">
> +                       <widget class="GtkImage" id="image248">
> +                         <property name="visible">True</property>
> +                         <property name="stock">gtk-save</property>
> +                         <property name="icon_size">1</property>
> +                         <property name="xalign">0.5</property>
> +                         <property name="yalign">0.5</property>
> +                         <property name="xpad">0</property>
> +                         <property name="ypad">0</property>
> +                       </widget>
> +                     </child>
> +                   </widget>
> +                 </child>
> +
> +                 <child>
>                     <widget class="GtkImageMenuItem"
> id="menu_properties">
>                       <property name="visible">True</property>
>                       <property name="label">gtk-properties</property>
> @@ -87,7 +108,7 @@
>                       <accelerator key="plus"
> modifiers="GDK_CONTROL_MASK" signal="activate"/>
>  
>                       <child internal-child="image">
> -                       <widget class="GtkImage" id="image229">
> +                       <widget class="GtkImage" id="image249">
>                           <property name="visible">True</property>
>                           <property
> name="stock">gtk-zoom-in</property>
>                           <property name="icon_size">1</property>
> @@ -108,7 +129,7 @@
>                       <accelerator key="minus"
> modifiers="GDK_CONTROL_MASK" signal="activate"/>
>  
>                       <child internal-child="image">
> -                       <widget class="GtkImage" id="image230">
> +                       <widget class="GtkImage" id="image250">
>                           <property name="visible">True</property>
>                           <property
> name="stock">gtk-zoom-out</property>
>                           <property name="icon_size">1</property>
> @@ -129,7 +150,7 @@
>                       <accelerator key="0"
> modifiers="GDK_CONTROL_MASK" signal="activate"/>
>  
>                       <child internal-child="image">
> -                       <widget class="GtkImage" id="image231">
> +                       <widget class="GtkImage" id="image251">
>                           <property name="visible">True</property>
>                           <property
> name="stock">gtk-zoom-100</property>
>                           <property name="icon_size">1</property>
> @@ -163,7 +184,7 @@
>                       <accelerator key="Page_Up" modifiers="0"
> signal="activate"/>
>  
>                       <child internal-child="image">
> -                       <widget class="GtkImage" id="image232">
> +                       <widget class="GtkImage" id="image252">
>                           <property name="visible">True</property>
>                           <property
> name="stock">gtk-go-back</property>
>                           <property name="icon_size">1</property>
> @@ -184,7 +205,7 @@
>                       <accelerator key="Page_Down" modifiers="0"
> signal="activate"/>
>  
>                       <child internal-child="image">
> -                       <widget class="GtkImage" id="image233">
> +                       <widget class="GtkImage" id="image253">
>                           <property name="visible">True</property>
>                           <property
> name="stock">gtk-media-forward</property>
>                           <property name="icon_size">1</property>
> @@ -211,7 +232,7 @@
>                       <accelerator key="Home"
> modifiers="GDK_CONTROL_MASK" signal="activate"/>
>  
>                       <child internal-child="image">
> -                       <widget class="GtkImage" id="image234">
> +                       <widget class="GtkImage" id="image254">
>                           <property name="visible">True</property>
>                           <property
> name="stock">gtk-goto-first</property>
>                           <property name="icon_size">1</property>
> @@ -232,7 +253,7 @@
>                       <accelerator key="End"
> modifiers="GDK_CONTROL_MASK" signal="activate"/>
>  
>                       <child internal-child="image">
> -                       <widget class="GtkImage" id="image235">
> +                       <widget class="GtkImage" id="image255">
>                           <property name="visible">True</property>
>                           <property
> name="stock">gtk-goto-last</property>
>                           <property name="icon_size">1</property>
> Index: src/buoh-window.c
> ===================================================================
> RCS file: /cvsroot/buoh/buoh/src/buoh-window.c,v
> retrieving revision 1.5
> diff -u -p -u -r1.5 buoh-window.c
> --- src/buoh-window.c   5 Aug 2005 09:14:54 -0000       1.5
> +++ src/buoh-window.c   16 Aug 2005 14:31:02 -0000
> @@ -59,6 +59,8 @@ static void buoh_window_menu_quit_cb    
>                                                         gpointer
> gdata);
>  static void buoh_window_menu_add_cb                    (GtkMenuItem
> *menuitem,
>                                                         gpointer
> gdata);
> +static void buoh_window_menu_save_cb                   (GtkMenuItem
> *menuitem,
> +                                                       gpointer
> gdata);
>  static void buoh_window_menu_properties_cb             (GtkMenuItem
> *menuitem,
>                                                         gpointer
> gdata);
>  static void buoh_window_menu_zoom_in_cb                (GtkMenuItem
> *menuitem,
> @@ -242,6 +244,10 @@ buoh_window_init (BuohWindow *buoh_windo
>         g_signal_connect (G_OBJECT (widget), "activate",
>                           G_CALLBACK (buoh_window_menu_add_cb),
>                           (gpointer) buoh_window);
> +       widget = glade_xml_get_widget (buoh_window->priv->gui,
> "menu_save");
> +       g_signal_connect (G_OBJECT (widget), "activate",
> +                         G_CALLBACK (buoh_window_menu_save_cb),
> +                         (gpointer) buoh_window);
>         widget = glade_xml_get_widget (buoh_window->priv->gui,
> "menu_properties");
>         g_signal_connect (G_OBJECT (widget), "activate",
>                           G_CALLBACK (buoh_window_menu_properties_cb),
> @@ -378,6 +384,82 @@ buoh_window_menu_add_cb (GtkMenuItem *me
>  }
>  
>  static void
> +buoh_window_menu_save_cb (GtkMenuItem *menuitem, gpointer gdata)
> +{
> +       GtkWidget     *chooser;
> +       GtkFileFilter *filter;
> +       gchar         *suggested;
> +       gchar         *name;
> +       gchar         *page;
> +       gchar         *filename;
> +       static gchar  *folder;

al ser static tiene que tener inicializaci?n, sino la primera vez
estar?s haciendo un if de una vartiable sin inicializar (y encima es que
el compilador da un warning!!!)

> +       BuohWindow    *window = BUOH_WINDOW (gdata);
> +       BuohComic     *comic;
> +       GdkPixbuf     *pixbuf;
> +       GtkWidget     *dialog;
> +
> +       filter = gtk_file_filter_new ();
> +       gtk_file_filter_add_pattern (filter, "*.jpg");
> +       gtk_file_filter_add_pattern (filter, "*.jpeg");
> +       gtk_file_filter_set_name (filter, _("JPEG Images"));
> +               
> +       chooser = gtk_file_chooser_dialog_new (_("Save comic"),
> +                                              GTK_WINDOW (window),
> +
> GTK_FILE_CHOOSER_ACTION_SAVE,
> +                                              GTK_STOCK_CANCEL,
> GTK_RESPONSE_CANCEL,
> +                                              GTK_STOCK_SAVE,
> GTK_RESPONSE_ACCEPT,
> +                                              NULL);
> +       gtk_file_chooser_set_do_overwrite_confirmation
> (GTK_FILE_CHOOSER (chooser), TRUE);
> +       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser),
> filter);
> +
> +       if (folder) {
> +               gtk_file_chooser_set_current_folder_uri
> (GTK_FILE_CHOOSER (chooser),
> +                                                         folder);
> +       }
> +       
> +       comic     = buoh_view_get_comic (window->priv->view);
> +       name      = buoh_comic_get_title (comic);
> +       page      = buoh_comic_get_page (comic);
> +       suggested = g_strconcat (name, " (", page, ").jpeg", NULL);
> +       
> +       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (chooser),
> +                                          suggested);
> +       do {
> +               if (gtk_dialog_run (GTK_DIALOG (chooser)) ==
> GTK_RESPONSE_ACCEPT) {
> +                       pixbuf   = buoh_comic_get_pixbuf (comic);

si hemos dicho que el dialogo es modal, el comic no va a cambiar, porque
pedir el pixbuf cada vez en caso que el bucle de mas de una vuelta? esto
sacalo mejor fuera. Adem?s, si sacas el dialogo y cancelas no pasa por
aqui, con lo que a la salida estar?s haciendo un unref de un pixbuf que
encima has declarado sin inicializar, esto no pasa si liberas el pixbuf
despu?s de usarlo . . . 

> +                       filename = gtk_file_chooser_get_filename
> (GTK_FILE_CHOOSER (chooser));

de la misma manera si sales del bucle porque has cancelado el chooser la
variable filename que est? declarada sin inicializar ser? liberada,
chungo. El g_free actua bien con variables a NULL, pero variables sin
inicializar tienen resultados inesperados. De nuevo esto no pasa si
liberas la variable despu?s de usarla en lugar de todo al final

> +                       
> +                       if (folder != NULL)
> +                               g_free (folder);
> +                       
> +                       folder =
> gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (chooser));
> +                       
> +                       if (!gdk_pixbuf_save (pixbuf, filename,
> "jpeg", NULL, NULL)) {
> +                               dialog = gtk_message_dialog_new
> (GTK_WINDOW (window),

su padre deber?a ser el chooser, no la ventana del buoh

> +
> GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
> +
> GTK_MESSAGE_ERROR,
> +
> GTK_BUTTONS_CLOSE,
> +
> _("Unable to save comic"));

usa un GError y muestra el mensaje que te devuelva. Adem?s el di?logo no
respeta las HIG, deber?a llevar el texto principal en negrita
( PANGO_WEIGHT_BOLD) y con letra mas grande (PANGO_SCALE_LARGE). 

> +                               gtk_dialog_run (GTK_DIALOG (dialog));
> +                               gtk_widget_destroy (dialog);
> +                               g_free (filename);
> +                       } else
> +                               break;
> +               } else 
> +                       break;
> +       } while (1);
> +       

esto es un poco feo la verdad, quiz?s una variable booleana y quitar lo
breaks har?a el c?digo mas legible y comprensible.

> +       g_object_unref (pixbuf);

buoh_comic_get_pixbuf no aumenta el contador de referencias al
devolverte el pixbuf, por lo que no hay motivo para decrementarlo aqui.

> +       g_free (filename);
> +       g_free (name);
> +       g_free (page);
> +       g_free (suggested);
> +       gtk_widget_destroy (chooser);
> +       g_object_unref (filter);

Creo que el filechooser no incrementa el contador de referencias y
libera ?l el filter al hacer el destroy, lo que es seguro es que aqu? no
llega el filter.

> +}
> +
> +static void
>  buoh_window_menu_properties_cb (GtkMenuItem *menuitem, gpointer
> gdata)
>  {
>         BuohWindow *window = BUOH_WINDOW (gdata);
> @@ -556,6 +638,7 @@ buoh_window_comic_actions_set_sensitive 
>         buoh_window_zoom_out_set_sensitive (window, sensitive);
>         buoh_window_normal_size_set_sensitive (window, sensitive);
>         buoh_window_set_sensitive (window, "menu_properties",
> sensitive);
> +       buoh_window_set_sensitive (window, "menu_save", sensitive);
>  }
>  
>  static void 

hay una ?ltima cosa que se me olvid? mencionar. Existe un lokdown global
de gnome para los casos de guardar copia. el buoh, como aplicaci?n de
GNOME, deber?a respetarlo. La clave de GConf correspondiente
es /desktop/gnome/lockdown/disable_save_to_disk 

Casi todos los errores vienen por la prisas, y por dejadez, porque
algunos te los dice el compilador y otros los escupe el propio buoh en
tiempo de ejecuci?n, al menos ese tipo de errores se pueden evitar en
los parches. En algunas circunstancias incluso el buoh daba un fallo de
crash!!! eso quiere decir que los cambios no se han probado suficiente. 

Igual os parece que soy muy exigente, pero si realmente queremos que el
buoh sea un programa de calidad y para aprender, creo que hay que serlo.

Salu2
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 Carlos Garcia Campos a.k.a. KaL
   elkalmail yahoo es
   carlosgc gnome org
   http://carlosgc.linups.org
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=             
PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://forge.novell.com/pipermail/buoh-dev/attachments/20050816/1d65f80e/attachment.pgp


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]