Причина, по которой ваш код не работает, очень вероятно, что вы "слишком нетерпеливы", не давая GTK + времени на перерисовку виджетов, прежде чем вы снова сделаете заголовки невидимыми.
GTK + не рисует сразу, когда вы делаете вызов, который требует перерисовки. Вместо этого перерисовки ставятся в очередь, а затем выполняются все сразу из основного цикла GTK +. Таким образом, два последовательных изменения виджетов не вызывают двух перерисовок, а только одного.
Это что-то вроде хака, но вы можете попробовать "классический" трюк с обработкой событий GTK +, вставив такой цикл после включения заголовков:
while(gtk_events_pending())
gtk_main_iteration();
Это просто зацикливается до тех пор, пока в очереди GTK + есть события (упомянутые выше изменения при отрисовке являются внутренними событиями), и сбрасывает их, а затем возвращает управление вам. Вполне вероятно, что это приведет к некоторому визуальному мерцанию.