К сожалению, я ввёл вас в заблуждение. Свойства региона можно изменить через установку свойств связанного с ним виджета PtRegion. Виджет сам вызывает функцию PhRegionChange() при своей реинициализации.
Я подправил установку свойств в PtSetArg, так как ваш вариант мне кажется не совсем корректен. Также важно вызвать после PtSetResources() функцию PtReRealizeWidget() для реинициализации, это особенность данного виджета.
Примерный код должен выглядеть так:
if ( pRegion != NULL ) {
PtArg_t args[10];
long opaque = 0;
int i = 0;
PtSetArg(&args[i++], Pt_ARG_REGION_FIELDS, Pt_TRUE, Ph_REGION_EV_OPAQUE );
opaque = hd == SIGUSR1 ? Pt_TRUE : Pt_FALSE;
PtSetArg(&args[i++], Pt_ARG_REGION_OPAQUE, opaque, Ph_EV_KEY );
PtSetResources( pRegion, i, args );
PtReRealizeWidget( pRegion );
}
Насколько я понимаю sig_user_handler() - обработчик сигналов. В этом случает вызывать в нём функции виджетов небезопасно, так как библиотека виджетов не сигналобезопасна и не реентерабельна.
Обойти это можно с помощью специального обработчика сигналов Photon, который синхронизируется с библиотекой виджетов.
Примерный код:
int sig_user_handler (int signum, void *data)
{
...
// работа с виджетами
...
return ( Pt_CONTINUE );
}
...
main()
{
sigset_t set;
...
// Инициализация библиотеки виджетов
...
sigemptyset( &set );
sigaddset( &set, SIGUSR1 );
sigaddset( &set, SIGUSR2 );
PtAppAddSignalProc( NULL, &set, sig_user_handler, NULL );
}