Re: Derived widget in libglademm



On Sun, 2007-09-02 at 00:31 +0200, Philipp Klaus Krause wrote:
> Murray Cumming schrieb:
> 
> > I guess I'd need to see a complete compileable simple test case to
> > figure this out.

Here is a self-contained test that uses libglademm and a test that does
not, with the build command in a comment at the top of each file.

I see that on_realize() is indeed not called when using
get_widget_derived(). From the g_warning() about using
set_gl_capability() after realize, it seems that the realize signal has
already been called before our C++ instance was constructed. That's
unusual.

However, the default signals are being used in general. I added an
on_expose_event() override to show that.

You are not the first person to discover this, it seems:
http://lists.ximian.com/pipermail/glade-users/2005-March/002430.html
And here's a message about the same problem with regular libglade:
http://mail.gnome.org/archives/gtk-list/2006-June/msg00065.html
which maybe has your solution, though it seems odd.
"
Solution: don't enable the visible attribute on widgets that you want 
to catch the realize event and show this widgets manually with your 
own code
"

-- 
murrayc murrayc com
www.murrayc.com
www.openismus.com
//Build this with:
//g++ krause_test.cc `pkg-config libglademm-2.4 gtkglextmm-1.2 --libs --cflags`

#include <libglademm.h>
#include <gtkglmm.h>

class Display : public Gtk::DrawingArea, public Gtk::GL::Widget<Display>
{
public:
	Display(BaseObjectType *da, Glib::RefPtr<Gnome::Glade::Xml>& refGlade);

protected:
	void on_realize();
	bool on_expose_event(GdkEventExpose* event);
};


#include <iostream>

#include <GL/gl.h>
#include <GL/glu.h>
#include <gtkmm/messagedialog.h>

Display::Display(BaseObjectType *da, Glib::RefPtr<Gnome::Glade::Xml>& refGlade) : Gtk::DrawingArea(da)//, Gtk::GL::Widget<Display>()
{
	std::cout << "Constructor called." << std::endl;

	//These don't cause on_realize() to be called either:
	//signal_realize().connect( sigc::mem_fun (*this, &Display::on_realize), false );
	//signal_realize().connect( sigc::mem_fun (*this, &Display::on_realize), true );

	Glib::RefPtr<Gdk::GL::Config> glconfig;
	glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | Gdk::GL::MODE_DOUBLE);
	
	if(!glconfig)
	{
		Gtk::MessageDialog e("Couldn't find OpenGL visual.\nPlease ensure that OpenGL drivers are installed correctly.", Gtk::MESSAGE_ERROR);
		e.run();
	}

	if(!set_gl_capability(glconfig) || !is_gl_capable())
	{
		Gtk::MessageDialog e("Couldn't set OpenGL capability.\nPlease ensure that OpenGL drivers are installed correctly.", Gtk::MESSAGE_ERROR);
		e.run();
	}

}

void Display::on_realize()
{
	std::cout << "on_realize() called." << std::endl;

	Gtk::DrawingArea::on_realize();
	
	Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window();
	
	glwindow->gl_begin(get_gl_context());
	glClearColor(1.0, 0.0, 0.0, 1.0);
	glMatrixMode(GL_PROJECTION);
	glOrtho(-0.5, 0.5, -0.5, 0.5, -0.1, 0.1);
	glColor3f(1.0f, 0.0f, 0.0f);
	glDisable(GL_DEPTH_TEST);	
	glwindow->gl_end();
}

bool Display::on_expose_event(GdkEventExpose* event)
{
	std::cout << "on_expose_event() called." << std::endl;
	Gtk::DrawingArea::on_expose_event(event);
}



#include <iostream>

#include <libglademm/xml.h>
#include <gtkmm.h>
#include <gtkglmm.h>


#ifdef ENABLE_NLS
#  include <libintl.h>
#endif


/* For testing propose use the local (not installed) glade file */
/* #define GLADE_FILE PACKAGE_DATA_DIR"/ttedit/glade/ttedit.glade" */
#define GLADE_FILE "ttedit.glade"
   
