RE:char **cadena... ¿como?
Mmm... al parecer no es tan fácil, porque si esas líneas de código las pones dentro de una función -como Laura sugiere- crearías un comportamiento indefinido. Esto, porque la variable estática "nuevo Mensaje" se destruiría al finalizar la función, causando que nmsgr apunte a una dirección de memoria inválida. Para ello es mejor emplear un strcpy. Ahora, si la función tiene que ubicarle memoria dinámica, sería necesario manejar malloc y free. Si no, no es necesario.
// sin uso de memoria dinámica
void mensaje_cb(GWindow *feren, const char *who, char **message)
{
...
strcpy(*message, "nuevo mensaje");
}
// con uso de memoria dinámica
void mensaje_cb(GWindow *feren, const char *who, char **message)
{
...
if (*mesage)
free(*message);
*message = malloc(sizeof(char)*num_caracteres);
strcpy(*message, "nuevo mensaje");
...
}
Claro, también podrías llamar a calloc o realloc, según convenga.
Finalmente, ¿por qué la variable tiene que ser un doble puntero a caracter? ¿No es suficiente con uno solo?