Editor de eBooks usando GTK+
Investigando sobre Mono, DocBook y Open eBook
He estado investigando alternativas para el desarrollo e implementación, pero todo parece indicar que me quedaré con GTK+.
Hoy probé con
Mono a sugerencia de un amigo, pero Mono depende (en Windows) de la suite .NET, y no pienso depender de dicha suite para mi trabajo. Además, no existen versiones bajo Windows de
MonoDevelop (el ambiente de desarrollo de Mono), sino solo para MacOS X y Linux. Intenté con
SharpDevelop, otra suite de C# open source, pero también depende de la instalación de los runtimes de .NET, así que... ¡descartada!
Microsoft también afecta el formato XML que había escogido para los libros electrónics,
Open eBook. Como patrocinante "
golden" del
International Digital Publishing Forum, Microsoft está interesada en buscar que el formato soporte Administración de Restricciones Digitales (DRM), algo que está en contra de los propósitos de mi proyecto.
Por ello he estado averiguando esta semana en otros formatos XML para libros electrónicos, fundamentalmente
OpenReader y
DocBook
Es importante usar -mno-cygwin
Corrijo el post anterior para indicar que se debe añadir el parámetro "-mno-cygwin" al llamar al compilador, o de lo contrario habrán errores de ejecución al tratar con clases de la biblioteca Glib. Particularmente yo tenía problemas con Glib::Dir.read_name().
g++ oebeditor.cc -o oebeditor `pkg-config --cflags --libs libglademm-2.4` -mms-bitfields -mno-cygwin
Usando Glade y Libglademm bajo Cygwin
He continuado el proyecto pero no sin problemas.
Utilizar GTK+ con el lenguaje C++ y el compilador
Cygwin no es algo que se haya hecho con mucha frecuencia. Sólo cinco por ciento de los proyectos en GTK+ se hacen en C++ (casi el el noventa por ciento se hacen en lenguaje C), y casi todos en Linux.
Como había explicado antes, una de mis opciones era usar el editor de interfaces Glade para generar mis ventanas, y usar el programa
glademm para generar el código en C++ desde Glade. Lamentablemente, glademm no funciona bajo Windows y la mayoría de las personas que usan GTK+ recomiendan usar libglademm en vez de glademm.

LibGlademm es una librería que permite utilizar, desde el ejecutable, el archivo que genera Glade (el cual es un archivo XML de extensión .glade). Pero inicialmente muchos de los ejemplos de código que uno encontraba en Internet no compilaban adecuadamente desde Cygwin bajo Windows.
Este fragmento de código es el que finalmente me logró funcionar. Es mi clase principal (oebeditor.cc) y requiere de un archivo .glade (que llamaremos oebeditor.glade y lo colocaremos en la misma carpeta donde se genere el ejecutable) que tenga un
widget llamado vboxMain, del tipo
vertical box (es un contenedor de Glade que permite agrupar
widgets verticalmente, como se ve a la derecha).
Se requiere instalar desde dentro de Cygwin los módulos correspondientes a Gtk+ y gtkmm, entre otros.
Para compilar, se usa el comando (desde el bash de cygwin):
g++ oebeditor.cc -o oebeditor `pkg-config --cflags --libs libglademm-2.4` -mms-bitfieldsoebeditor.cc
#include <libglademm/xml.h>
#include <gtkmm.h>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <sigc++/retype_return.h>
#include "oebeditor.h"
//using namespace std;
oebeditor::oebeditor()
{
Gtk::VBox *vboxMain;
// Tamaño y título de la ventana
set_title("Prueba");
resize(770,500);
// Prepararse para cargar el archivo .glade
try
{
// Nota: Desde Glade, es necesario ponerle la propiedad "visible"
// en falso a la ventana (window) principal del .glade, o sino en
// este punto se mostrarán dos ventanas a la vez.
refXml = Gnome::Glade::Xml::create("oebeditor.glade");
refXml->get_widget("vboxMain", vboxMain);
vboxMain->reparent(*this);
}
catch(const Gnome::Glade::XmlError& ex)
{
std::cerr << ex.what() << std::endl;
}
if(vboxMain)
{
Gtk::MenuItem* pMenuItem = 0;
// ---------------------------------------------------------------
// Se conecta cada opción del menú con un método que será invocado
// cuando el usuario seleccione dicha función
// Abrir proyecto
refXml->get_widget("menu_abrir", pMenuItem);
if(pMenuItem) pMenuItem->signal_activate().connect( sigc::mem_fun(*this, &oebeditor::on_abrir_activate) );
// Salir
refXml->get_widget("menu_salir", pMenuItem);
if(pMenuItem) pMenuItem->signal_activate().connect( sigc::mem_fun(*this, &oebeditor::on_salir_activate) );
}
}
oebeditor::~oebeditor()
{
}
/* ---------------------
CREAR NUEVO PROYECTO
--------------------- */
void oebeditor::on_nuevo_activate()
{
}
/* ---------------------
ABRIR NUEVO PROYECTO
--------------------- */
void oebeditor::on_abrir_activate()
{
// --------------------------------------
// Pregunta al usuario dónde se encuentra
// el proyecto a abrir
// --------------------------------------
abrirproyecto* p = new abrirproyecto();
p->set_transient_for(*this);
p->show_it();
//p->set_transient_for(*this);
}
/* ---------------------
CERRAR PROYECTO
--------------------- */
void oebeditor::on_cerrar_activate()
{
}
/* ---------------------
GUARDAR
--------------------- */
void oebeditor::on_guardar_activate()
{
}
/* ---------------------
GUARDAR COMO
--------------------- */
void oebeditor::on_guardarcomo_activate()
{
}
/* ---------------------
PROPIEDADES
--------------------- */
void oebeditor::on_propiedades_activate()
{
}
/* ---------------------
SALIR
--------------------- */
void oebeditor::on_salir_activate()
{
// TO DO: verificar si el proyecto no ha sido guardado
hide();
}
int main (int argc, char *argv[])
{
// This main function merely instantiates the ogcalc class
// and displays it.
Gtk::Main kit(argc, argv); // Initialise GTK+.
oebeditor window; // Create an ogcalc object.
kit.run(window); // Show window; return when it's closed.
return 0;
}
Este es el archivo oebeditor.h#include <gtkmm.h>
#include <libglademm.h>
#include "abrirproyecto.h"
class oebeditor : public Gtk::Window
{
public:
oebeditor();
virtual ~oebeditor();
void on_abrir_activate();
void on_salir_activate();
protected:
Glib::RefPtr<Gnome::Glade::Xml> refXml;
//Gtk::Window* pWindow;
// Glade interface description.
Glib::RefPtr<Gnome::Glade::Xml> xml_interface;
};
Aplicación software libre para la creación, edición y despliegue de libros electrónicos bajo Windows y Linux, presentada como Trabajo Especial de Grado
por Luigino Bracci Roa.
Email: Lbracci@gmail.com