int
main (int argc, char *argv[])
{
	Gtk::Main kit(argc, argv);
	
	if(!Gtk::GL::init_check(argc, argv))
	{
		Gtk::MessageDialog e("Couldn't initilize gtkglextmm.\nPlease ensure that OpenGL drivers are installed.", Gtk::MESSAGE_ERROR);
		e.run();
		return(-1);
	}
	
	//Load the Glade file and instiate its widgets:
	Glib::RefPtr<Gnome::Glade::Xml> refXml;
	try
	{
		refXml = Gnome::Glade::Xml::create(GLADE_FILE);
	}
	catch(const Gnome::Glade::XmlError& ex)
	{
		std::cerr << ex.what() << std::endl;
		return 1;
	}
	
	Display *display = 0;
	refXml->get_widget_derived("display", display);
	
	Gtk::Window* main_win = 0;
	refXml->get_widget("main_window", main_win);
	
	if (main_win)
	{
		kit.run(*main_win);
	}
	return 0;
}
//Build this with:
//g++ krause_test.cc `pkg-config gtkmm-2.4 gtkglextmm-1.2 --libs --cflags`

#include <gtkglmm.h>

class Display : public Gtk::DrawingArea, public Gtk::GL::Widget<Display>
{
public:
	Display();

protected:
	void on_realize();
	bool on_expose_event(GdkEventExpose* event);
};


#include <iostream>

#include <GL/gl.h>
#include <GL/glu.h>
#include <gtkmm/messagedialog.h>

Display::Display()
{
	std::cout << "Constructor called." << std::endl;

	Glib::RefPtr<Gdk::GL::Config> glconfig;
	glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | Gdk::GL::MODE_DOUBLE);
	
	if(!glconfig)
	{
		Gtk::MessageDialog e("Couldn't find OpenGL visual.\nPlease ensure that OpenGL drivers are installed correctly.", Gtk::MESSAGE_ERROR);
		e.run();
	}

	if(!set_gl_capability(glconfig) || !is_gl_capable())
	{
		Gtk::MessageDialog e("Couldn't set OpenGL capability.\nPlease ensure that OpenGL drivers are installed correctly.", Gtk::MESSAGE_ERROR);
		e.run();
	}

	//These don't cause on_realize() to be called either:
	//signal_realize().connect( sigc::mem_fun (*this, &Display::on_realize), false );
	//signal_realize().connect( sigc::mem_fun (*this, &Display::on_realize), true );
}

void Display::on_realize()
{
	std::cout << "on_realize() called." << std::endl;

	Gtk::DrawingArea::on_realize();



	
	Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window();
	
	glwindow->gl_begin(get_gl_context());
	glClearColor(1.0, 0.0, 0.0, 1.0);
	glMatrixMode(GL_PROJECTION);
	glOrtho(-0.5, 0.5, -0.5, 0.5, -0.1, 0.1);
	glColor3f(1.0f, 0.0f, 0.0f);
	glDisable(GL_DEPTH_TEST);	
	glwindow->gl_end();
}

bool Display::on_expose_event(GdkEventExpose* event)
{
	std::cout << "on_expose_event() called." << std::endl;
	Gtk::DrawingArea::on_expose_event(event);
}



#include <iostream>

#include <gtkmm.h>
#include <gtkglmm.h>


#ifdef ENABLE_NLS
#  include <libintl.h>
#endif


/* For testing propose use the local (not installed) glade file */
/* #define GLADE_FILE PACKAGE_DATA_DIR"/ttedit/glade/ttedit.glade" */
#define GLADE_FILE "ttedit.glade"
   
int
main (int argc, char *argv[])
{
	Gtk::Main kit(argc, argv);
	
	if(!Gtk::GL::init_check(argc, argv))
	{
		Gtk::MessageDialog e("Couldn't initilize gtkglextmm.\nPlease ensure that OpenGL drivers are installed.", Gtk::MESSAGE_ERROR);
		e.run();
		return(-1);
	}

	Gtk::Window window;	
	Display display;
	window.add(display);
	display.show();
	
	kit.run(window);
	
	return 0;
}

Attachment: ttedit.glade
Description: application/glade



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