static gboolean bst_canvas_link_child_event (GnomeCanvasItem *item, GdkEvent *event) { BstCanvasLink *clink; GtkWidget *widget = GTK_WIDGET (item->canvas); gboolean handled = FALSE; clink = BST_CANVAS_LINK (item); switch (event->type) { case GDK_ENTER_NOTIFY: if (!GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); handled = TRUE; break; case GDK_LEAVE_NOTIFY: handled = TRUE; break; case GDK_KEY_PRESS: switch (event->key.keyval) { case 'L': gnome_canvas_item_lower (item, 1); GNOME_CANVAS_NOTIFY (item); break; case 'l': gnome_canvas_item_lower_to_bottom (item); GNOME_CANVAS_NOTIFY (item); break; case 'R': gnome_canvas_item_raise (item, 1); GNOME_CANVAS_NOTIFY (item); break; case 'r': gnome_canvas_item_raise_to_top (item); GNOME_CANVAS_NOTIFY (item); break; } handled = TRUE; break; case GDK_KEY_RELEASE: handled = TRUE; break; default: break; } return handled; }
static int itemRaise( Tcl_Interp *interp, int objc, Tcl_Obj * const objv[], CanvasParams *param, GPtrArray *items, int isRaise ) { int k; int position = 0; if( objc == 4 ) { if( Tcl_GetIntFromObj( interp, objv[3], &position ) != TCL_OK ) return TCL_ERROR; if( position == 0 ) return TCL_OK; if( position < 0 ) { position *= -1; isRaise = !isRaise; } } else if( objc > 4 ) { Tcl_WrongNumArgs( interp, 3, objv, "?position?" ); return TCL_ERROR; } if( items != NULL ) { for( k = 0; k < items->len; ++k ) { Gnocl_CanvasItemInfo *info = GET_INFO( items, k ); if( isRaise ) { /* TODO: with libgnomecanvas-2.2.1 raise_to_top works exactly once */ if( objc == 3 ) gnome_canvas_item_raise_to_top( info->item ); else gnome_canvas_item_raise( info->item, position ); } else { if( objc == 3 ) gnome_canvas_item_lower_to_bottom( info->item ); else gnome_canvas_item_lower( info->item, position ); } } } return TCL_OK; }