What is wrong with Pt_ARG_GAUGE_FLAGS ?

Hi,

I found some interesting behavior of PtProgress widget. All the time after
changing the Pt_ARG_GAUGE_VALUE the Pt_ARG_GAUGE_FLAGS resource takes the
same value. What is interesting that widget behavior is not changed
according to the new flags. It makes me think that flags field in the
widget is not changed, but PtGetResources() returns wrong value for the
flags.

This example helps to understand what am I talking about:

/*

  • cc -g -w6 -l ph -o PtProgress PtProgress.c
    */

#include <Pt.h>

static PtWidget_t *window, *updown, *progress, *nflags, *nval;
static long *gval;
static short gflags;


/

  • Called when the Left or Right button is activated
    */
    int updown_cb( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
    {
    PtArg_t arg[3];
    long *gmin, *gmax, gv = -1;

PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_VALUE, &gval, 0 );
PtSetArg( &arg[ 1 ], Pt_ARG_GAUGE_MINIMUM, &gmin, 0 );
PtSetArg( &arg[ 2 ], Pt_ARG_GAUGE_MAXIMUM, &gmax, 0 );
PtGetResources( progress, 3, arg );

switch( info->reason_subtype ) {
case Pt_UPDOWN_RIGHT:

if( *gval < *gmax )
gv = *gval + 1;

break;

case Pt_UPDOWN_LEFT:

if( *gval > *gmin )
gv = *gval - 1;

break;
}

if( -1 != gv ) {
PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_VALUE, gv, 0 );
PtSetResources( progress, 1, arg );

PtSetArg( &arg[ 0 ], Pt_ARG_NUMERIC_VALUE, gv, 0 );
PtSetResources( nval, 1, arg );

PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_FLAGS, &gflags, 0 );
PtGetResources( progress, 1, arg );

PtSetArg( &arg[ 0 ], Pt_ARG_NUMERIC_VALUE, (int) *gflags, 0 );
PtSetResources( nflags, 1, arg );
}

return( Pt_CONTINUE );
}

int main( int argc, char *argv[] )
{
PtArg_t arg[10];
PhDim_t win_dim = { 270, 100 };
PhArea_t progress_area = { { 10, 10 }, { 250, 20 } };
PhArea_t val_area = { { 160, 40 }, { 20, 20 } };
PhArea_t flag_area = { { 160, 70 }, { 20, 20} };
PtCallback_t callbacks[1] = {{ updown_cb, NULL }};
int n = 0;

if( -1 == PtInit( NULL )) {
perror( “PtInit()” );
PtExit( EXIT_FAILURE );
}

PtSetArg( &arg[n++], Pt_ARG_WINDOW_TITLE, “PtProgress Test”, 0 );
PtSetArg( &arg[n++], Pt_ARG_DIM, &win_dim, 0 );

if( NULL == ( window = PtCreateWidget( PtWindow, Pt_NO_PARENT, n,
arg ))) {
perror( “PtCreateWidget()” );
PtExit( EXIT_FAILURE );
}

/*

  • Draw the Left/Right arrows
    */
    n = 0;
    PtSetArg( &arg[n++], Pt_ARG_AREA, &progress_area, 0 );
    PtSetArg( &arg[n++], Pt_ARG_ORIENTATION, Pt_HORIZONTAL, 0 );
    PtSetArg( &arg[n++], Pt_ARG_SPACING, progress_area.size.w - 20, 0 );
    PtSetArg( &arg[n++], Pt_CB_ACTIVATE, &callbacks[0], 0 );

updown = PtCreateWidget( PtUpDown, window, n, arg );

/*

  • Draw the progress bar
    */
    n = 0;
    progress_area.pos.x += 10;
    progress_area.size.w -= 20;
    PtSetArg( &arg[n++], Pt_ARG_AREA, &progress_area, 0 );

progress = PtCreateWidget( PtProgress, window, n, arg );

/*

  • Draw a label and numeric field to show progress bar value change.
    */
    PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_VALUE, &gval, 0 );
    PtGetResources( progress, 1, arg );

n = 0;
PtSetArg( &arg[n++], Pt_ARG_AREA, &val_area, 0 );
PtSetArg( &arg[n++], Pt_ARG_FLAGS, Pt_HIGHLIGHTED | Pt_ETCH_HIGHLIGHT,
Pt_HIGHLIGHTED | Pt_ETCH_HIGHLIGHT );
PtSetArg( &arg[n++], Pt_ARG_NUMERIC_FLAGS, Pt_FALSE,
Pt_NUMERIC_ENABLE_UPDOWN );
PtSetArg( &arg[n++], Pt_ARG_TEXT_FLAGS, Pt_FALSE, Pt_TRUE );
PtSetArg( &arg[n++], Pt_ARG_BEVEL_WIDTH, 1, 0 );
PtSetArg( &arg[n++], Pt_ARG_NUMERIC_VALUE, *gval, 0 );

