static void text_func2(Widget textID, XtPointer app_data, XtPointer widget_data ) { Screen_Obj *sop; const char *s; QSP_DECL INIT_MOTIF_QSP sop=find_object(DEFAULT_QSP_ARG textID); #ifdef CAUTIOUS if( sop == NO_SCREEN_OBJ ){ WARN("CAUTIOUS: text_func: couldn't locate text widget"); return; } #endif /* CAUTIOUS */ s = get_text(sop); if( s == NULL ) ASSIGN_RESERVED_VAR("input_string","(null)"); else { ASSIGN_RESERVED_VAR("input_string",s); free((void *)s); } NADVISE("text_func2 calling chew_text..."); chew_text(DEFAULT_QSP_ARG sop->so_action_text,"(text2 event)"); } // text_func2
static void text_func(Widget textID, XtPointer app_data, XtPointer widget_data ) { Screen_Obj *sop; const char *s; sop=find_object(DEFAULT_QSP_ARG textID); #ifdef CAUTIOUS if( sop == NO_SCREEN_OBJ ){ NWARN("CAUTIOUS: text_func: couldn't locate text widget"); return; } #endif /* CAUTIOUS */ s = get_text(sop); if( s == NULL ) assign_reserved_var( SOB_QSP_ARG "input_string","(null)"); else { assign_reserved_var( SOB_QSP_ARG "input_string",s); free((void *)s); } /* We should chew the text when a return is typed, or something? */ NADVISE("text_func calling chew_text..."); chew_text(DEFAULT_QSP_ARG sop->so_action_text,"(text event)"); } // text_func
static void toggle_func(Widget toggleID, XtPointer app_data, XtPointer widget_data) { Screen_Obj *sop; unsigned char value; Arg al[10]; int ac = 0; char val_str[4]; QSP_DECL INIT_MOTIF_QSP sop = find_object(QSP_ARG toggleID); if( sop != NO_SCREEN_OBJ ){ XtSetArg(al[ac], XmNset, &value); XtGetValues(toggleID, al, 1); if( value > 1 ){ sprintf(ERROR_STRING,"toggle has a value of %d, expected 0 or 1!?",value); WARN(ERROR_STRING); value &= 1; } sprintf(val_str,"%d",value); ASSIGN_RESERVED_VAR("toggle_state",val_str); chew_text(DEFAULT_QSP_ARG sop->so_action_text,"(toggle event)"); } else WARN("couldn't locate toggle button"); } // toggle_func
/* * Event callback function for `button1'. */ static void button_func(Widget buttonID, XtPointer app_data, XtPointer widget_data) { Screen_Obj *sop; QSP_DECL INIT_MOTIF_QSP sop = find_object(QSP_ARG buttonID); if( sop != NO_SCREEN_OBJ ){ chew_text(DEFAULT_QSP_ARG sop->so_action_text, "(button event)"); } else WARN("couldn't locate button"); }
static void chooser_func(Widget buttonID, XtPointer app_data, /* app_data should be NULL, see call to XtAddCallback */ XtPointer widget_data) { Screen_Obj *sop; XmToggleButtonCallbackStruct *cp; QSP_DECL INIT_MOTIF_QSP sop = find_object(QSP_ARG buttonID); if( sop == NO_SCREEN_OBJ ) { WARN("couldn't locate chooser button"); return; } cp = (XmToggleButtonCallbackStruct *)widget_data; /* For now, we don't support de-select functions, we handle that * in the script handler. */ if( cp->set == 0 ) return; /* There is a special case where we re-select an already * selected choice (which necessarily happens when there is * only one choice). Then we get two callbacks, which we may * not want... * We may be able to deal with that in the script... */ /*chew_text(DEFAULT_QSP_ARG sop->so_action_text); */ ASSIGN_RESERVED_VAR("choice",sop->so_action_text); /* BUG? action text? */ /* Now we've found the button, how do we find the parent chooser? */ sop = (Screen_Obj *)sop->so_parent; #ifdef CAUTIOUS if( sop == NO_SCREEN_OBJ ) ERROR1("CAUTIOUS: chooser button with no parent!?"); #endif /* CAUTIOUS */ chew_text(DEFAULT_QSP_ARG sop->so_action_text, "(chooser event)"); }
static void slider_func(Widget sliderID, XtPointer app_data, XtPointer widget_data) { Screen_Obj *sop; char str[LLEN]; int value; QSP_DECL INIT_MOTIF_QSP sop = find_object(DEFAULT_QSP_ARG sliderID); if( sop != NO_SCREEN_OBJ ){ /* get the value from the slider */ XmScaleGetValue(sliderID, &value); sprintf(str,"%d",value); ASSIGN_RESERVED_VAR("slider_val",str); chew_text(DEFAULT_QSP_ARG sop->so_action_text,"(slider event)"); } else ERROR1("can't locate slider"); } // slider_func
static void scroller_func(Widget scrollerID, XtPointer app_data, XmListCallbackStruct *list_cbs) { String selection; Screen_Obj *sop; QSP_DECL INIT_MOTIF_QSP /* list->cbs holds XmString of selected list item */ /* map this to "ordinary" string */ XmStringGetLtoR(list_cbs->item, (char *)XmSTRING_DEFAULT_CHARSET, &selection); ASSIGN_RESERVED_VAR("selection",selection); sop = find_object(DEFAULT_QSP_ARG scrollerID); if( sop == NO_SCREEN_OBJ ) return; chew_text(DEFAULT_QSP_ARG sop->so_action_text,"(scroller event)"); } // scroller_func
static COMMAND_FUNC( do_slct_obj ) { int x, y; const char *s; GLuint n_names, *ptr; GLint hits; GLuint this_hit=0; /* initialize to silence compiler */ GLuint the_hit; float z1,z2; float z_this,z_min; int clickWindowSize = 1; GLint viewport[4]; GLint i; GLuint j; char ret_str[32]; x=(int)HOW_MANY("x location"); y=(int)HOW_MANY("y location"); s=NAMEOF("scene render command"); s=savestr(s); //glPushMatrix(); glSelectBuffer(MAX_SELECT,selectBuf); check_gl_error("glSelectBuffer"); glRenderMode(GL_SELECT); check_gl_error("glRenderMode"); glMatrixMode(GL_PROJECTION); check_gl_error("glMatrixMode"); glPushMatrix(); check_gl_error("glPushMatrix"); glLoadIdentity(); check_gl_error("glLoadIdentity"); glGetIntegerv(GL_VIEWPORT,viewport); check_gl_error("glGetIntegerv"); gluPickMatrix(x,viewport[3]-y, clickWindowSize,clickWindowSize,viewport); check_gl_error("gluPickMatrix"); // Setup camera. //drawer.setupCamera(&manager); //glMatrixMode(GL_MODELVIEW); glInitNames(); check_gl_error("glInitNames"); glPushName(0); check_gl_error("glPushName"); //drawer.drawAirspace(&manager, &table); /* Call the user's draw routine here... */ chew_text(s, "(gl object selection)" ); rls_str(s); // Restoring the original projection matrix. glMatrixMode(GL_PROJECTION); check_gl_error("glMatrixMode GL_PROJECTION"); glPopMatrix(); check_gl_error("glPopMatrix"); glMatrixMode(GL_MODELVIEW); check_gl_error("glMatrixMode GL_MODELVIEW"); glFlush(); check_gl_error("glFlush"); // Returning to normal rendering mode. hits = glRenderMode(GL_RENDER); //printf ("hits = %d\n", hits); // Red book example. // When there are multiple objects, the hits are recorded // in drawing order, we have to check the z values to know // which is the foreground object. z_min=100000; ptr = (GLuint *) selectBuf; for (i = 0; i < hits; i++) { n_names = *ptr++; z1= ((float)*ptr++)/0x7fffffff; z2= ((float)*ptr++)/0x7fffffff; if( z1 < z2 ) z_this = z1; else z_this=z2; if( z_this < z_min ) z_min=z_this; for(j=0;j<n_names;j++){ this_hit=*ptr++; } // sprintf(ERROR_STRING,"Hit %d, %d from %g to %g, last is %d", // i,n_names,z1,z2,this_hit); // advise(ERROR_STRING); } the_hit=0; ptr = (GLuint *) selectBuf; for (i = 0; i < hits; i++) { n_names = *ptr++; z1= ((float)*ptr++)/0x7fffffff; z2= ((float)*ptr++)/0x7fffffff; if( z1 < z2 ) z_this = z1; else z_this=z2; for(j=0;j<n_names;j++){ this_hit=*ptr++; } if( z_this == z_min ) the_hit=this_hit; } //sprintf(ERROR_STRING,"front-most hit is %d",the_hit); //advise(ERROR_STRING); sprintf(ret_str,"%d",the_hit); assign_reserved_var("selection_index",ret_str); //if (hits != 0) { //manager.advanceTrial(processHits()); //} //glPopMatrix(); /* Set a variable to indicate what happened */ }
int default_stim(QSP_ARG_DECL Trial_Class *tc_p,int val,Staircase *stc_p) { char stim_str[256], *s; int coin=0; // initialize to quiet compiler, but not necessary!? int rsp; //struct var *vp; Variable *vp; float *xv_p; if( is_fc ){ coin=(int)rn(1); sprintf(stim_str,"%d",coin); assign_var("coin",stim_str); } assert( CLASS_XVAL_OBJ(tc_p) != NULL ); xv_p = indexed_data( CLASS_XVAL_OBJ(tc_p), val ); sprintf(stim_str,"%f",*xv_p); /* clip trailing zeros if there is a decimal point */ s=stim_str; while( *s ){ if( *s == '.' ){ s=stim_str+strlen(stim_str)-1; while( *s == '0' ) { *s=0; s--; } /* * if ONLY 0's after the decimal pt., * remove the pt too! */ if( *s == '.' ){ *s=0; s--; } } s++; } assign_var("xval",stim_str); sprintf(stim_str,"%d",val); assign_var("val",stim_str); sprintf(stim_str,"%d",CLASS_INDEX(tc_p)); assign_var("class",stim_str); assert( tc_p != NULL ); //sprintf(msg_str,"Text \"%s\"",(char *)(tc_p->cl_data)); //PUSH_INPUT_FILE(msg_str); //interpret_text_fragment(QSP_ARG tc_p->cl_data); /* use chew_text??? */ chew_text(CLASS_CMD(tc_p), "(stimulus text)"); vp=var_of("response_string"); if( vp != NULL ) rsp = collect_response(VAR_VALUE(vp)); else { static int warned=0; if( !warned ){ warn("default_stim: script variable $response_string not defined"); warned=1; } rsp = collect_response("Enter response: "); } if( is_fc ){ /* stimulus routine may have changed value of coin */ vp=var_of("coin"); if( vp == NULL ) warn("variable \"coin\" not set!!!"); else { if( sscanf(VAR_VALUE(vp),"%d",&coin) != 1 ) warn("error scanning integer from variable \"coin\"\n"); } /* if( coin ){ if( rsp == YES ) rsp = NO; else if( rsp == NO ) rsp = YES; } */ assert( stc_p != NULL ); // analyzer complains coin is a garbage value??? BUG? if( coin ){ SET_STAIR_CRCT_RSP(stc_p,NO); } else { SET_STAIR_CRCT_RSP(stc_p,YES); } if( verbose ){ if( rsp == STAIR_CRCT_RSP(stc_p) ) advise("correct"); else advise("incorrect"); } } return(rsp); }