add generic set_source(ctx, ...)