nval = PtCreateWidget( PtNumericInteger, window, n, arg );

n = 0;
val_area.pos.x -= 150;
PtSetArg( &arg[n++], Pt_ARG_AREA, &val_area, 0 );
PtSetArg( &arg[n++], Pt_ARG_TEXT_STRING, “Pt_ARG_GAUGE_VALUE:”, 0 );

PtCreateWidget( PtLabel, window, n, arg );

/*

  • Draw a label and numeric field to show progress bar flags
    */
    PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_FLAGS, &gflags, 0 );
    PtGetResources( progress, 1, arg );

n = 0;
PtSetArg( &arg[n++], Pt_ARG_AREA, &flag_area, 0 );
PtSetArg( &arg[n++], Pt_ARG_FLAGS, Pt_HIGHLIGHTED | Pt_ETCH_HIGHLIGHT,
Pt_HIGHLIGHTED | Pt_ETCH_HIGHLIGHT );
PtSetArg( &arg[n++], Pt_ARG_NUMERIC_FLAGS, Pt_FALSE,
Pt_NUMERIC_ENABLE_UPDOWN );
PtSetArg( &arg[n++], Pt_ARG_TEXT_FLAGS, Pt_FALSE, Pt_TRUE );
PtSetArg( &arg[n++], Pt_ARG_BEVEL_WIDTH, 1, 0 );
PtSetArg( &arg[n++], Pt_ARG_NUMERIC_VALUE, (int) *gflags, 0 );

nflags = PtCreateWidget( PtNumericInteger, window, n, arg );

n = 0;
flag_area.pos.x -= 150;
PtSetArg( &arg[n++], Pt_ARG_AREA, &flag_area, 0 );
PtSetArg( &arg[n++], Pt_ARG_TEXT_STRING, “Pt_ARG_GAUGE_FLAGS:”, 0 );

PtCreateWidget( PtLabel, window, n, arg );

PtRealizeWidget( window );
PtMainLoop();
return( EXIT_SUCCESS );
}

Thanks for reporting this bug to us.
The upcoming patch will contain the fix.
-Misha.

“Serge Yuschenko” <serge.yuschenko@rogers.com> wrote in message
news:aqsavf$ks8$1@inn.qnx.com

Hi,

I found some interesting behavior of PtProgress widget. All the time after
changing the Pt_ARG_GAUGE_VALUE the Pt_ARG_GAUGE_FLAGS resource takes the
same value. What is interesting that widget behavior is not changed
according to the new flags. It makes me think that flags field in the
widget is not changed, but PtGetResources() returns wrong value for the
flags.

This example helps to understand what am I talking about:

/*

  • cc -g -w6 -l ph -o PtProgress PtProgress.c
    */

#include <Pt.h

static PtWidget_t *window, *updown, *progress, *nflags, *nval;
static long *gval;
static short gflags;


/

  • Called when the Left or Right button is activated
    */
    int updown_cb( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
    {
    PtArg_t arg[3];
    long *gmin, *gmax, gv = -1;

PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_VALUE, &gval, 0 );
PtSetArg( &arg[ 1 ], Pt_ARG_GAUGE_MINIMUM, &gmin, 0 );
PtSetArg( &arg[ 2 ], Pt_ARG_GAUGE_MAXIMUM, &gmax, 0 );
PtGetResources( progress, 3, arg );

switch( info->reason_subtype ) {
case Pt_UPDOWN_RIGHT:

if( *gval < *gmax )
gv = *gval + 1;

break;

case Pt_UPDOWN_LEFT:

if( *gval > *gmin )
gv = *gval - 1;

break;
}

if( -1 != gv ) {
PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_VALUE, gv, 0 );
PtSetResources( progress, 1, arg );

PtSetArg( &arg[ 0 ], Pt_ARG_NUMERIC_VALUE, gv, 0 );
PtSetResources( nval, 1, arg );

PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_FLAGS, &gflags, 0 );
PtGetResources( progress, 1, arg );

PtSetArg( &arg[ 0 ], Pt_ARG_NUMERIC_VALUE, (int) *gflags, 0 );
PtSetResources( nflags, 1, arg );
}

return( Pt_CONTINUE );
}

