[Buoh-dev] Parche para guardar un comic como jpeg
Carlos Garcia Campos
carlosgc at gnome.org
Tue Aug 16 11:40:43 MDT 2005
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 at 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 at yahoo.es
carlosgc at 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
More information about the Buoh-dev
mailing list