/* Do a check on an array of liststart/elements, ended with the root-pointer. */ bool isInList3_m(struct ListHeader3 *liststart,struct ListHeader3 *element,...){ va_list ap; struct ListHeader3 *i1; struct ListHeader3 *i2; if(isInList3(liststart,element)==false) return false; va_start(ap,element); for(;;){ i1=va_arg(ap,struct ListHeader3 *); if((void *)i1==(void *)root) break; i2=va_arg(ap,struct ListHeader3 *); if(isInList3(i1,i2)==false){ va_end(ap); return false; } } va_end(ap); return true; }
bool FXTEXT_keypress(struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, Place *place, int key){ struct FXs *fxs; int subsubtrack = FXTEXT_subsubtrack(window, wtrack, &fxs); if (subsubtrack==-1) return false; struct FX *fx = fxs->fx; //printf("FXmin: %d, fxmax: %d\n",fx->min, fx->max); const FXText_trss &fxtexts = FXTEXTS_get(wblock, wtrack, fxs); const FXText_trs &fxtext = fxtexts[realline]; // if (fxtext->num_elements == 0 && val==0) // return true; ADD_UNDO(FXs(window, wblock->block, wtrack->track, wblock->curr_realline)); if (fxtext.size() > 1){ // MORE THAN ONE ELEMENT if (key == EVENT_DEL){ for (auto vt : fxtext) { if (VECTOR_is_in_vector(&wtrack->track->fxs, fxs) && isInList3(&fxs->fxnodelines->l, &vt.fxnodeline->l)) // We might have removed all nodes already (see line below) DeleteFxNodeLine(window, wtrack, fxs, vt.fxnodeline); // In this line, two nodes are removed if there's only two left. } } else { Undo_CancelLastUndo(); } } else if (fxtext.size() == 0){ // NO ELEMENTS if (fx == NULL){ fprintf(stderr, "Can this happen?\n"); Undo_CancelLastUndo(); } else { data_as_text_t dat = DAT_get_newvalue(subsubtrack, key, round(scale_double(0x80, 0, 0x100, fx->min, fx->max)), fx->min, fx->max, true); if (dat.value > fx->max) dat.value = fx->max; if (dat.is_valid==false) return false; int pos = AddFXNodeLine(window, wblock, wtrack, fxs, dat.value, place); struct FXNodeLines *fxnodeline = (struct FXNodeLines*)ListFindElement1_num(&fxs->fxnodelines->l, pos); fxnodeline->logtype = dat.logtype; } } else { // ONE ELEMENT const FXText &vt = fxtext.at(0); struct FXNodeLines *fxnodeline = vt.fxnodeline; if (key == EVENT_DEL) { if (subsubtrack == 2) fxnodeline->logtype = LOGTYPE_LINEAR; else DeleteFxNodeLine(window, wtrack, fxs, fxnodeline); } else { data_as_text_t dat = DAT_get_overwrite(vt.value, vt.logtype, subsubtrack, key, fx->min, fx->max, true, true); printf("fx->min: %x, fx->max: %x, vt.value: %x, dat.value: %x\n",fx->min,fx->max,vt.value,dat.value); if (dat.is_valid==false) return false; fxnodeline->val = dat.value; fxnodeline->logtype = dat.logtype; } } return true; }
bool isInList1( struct ListHeader1 *liststart, struct ListHeader1 *element ){ return isInList3((struct ListHeader3 *)liststart,(struct ListHeader3 *)element); }