Я думаю, вам нужно будет отслеживать все окна верхнего уровня, которые появляются, и имеют ли они _NET_WM_STRUT_PARTIAL, чтобы самостоятельно вычислить рабочую область, минус ваши собственные окна. Вы можете посмотреть код libwnck для того, как отслеживать все избыточные значения, и посмотреть, как оконные менеджеры вычисляют _NET_WORKAREA, чтобы посмотреть, как это сделать. Затем повторите эту работу, но минус свои собственные стойки. Одна из проблем заключается в том, что, если бы каждая панель сделала это, был бы бесконечный цикл, и все они работали бы друг с другом. Но вы можете предположить, что у людей есть панель управления по умолчанию, которая не делает этого, плюс ваша.
Другой вариант может заключаться в том, чтобы просто сделать окно вашей панели всегда полной высотой экрана, но если какое-либо окно находится над вами, смещайте то, что вы рисуете (и обрабатываете обработку смещения) немного. Проблема в том, что сложно отслеживать, как окна перекрывают вас. XVisibilityEvent помогает немного, но не говорит вам, когда окно сверху просто перемещается. Кроме того, вы должны быть уверены, что не сломаетесь, если скажете, что полноэкранный фильм попал на всю панель. Я предполагаю, что при таком подходе вы, вероятно, все равно закончили сканирование всех пупов для панелей, как и с помощью первого подхода.