/** fixed.c **/ #include typedef struct { GtkWidget *fixed; GtkWidget *button; } ButtonMover; GtkWidget *makeFixedContainer(); gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data); gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data); void buttonClick(GtkWidget *widget,ButtonMover *bm); #define WIDTH 400 #define HEIGHT 300 int main(int argc,char *argv[]) { GtkWidget *window; GtkWidget *fixed; gnome_init("fixed","1.0",argc,argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), WIDTH,HEIGHT); gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(eventDelete), NULL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(eventDestroy), NULL); fixed = makeFixedContainer(); gtk_container_add(GTK_CONTAINER(window),fixed); gtk_widget_show(window); gtk_main(); exit(0); } GtkWidget *makeFixedContainer() { int i; GtkWidget *fixed; static ButtonMover bm[3]; fixed = gtk_fixed_new(); gtk_widget_show(fixed); for(i=0; i<3; i++) { bm[i].fixed = fixed; bm[i].button = gtk_button_new_with_label( "(100,100)"); gtk_signal_connect(GTK_OBJECT(bm[i].button), "clicked", GTK_SIGNAL_FUNC(buttonClick), &bm[i]); gtk_widget_show(bm[i].button); gtk_fixed_put(GTK_FIXED(fixed),bm[i].button, 100,100); } return(fixed); } void buttonClick(GtkWidget *widget,ButtonMover *bm) { gchar labelString[80]; GtkWidget *label; gint x = (int)(random() % WIDTH); gint y = (int)(random() % HEIGHT); sprintf(labelString,"(%d,%d)",x,y); label = GTK_WIDGET(GTK_BUTTON(bm->button)->child); gtk_label_set_text(GTK_LABEL(label),labelString); gtk_fixed_move(GTK_FIXED(bm->fixed),bm->button,x,y); } gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data) { return(FALSE); } gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data) { gtk_main_quit(); return(0); }