Hello, i'm trying to draw a ball (on a gtk drawing area widget) and to move it.
But i have a couple of troubles here:
1) It draw a ball, but don't move it (in case of using the 1-time function call)
2) It don't draw ball (in case of using g_timeout_add, with the same arguments)
Here is the code
Code:
#include <gtk/gtk.h>
#include <cairo.h>
#include <glib.h>
//size of the window is 480*800
GtkDrawingArea *canvas;
GtkWidget *window;
static GtkWidget*
create_window(void) {
GtkWidget *window;
GtkBuilder *builder;
builder = gtk_builder_new();
gtk_builder_add_from_file(builder, "/Users/student/Desktop/GTK/form.glade", NULL);
canvas = GTK_DRAWING_AREA(gtk_builder_get_object(builder, "canvas"));
gtk_builder_connect_signals(builder, NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_position(window, GTK_WIN_POS_CENTER);
g_object_unref(builder);
return window;
}
int razmer = 9;
void DebugMessage() {
printf ("Characters: %c %c \n", 'a', 65);
}
gboolean Repaint() {
cairo_t *cr;
GtkWidget *wid = GTK_WIDGET(canvas);
GdkWindow *win = gtk_widget_get_window(wid);
cr = gdk_cairo_create(win);
cairo_set_line_width(cr, 1);
//drawing Rectangle, we need it for making a kind of "repaint" function.
cairo_rectangle(cr, 0, 0, 800, 480);
cairo_set_source_rgb(cr, 0, 0.8, 2);
cairo_fill(cr);
cairo_stroke_preserve(cr);
return TRUE;
}
struct _MoveBallParams {
int xPosition;
int yPosition;
int xMove;
int yMove;
};
typedef struct _MoveBallParams MoveBallParams;
gboolean MoveBall(gpointer t) {
Repaint();
cairo_t *cr;
GtkWidget *wid = GTK_WIDGET(canvas);
GdkWindow *win = gtk_widget_get_window(wid);
MoveBallParams *temp = (MoveBallParams*)t;
cr = gdk_cairo_create(win);
cairo_set_line_width(cr, 1);
int size = 9; //size of the ball
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_arc(cr, temp->yPosition, temp->xPosition, size, 0, 2 * 3.14);
cairo_stroke_preserve(cr);
cairo_fill(cr);
temp->yPosition += temp->yMove;
temp->xPosition +=temp->xMove;
DebugMessage(); //just to debug and see the circle is working
return TRUE;
}
void
start_draw(GtkButton *button,
gpointer data) {
MoveBallParams temp = {100, 100, 3, 3};
g_timeout_add(50,MoveBall,&temp); //nothing happens here
//MoveBall(&temp); //uncomment it, and you'l see that ball drawings OK, but i don't move after pressing the button again and again
}
int
main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *builder;
gtk_init(&argc, &argv); //запуск GTK
window = create_window();
gtk_widget_show(window);
gtk_main();
return 0;
}
Maybe anybody have some ideas ? Ths