...it seems like just getting your toplevel from the window system and drawing / managing everything else on your own would be less of a hassle in a cross-platform setting.
In un mondo in cui il minimo comune denominatore è un sistema di finestre in cui ci sono solo finestre di livello superiore che sono solo tele, avresti ragione. Ma le cose non funzionano così da molto tempo.
La cosa più grande che qualsiasi sistema di finestre che va oltre la piastrellatura deve affrontare è la sovrapposizione. Deve essere consapevole di dove sono le finestre e di come sono impilate per decidere dove inviare l'input e dove posizionare e ritagliare l'output. Una volta risolto il problema, i sottofinestre per widget non sono un problema perché lo stesso insieme di regole viene applicato a uno stack più profondo. Con il sistema di finestre in grado di gestirlo, non c'è motivo per ogni cliente di duplicare tale sforzo, anche se è in una libreria da qualche parte. Ogni sistema di finestre di qualsiasi significato che ha preso vita negli ultimi 30 anni ha adottato questo modello e toolkit come GTK + sfruttano il fatto che X, Windows e Quartz lo usano tutti.
Sul lato client, anche le finestre univoche per componente di interfaccia hanno molto senso. Invece di essere lasciato da solo per capire quale parte del tuo codice ha bisogno di servire quel clic del mouse che hai ottenuto (280, 192) nella finestra principale, ottieni un identificatore per la finestra dove è atterrato che può essere usato per abbinare con un widget e le coordinate relative ai suoi confini. I componenti dell'interfaccia devono solo comprendere se stessi (dimensioni, colore del testo, contenuto del testo, ecc.) E non sapere o preoccuparsi di ciò che accade da nessun'altra parte.
Avendo inventato parti di quella ruota io stesso una o due volte negli anni '80, posso dirti per esperienza che è molto lavoro, e sono molto più felice di lasciarmi occupare dal sistema di finestre.