int main( int argc, char *argv[] )
{
PtArg_t arg[10];
PhDim_t win_dim = { 270, 100 };
PhArea_t progress_area = { { 10, 10 }, { 250, 20 } };
PhArea_t val_area = { { 160, 40 }, { 20, 20 } };
PhArea_t flag_area = { { 160, 70 }, { 20, 20} };
PtCallback_t callbacks[1] = {{ updown_cb, NULL }};
int n = 0;

if( -1 == PtInit( NULL )) {
perror( “PtInit()” );
PtExit( EXIT_FAILURE );
}

PtSetArg( &arg[n++], Pt_ARG_WINDOW_TITLE, “PtProgress Test”, 0 );
PtSetArg( &arg[n++], Pt_ARG_DIM, &win_dim, 0 );

if( NULL == ( window = PtCreateWidget( PtWindow, Pt_NO_PARENT, n,
arg ))) {
perror( “PtCreateWidget()” );
PtExit( EXIT_FAILURE );
}

/*

  • Draw the Left/Right arrows
    */
    n = 0;
    PtSetArg( &arg[n++], Pt_ARG_AREA, &progress_area, 0 );
    PtSetArg( &arg[n++], Pt_ARG_ORIENTATION, Pt_HORIZONTAL, 0 );
    PtSetArg( &arg[n++], Pt_ARG_SPACING, progress_area.size.w - 20, 0 );
    PtSetArg( &arg[n++], Pt_CB_ACTIVATE, &callbacks[0], 0 );

updown = PtCreateWidget( PtUpDown, window, n, arg );

/*

  • Draw the progress bar
    */
    n = 0;
    progress_area.pos.x += 10;
    progress_area.size.w -= 20;
    PtSetArg( &arg[n++], Pt_ARG_AREA, &progress_area, 0 );

progress = PtCreateWidget( PtProgress, window, n, arg );

/*

  • Draw a label and numeric field to show progress bar value change.
    */
    PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_VALUE, &gval, 0 );
    PtGetResources( progress, 1, arg );

n = 0;
PtSetArg( &arg[n++], Pt_ARG_AREA, &val_area, 0 );
PtSetArg( &arg[n++], Pt_ARG_FLAGS, Pt_HIGHLIGHTED |
Pt_ETCH_HIGHLIGHT,
Pt_HIGHLIGHTED | Pt_ETCH_HIGHLIGHT );
PtSetArg( &arg[n++], Pt_ARG_NUMERIC_FLAGS, Pt_FALSE,
Pt_NUMERIC_ENABLE_UPDOWN );
PtSetArg( &arg[n++], Pt_ARG_TEXT_FLAGS, Pt_FALSE, Pt_TRUE );
PtSetArg( &arg[n++], Pt_ARG_BEVEL_WIDTH, 1, 0 );
PtSetArg( &arg[n++], Pt_ARG_NUMERIC_VALUE, *gval, 0 );

nval = PtCreateWidget( PtNumericInteger, window, n, arg );

n = 0;
val_area.pos.x -= 150;
PtSetArg( &arg[n++], Pt_ARG_AREA, &val_area, 0 );
PtSetArg( &arg[n++], Pt_ARG_TEXT_STRING, “Pt_ARG_GAUGE_VALUE:”, 0 );

PtCreateWidget( PtLabel, window, n, arg );

/*

  • Draw a label and numeric field to show progress bar flags
    */
    PtSetArg( &arg[ 0 ], Pt_ARG_GAUGE_FLAGS, &gflags, 0 );
    PtGetResources( progress, 1, arg );

n = 0;
PtSetArg( &arg[n++], Pt_ARG_AREA, &flag_area, 0 );
PtSetArg( &arg[n++], Pt_ARG_FLAGS, Pt_HIGHLIGHTED |
Pt_ETCH_HIGHLIGHT,
Pt_HIGHLIGHTED | Pt_ETCH_HIGHLIGHT );
PtSetArg( &arg[n++], Pt_ARG_NUMERIC_FLAGS, Pt_FALSE,
Pt_NUMERIC_ENABLE_UPDOWN );
PtSetArg( &arg[n++], Pt_ARG_TEXT_FLAGS, Pt_FALSE, Pt_TRUE );
PtSetArg( &arg[n++], Pt_ARG_BEVEL_WIDTH, 1, 0 );
PtSetArg( &arg[n++], Pt_ARG_NUMERIC_VALUE, (int) *gflags, 0 );

nflags = PtCreateWidget( PtNumericInteger, window, n, arg );

n = 0;
flag_area.pos.x -= 150;
PtSetArg( &arg[n++], Pt_ARG_AREA, &flag_area, 0 );
PtSetArg( &arg[n++], Pt_ARG_TEXT_STRING, “Pt_ARG_GAUGE_FLAGS:”, 0 );

PtCreateWidget( PtLabel, window, n, arg );

PtRealizeWidget( window );
PtMainLoop();
return( EXIT_SUCCESS );
}
\