The short answer is that you can't. The function has to be in the form of GSourceFunc, which returns a gboolean value and receives the gpointer data. What exactly is this shot doing? If you are creating an animation, how about try this.
Create a structure that holds the start x/y points and end x/y points. It could look like this (syntax on all of this code has not been tested!):
Code:
struct Points
{
GtkWidget *fixed, *image_shot;
gint initX, initY;
gint endX, endY;
gint animations;
gint count;
};
Then, you will want to initialize these values and setup the timeout. Note that the next timeout does not start to count the 100 milliseconds until the previous ends. This will also add pointers to your fixed and image_shot widgets.
Code:
Points *pts = (Points*) g_malloc (sizeof (Points));
pts->fixed = fixed;
pts->image_shot = image_shot;
pts->initX = 5;
pts->initY = 10;
pts->endX = 15;
pts->endY = 25;
pts->animations = 7;
pts->count = 0;
// This timeout will run about every 100 milliseconds
g_timeout_add (100, (GSourceFunc) shoot, (gpointer) pts);
Lastly, you can create the timeout function. This will move the image from (initX,initY) to (endX,endY) in 'animations' moves. (Like I said, this will require cleaning because I didn't test any of this.
Code:
gboolean shoot (Points *pts)
{
gint x, y;
gdouble scale;
// The scale tells us where to place the image
pts->count++;
scale = (gdouble) pts->count / (gdouble) pts->animations;
// The new position adds the progress to the initial
x = (scale * (endX - initX)) + initX;
y = (scale * (endY - initY)) + initY;
gtk_fixed_move (GTK_FIXED (pts->fixed), pts->image_shot, x, y);
// If this has run 'animations' times, remove
// the timeout by returning FALSE
if (pts->count >= pts->animations)
return FALSE;
// Otherwise, continue running the timeout
return TRUE;
}
If you don't understand any part of this code, let me know. I think this is what you are trying to do, but if it is not, I am sure that it atleast shows you how to use timeouts.