code: func sourceAttach(src *C.struct__GSource, rf reflect.Value, args ...interface{}) (SourceHandle, error) {
  	if src == nil {
  		return 0, errNilPtr
  	}
  
  	// rf must be a func with no parameters.
  	if rf.Type().Kind() != reflect.Func {
  		C.g_source_destroy(src)
  		return 0, errors.New("rf is not a function")
  	}
  
  	// Create a new GClosure from f that invalidates itself when
  	// f returns false.  The error is ignored here, as this will
  	// always be a function.
  	var closure *C.GClosure
  	closure, _ = ClosureNew(rf.Interface(), args...)
  
  	// Remove closure context when closure is finalized.
  	C._g_closure_add_finalize_notifier(closure)
  
  	// Set closure to run as a callback when the idle source runs.
  	C.g_source_set_closure(src, closure)
  
  	// Attach the idle source func to the default main event loop
  	// context.
  	cid := C.g_source_attach(src, nil)
  	return SourceHandle(cid), nil
  }
docs: // sourceAttach attaches a source to the default main loop context.