/** canvascall.c **/ #include gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data); gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data); static gint itemEvent(GnomeCanvasItem *item, GdkEvent *event,gpointer data); static gint rectangleEvent(GnomeCanvasItem *item, GdkEvent *event,gpointer data); void describeEventButton(gchar *name,GdkEvent *event); void describeEventMotion(gchar *name,GdkEvent *event); void describeEventCrossing(gchar *name,GdkEvent *event); #define HORIZ 100 #define VERT 60 #define WIDTH (HORIZ * 6) #define HEIGHT (VERT * 6) int main(int argc,char *argv[]) { GtkWidget *app; GtkWidget *canvas; GnomeCanvasGroup *rootGroup; GnomeCanvasItem *item; gnome_init("canvascall","1.0",argc,argv); app = gnome_app_new("canvascall", "Gnome Canvas Order"); gtk_signal_connect(GTK_OBJECT(app),"delete_event", GTK_SIGNAL_FUNC(eventDelete),NULL); gtk_signal_connect(GTK_OBJECT(app),"destroy", GTK_SIGNAL_FUNC(eventDestroy),NULL); canvas = gnome_canvas_new(); gtk_widget_set_usize(canvas,WIDTH,HEIGHT); gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas), 0.0,0.0,WIDTH,HEIGHT); rootGroup = gnome_canvas_root(GNOME_CANVAS(canvas)); gnome_app_set_contents(GNOME_APP(app),canvas); item = gnome_canvas_item_new(rootGroup, gnome_canvas_ellipse_get_type(), "x1",(double)(HORIZ * 1), "y1",(double)(VERT * 1), "x2",(double)(HORIZ * 3), "y2",(double)(VERT * 3), "fill_color","white", "outline_color","black", NULL); gtk_signal_connect(GTK_OBJECT(item),"event", (GtkSignalFunc)itemEvent,NULL); item = gnome_canvas_item_new(rootGroup, gnome_canvas_rect_get_type(), "x1",(double)(HORIZ * 2), "y1",(double)(VERT * 2), "x2",(double)(HORIZ * 4), "y2",(double)(VERT * 4), "fill_color","blue", "outline_color","black", NULL); gtk_signal_connect(GTK_OBJECT(item),"event", (GtkSignalFunc)itemEvent,NULL); gtk_signal_connect(GTK_OBJECT(item),"event", (GtkSignalFunc)rectangleEvent,NULL); item = gnome_canvas_item_new(rootGroup, gnome_canvas_ellipse_get_type(), "x1",(double)(HORIZ * 3), "y1",(double)(VERT * 3), "x2",(double)(HORIZ * 5), "y2",(double)(VERT * 5), "fill_color","black", "outline_color","white", NULL); gtk_signal_connect(GTK_OBJECT(item),"event", (GtkSignalFunc)itemEvent,NULL); gtk_widget_show_all(app); gtk_main(); exit(0); } static gint itemEvent(GnomeCanvasItem *item, GdkEvent *event,gpointer data) { if(event->type == GDK_BUTTON_PRESS) gnome_canvas_item_raise_to_top(item); return(0); } static gint rectangleEvent(GnomeCanvasItem *item, GdkEvent *event,gpointer data) { switch(event->any.type) { case GDK_ENTER_NOTIFY: describeEventCrossing("GDK_ENTER_NOTIFY",event); break; case GDK_LEAVE_NOTIFY: describeEventCrossing("GDK_LEAVE_NOTIFY",event); break; case GDK_MOTION_NOTIFY: describeEventMotion("GDK_MOTION_NOTIFY",event); break; case GDK_BUTTON_PRESS: describeEventButton("GDK_BUTTON_PRESS",event); break; case GDK_2BUTTON_PRESS: describeEventButton("GDK_2BUTTON_PRESS",event); break; case GDK_3BUTTON_PRESS: describeEventButton("GDK_3BUTTON_PRESS",event); break; case GDK_BUTTON_RELEASE: describeEventButton("GDK_BUTTON_RELEASE",event); break; default: g_print("An unexpected event......\n"); break; } g_print(" GdkEvent #%d",event->type); if(event->any.send_event) g_print(" (from another client,"); else g_print(" (from server,"); if(event->any.window != NULL) { if(data == NULL) g_print(" with no data)\n"); else g_print(" with data %p)\n",data); } return(0); } void describeEventButton(gchar *name,GdkEvent *event) { g_print("%s -- GdkEventButton\n",name); g_print(" x=%g y=%g xtilt=%g ytilt=%g" " pressure=%g button=%d\n", event->button.x,event->button.y, event->button.xtilt,event->button.ytilt, event->button.pressure,event->button.button); g_print(" x_root=%g y_root=%g time=%u" " state=0x%08X\n", event->button.x_root,event->button.y_root, event->button.time,event->button.state); } void describeEventMotion(gchar *name,GdkEvent *event) { g_print("%s -- GdkEventMotion\n",name); g_print(" x=%g y=%g xtilt=%g ytilt=%g" " pressure=%g is_hint=%s\n", event->motion.x,event->motion.y, event->motion.xtilt,event->motion.ytilt, event->motion.pressure, event->motion.is_hint ? "TRUE" : "FALSE"); g_print(" x_root=%g y_root=%g time=%u" " state=0x%08X\n", event->motion.x_root,event->motion.y_root, event->motion.time,event->motion.state); } void describeEventCrossing(gchar *name,GdkEvent *event) { gchar *mode = event->crossing.mode == GDK_CROSSING_NORMAL ? "Normal" : event->crossing.mode == GDK_CROSSING_GRAB ? "Grab" : "Ungrab"; g_print("%s -- GdkEventCrossing\n",name); g_print(" x=%g y=%g x_root=%g y_root=%g focus=%s\n", event->crossing.x,event->crossing.y, event->crossing.x_root,event->crossing.y_root, event->crossing.focus ? "TRUE" : "FALSE"); g_print(" mode=%s time=%u detail=%d state=0x%08X\n", mode,event->crossing.time, event->crossing.detail,event->crossing.state); } gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data) { return(FALSE); } gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data) { gtk_main_quit(); return(0); }