Why the Timer doesn't work? (about g_timeout_add())



I copy my source files "CurveWindow.h" and "testCurveWindow.cpp" below.
And attach them in this mail. You can compile them by:
$ g++ testCurveWindow.cpp -o testCurveWindow `pkg-config --cflags --libs gtk+-2.0`

In this application, I create an 1 second timer to draw a moving line.
But in the function timer_1_test(), the timer is run only once, and then stopped.
See the comment in this function.

The following is my two source files:

/***************************************************************************
 *              Filename : CurveWindow.h
 *                   Begin : 2008-08-14 08:46:43
 *                 Project : CurveWindow
 *                  Author : Wu Yin
 ***************************************************************************/
#include <iostream>
#include <gtk/gtk.h>
 using namespace std;

 class CurveWindow
 {
	 public:
		 CurveWindow(){};
		 GtkWidget *create_drawing_win();
		 GtkWidget *get_root_widget();
		 int draw();
		 GdkPixmap *pixmap;
 
	 private:
		 GtkWidget *drawing;
 };
//========================================================


/* Create a new backing pixmap of the appropriate size */
static gboolean configure_event( GtkWidget *widget, GdkEvent *event, gpointer data)
{
	CurveWindow *self = (CurveWindow *)data;
	GdkColor color;
	GdkGC *gc = gdk_gc_new(widget->window);

	self->pixmap = gdk_pixmap_new(widget->window,
			widget->allocation.width,
			widget->allocation.height,
			-1);
	// Draw the background
	gdk_draw_rectangle (self->pixmap,
			widget->style->white_gc,
			TRUE,
			0, 0,
			widget->allocation.width,
			widget->allocation.height);
	return TRUE;
}

/***************************************************************************
 * add by Wu Yin, 2008-08-14 08:55:09
 ***************************************************************************/
static gboolean redraw(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
printf("expose-event \n");
	CurveWindow *self = (CurveWindow *)data;
	gdk_draw_drawable (widget->window,
			widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
			self->pixmap,
			event->area.x, event->area.y,
			event->area.x, event->area.y,
			event->area.width, event->area.height);
	return TRUE;
}

/***************************************************************************
 * add by Wu Yin, 2008-08-19
 ***************************************************************************/
int CurveWindow::draw()
{
	GtkWidget *widget = this->get_root_widget();
	static int y = 0;

	y += 10;
	gdk_draw_line(pixmap, 
		widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
		0, 0, 120, y);
	gtk_widget_draw(widget, NULL);
	return 0;
}

/***************************************************************************
 * add by Wu Yin, 2008-08-14 08:55:09
 ***************************************************************************/
GtkWidget *CurveWindow::get_root_widget()
{
	return drawing;
}

/***************************************************************************
 * add by Wu Yin, 2008-08-14 08:55:09
 ***************************************************************************/
GtkWidget *CurveWindow::create_drawing_win()
{
	drawing = gtk_drawing_area_new();
	g_signal_connect(G_OBJECT(drawing), "expose-event",
			G_CALLBACK(redraw), this);
	g_signal_connect (G_OBJECT (drawing),"configure_event",
			G_CALLBACK (configure_event), this);
	return drawing;
}


/***************************************************************************
 *              Filename : testCurveWindow.cpp
 *                   Begin : 2008-08-14 08:46:43
 *                 Project : CurveWindow
 *                  Author : Wu Yin
 ***************************************************************************/
#include <gtk/gtk.h>
#include <iostream>
#include "CurveWindow.h"
using  namespace std;

/***************************************************************************
 * add by Wu Yin, 2008-08-14 08:55:09
 ***************************************************************************/
static void timer_1_test(gpointer data)
{
	CurveWindow *cw = (CurveWindow *)data;
	cw->draw();

/* !!! Look Here !!!
 * Uncomment each statement of the following, the timer will run correctly, WHY? 
 */
//	printf("timer_1_test() \n");
//	gtk_widget_draw(cw->get_root_widget(), NULL);
}

/***************************************************************************
 * add by Wu Yin, 2008-08-14 08:55:09
 ***************************************************************************/
static void create_gui()
{
	GtkWidget *drawing_win;
	GtkWidget *root_win;
	GtkWidget *root_table;
	CurveWindow *cw;
	GdkColor bg, fg;

	// Create root_window
	root_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_default_size(GTK_WINDOW(root_win), 800, 600);
	g_signal_connect(GTK_OBJECT(root_win), "destroy", G_CALLBACK(gtk_main_quit), NULL);

	// Create root table container
	root_table = gtk_table_new(10, 10, TRUE);
	gtk_container_add(GTK_CONTAINER(root_win), root_table);

	// Create Drawing place 1, and add to the root table
	cw = new CurveWindow();
	drawing_win = cw->create_drawing_win();
	g_timeout_add(1000, (GSourceFunc)timer_1_test, cw);
	gtk_table_attach_defaults(GTK_TABLE(root_table), drawing_win, 0, 2, 0, 2);

	gtk_widget_show_all(root_win);
}

/***************************************************************************
 * add by Wu Yin, 2008-08-14 08:55:09
 ***************************************************************************/
int main(int argc, char *argv[])
{
	gtk_init(&argc, &argv);
	create_gui();
	gtk_main();
	return 0; 
}

Attachment: CurveWindow.tar.bz2
Description: BZip2 compressed data



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