int sl_dialog(OBJECT *tree, int start, SLIDER *slider) { XDINFO info; int button; sl_init(tree, slider); xd_open(tree, &info); button = sl_form_do(tree, start, slider, &info) & 0x7FFF; xd_change(&info, button, NORMAL, 0); xd_close(&info); return button; }
char *wd_filemask(const char *mask) { int button; int i; XDINFO info; boolean stop = FALSE, redraw, dc, ok; FTYPE *f; SNAME name, newmask; /* HR 240203 */ char *result; SLIDER sl; sl.type = 1; sl.up_arrow = FTUP; sl.down_arrow = FTDOWN; sl.slider = FTSLIDER; sl.sparent = FTSPAR; sl.lines = NLINES; sl.n = cnt_types(); sl.line = 0; sl.set_selector = set_selector; sl.first = FTYPE1; sl.findsel = find_selected; /* DjV 004 290103 ---vvv--- */ if ( mask == NULL ) { setmask[FILETYPE].ob_state |= DISABLED; *setmask[FILETYPE].ob_spec.tedinfo->te_ptext = 0; } else { /* DjV 004 290103 ---^^^--- */ cv_fntoform(setmask + FILETYPE, mask); /* HR 240103 */ setmask[FILETYPE].ob_state &= ~DISABLED; /* DjV 004 290103 */ } /* DjV 004 290103 */ /* DjV 004 020103 Put file attributes buttons into right state */ set_opt( setmask, options.attribs, FA_HIDDEN, MSKHID ); set_opt( setmask, options.attribs, FA_SYSTEM, MSKSYS ); set_opt( setmask, options.attribs, FA_SUBDIR, MSKDIR ); set_opt( setmask, options.attribs, FA_PARDIR, MSKPAR ); sl_init(setmask, &sl); xd_open(setmask, &info); while (stop == FALSE) { redraw = FALSE; button = sl_form_do(setmask, FILETYPE, &sl, &info); dc = (button & 0x8000) ? TRUE : FALSE; button &= 0x7FFF; if ((button < FTYPE1) || (button > FTYPE4)) { switch (button) { case FTADD: name[0] = 0; if (filetype_dialog(name) == TRUE) { add(name); sl.n = cnt_types(); redraw = TRUE; sl_set_slider(setmask, &sl, &info); } break; case FTDELETE: i = find_selected() + sl.line; if ((f = get_item(i)) != NULL) { rem(f); sl.n = cnt_types(); redraw = TRUE; sl_set_slider(setmask, &sl, &info); } break; default: ok = (button == FTOK) ? TRUE : FALSE; stop = TRUE; break; } xd_change(&info, button, NORMAL, (stop == FALSE) ? 1 : 0); } else if ( button >= MSKHID && button <= MSKPAR ) { /* DjV 004 020103 do nothing until exit */ } else { strcpy(filetype, setmask[button].ob_spec.tedinfo->te_ptext); xd_draw(&info, FILETYPE, 1); if (dc == TRUE) { ok = TRUE; stop = TRUE; } } if (redraw == TRUE) set_selector(&sl, TRUE, &info); } xd_close(&info); if (ok == TRUE) { /* DjV 004 030103 ---vvv--- */ get_opt( setmask, &options.attribs, FA_HIDDEN, MSKHID ); get_opt( setmask, &options.attribs, FA_SYSTEM, MSKSYS ); get_opt( setmask, &options.attribs, FA_SUBDIR, MSKDIR ); /* DjV 004 280103 wrongly was MSKHID */ get_opt( setmask, &options.attribs, FA_PARDIR, MSKPAR ); /* DjV 004 020103 ---^^^--- */ if ( mask == NULL ) /* DjV 004 290103 */ return NULL; /* DjV 004 290103 */ else /* DjV 004 290103 */ { /* DjV 004 290103 */ cv_formtofn(newmask, filetype); if ((result = malloc(strlen(newmask) + 1)) != NULL) strcpy(result, newmask); else xform_error(ENSMEM); return result; } /* DjV 004 290103 */ } else return NULL; }
static void setpreferences(void) { int button; int oldbutton; /* DjV 039 090203 aux for arrow_form_do */ /* DjV 019 060103 070103 ---vvv--- */ static XDINFO prefinfo; static int menui=MFIRST;/* .rsc index of currently displayed menu item */ int mi; /* menui - MFIRST */ int redraw; /* true if to redraw menu item and key def */ int lm; /* length of text field in current menu item */ int lf; /* length of form for menu item text */ int i; /* counters */ int tmp[NITEM+2]; /* temporary kbd shortcuts (until OK) */ char aux[5]; /* temp. buffer for string manipulation */ /* DjV 019 060103 070103 ---^^^--- */ xd_set_rbutton(setprefs, OPTPAR2, (options.cprefs & DIALPOS_MODE) ? DMOUSE : DCENTER); xd_set_rbutton(setprefs, OPTPAR1, DNORMAL + options.dial_mode); itoa(options.tabsize, tabsize, 10); /* itoa(options.bufsize, copybuffer, 10); DjV 016 050103 moved to another dialog*/ /* DjV 019 060103 ---vvv--- */ /* button = xd_dialog(setprefs, TABSIZE); */ /* Get length of space for displaying menu items */ lf = setprefs[OPTMTEXT].ob_spec.tedinfo->te_txtlen - 1; /* Copy shortcuts to a temporary buffer (until OK'd) */ for ( i = 0; i <= NITEM; i++ ) tmp[i] = options.V2_2.kbshort[i]; /* Open dialog; then loop until OK or Cancel */ xd_open(setprefs, &prefinfo); redraw = TRUE; button = OPTMNEXT; /* anything*/ oldbutton = -1; /* DjV 039 090203 */ while ( button != OPTOK && button != OPTCANC ) { /* Display text of current menu item */ mi = menui - MFIRST; if ( redraw ) { lm = strlen(menu[menui].ob_spec.free_string); /* How long? Assumed always to be lm > 5 */ /* Copy menu text to dialog, remove shortcut text */ strncpy ( setprefs[OPTMTEXT].ob_spec.tedinfo->te_ptext, menu[menui].ob_spec.free_string, min(lm, lf) ); for ( i= min(lf, lm - 5); i < lf; i++ ) setprefs[OPTMTEXT].ob_spec.tedinfo->te_ptext[i] = ' '; /* Display defined shortcut */ disp_short( setprefs[OPTKKEY].ob_spec.tedinfo->te_ptext, tmp[mi], TRUE ); xd_draw ( &prefinfo, OPTMTEXT, 1 ); xd_draw ( &prefinfo, OPTKKEY, 1 ); redraw = FALSE; } /* HR Do not use goto's!!! */ do /* again: */ { /* xd_change( &prefinfo, button, NORMAL, TRUE ); DjV 039 090203 */ /* button = xd_form_do ( &prefinfo, ROOT ); DjV 039 090203 */ button = arrow_form_do ( &prefinfo, &oldbutton ); /* DjV 039 090203 */ /* Interpret shortcut from the dialog */ strip_name( aux, setprefs[OPTKKEY].ob_spec.tedinfo->te_ptext ); /* strupr ( aux ); DjV 019 280103 not needed anymore */ strcpy ( setprefs[OPTKKEY].ob_spec.tedinfo->te_ptext, aux ); i = strlen( aux ); tmp[mi] = 0; switch ( i ) { case 0: /* nothing defined */ break; case 1: /* single-character shortcut */ tmp[mi] = (int)aux[0]; break; case 2: /* two-character ^something shortcut */ if ( aux[0] == '^' && aux[1] >= 'A' /* DjV 019 280103 changed > 0x20 to >= 'A' */ && aux[1] <= 'Z' ) /* DjV 019 280103 changed > 0x7f fo <= 'Z' */ tmp[mi] = (int)aux[1] | XD_CTRL; else /* DjV 019 280103 */ tmp[mi] = XD_CTRL; /* DjV 019 280103 illegal */ break; default: /* longer shortcuts */ if ( aux[0] == '^' ) { tmp[mi] = XD_CTRL; aux[0] = ' '; strip_name( aux, aux ); } if ( strcmp( aux, "BS" ) == 0 ) tmp[mi] |= BACKSPC; /* DjV 019 280103 used macros instad of hex values*/ else if ( strcmp( aux, "TAB" ) == 0 ) tmp[mi] |= TAB; /* DjV 019 280103 */ else if ( strcmp( aux, "SP" ) == 0 ) tmp[mi] |= SPACE; /* DjV 019 280103 */ else if ( strcmp( aux, "DEL" ) == 0 ) tmp[mi] |= DELETE; /* DjV 019 280103 */ else tmp[mi] = XD_SCANCODE; /* use this to mark invalid */ break; } } while (check_key(button, tmp)); /* * Only menu items which lie between MFIRST and MLAST are considered; * if menu structure is changed, this interval should be redefined too; * only those menu items with a space in the second char position * are considered; other items are assumed not to be valid menu texts * note: below will crash in the (ridiculous) situation when the * first or the last menu item is not a good text */ switch ( button ) { case OPTMPREV: while ( menui > MFIRST && menu[--menui].ob_type != G_STRING); if ( menu[menui].ob_spec.free_string[1] != ' ' ) menui--; redraw = TRUE; break; case OPTMNEXT: while ( menui < MLAST && menu[++menui].ob_type != G_STRING); if ( menu[menui].ob_spec.free_string[1] != ' ' ) menui++; redraw = TRUE; break; case OPTKCLR: for ( i = 0; i <= NITEM; i++ ) tmp[i] = 0; redraw = TRUE; break; default: break; } } /* while... */ xd_close(&prefinfo); /* DjV 019 060103 ---^^^--- */ if (button == OPTOK) { int posmode = XD_CENTERED; /* DjV 019 070103 ---vvv--- */ /* Reset pressed OK button */ xd_change( &prefinfo, OPTOK, NORMAL, FALSE ); /* Move shortcuts into perm. storage and menu and display them */ for ( i = 0; i <= NITEM; i++ ) options.V2_2.kbshort[i] = tmp[i]; ins_shorts(); /* DjV 019 070103 ---^^^--- */ if (xd_get_rbutton(setprefs, OPTPAR2) == DMOUSE) { /* prefs |= DIALPOS_MODE; DjV 016 090103 */ options.cprefs |= DIALPOS_MODE; posmode = XD_MOUSE; } else options.cprefs &= ~DIALPOS_MODE; options.dial_mode = xd_get_rbutton(setprefs, OPTPAR1) - DNORMAL; /* DjV 016 050103 ---vvv--- */ /* moved to copyoptions if ((options.bufsize = atoi(copybuffer)) < 1) options.bufsize = 1; */ /* DjV 016 050103 ---^^^--- */ if ((options.tabsize = atoi(tabsize)) < 1) options.tabsize = 1; set_dialmode(); xd_setposmode(posmode); } /* DjV 019 070103 ---vvv--- */ else xd_change( &prefinfo, OPTCANC, NORMAL, FALSE ); /* DjV 019 070103 ---^^^--- */ }
boolean fnt_dialog(int title, FONT *wd_font, boolean prop) { char name[34]; int button, i, newfont, curobj, cursize, fsizes[100], nfsizes; XDINFO info; SLIDER sl_info; boolean stop = FALSE, ok = FALSE; OBJECT *o = &wdfont[WDFTEXT]; static USERBLK userblock; if ((fd = malloc((nfonts + 1) * sizeof(FONTDATA))) == NULL) { xform_error(ENSMEM); return FALSE; } if (o->ob_type != G_USERDEF) xd_userdef(o, &userblock, draw_text); rsc_title(wdfont, WDFTITLE, title); nf = 0; for (i = 0; i <= nfonts; i++) { FONTDATA *h = &fd[nf]; int j, iw, mw, dummy; char *s = h->name; FONT fnt; h->id = vqt_name(vdi_handle, i + 1, name); fnt_setfont(h->id, 10, &fnt); vqt_width(vdi_handle, 'i', &iw, &dummy, &dummy); vqt_width(vdi_handle, 'm', &mw, &dummy, &dummy); if ((prop != FALSE) || (iw == mw)) { strsncpy(s, name, sizeof(h->name)); /* HR 120203: secure cpy */ j = (int) strlen(h->name); while (j < 16) s[j++] = ' '; h->flag = (int) name[32]; nf++; } } sl_info.type = 0; sl_info.up_arrow = WDFUP; sl_info.down_arrow = WDFDOWN; sl_info.slider = FSLIDER; sl_info.sparent = FSPARENT; sl_info.lines = NLINES; sl_info.n = nf; sl_info.line = set_font(&sl_info, wd_font->id, &font, fd, nf); sl_info.set_selector = set_selector; sl_info.first = WDFONT1; sl_info.findsel = find_selected; fsize = fsizes[cursize = get_size(font, fd, fsizes, &nfsizes, wd_font->size)]; sl_init(wdfont, &sl_info); xd_open(wdfont, &info); while (stop == FALSE) { button = sl_form_do(wdfont, 0, &sl_info, &info) & 0x7FFF; switch (button) { case WDFONT1: case WDFONT2: case WDFONT3: case WDFONT4: case WDFONT5: case WDFONT6: curobj = font - sl_info.line + WDFONT1; if (((newfont = sl_info.line + button - WDFONT1) < nf) && (curobj != button)) { if ((curobj >= WDFONT1) && (curobj <= WDFONT6)) xd_change(&info, curobj, NORMAL, 1); xd_change(&info, button, SELECTED, 1); font = newfont; fsize = fsizes[cursize = get_size(font, fd, fsizes, &nfsizes, fsize)]; xd_draw(&info, WDFTEXT, 1); xd_draw(&info, WDFSIZE, 1); } break; case WDFSUP: if (cursize < nfsizes - 1) { cursize++; goto cont; } xd_change(&info, button, NORMAL, 1); break; case WDFSDOWN: if (cursize > 0) { cursize--; cont:fsize = fsizes[cursize]; itoa(fsize, wdfont[WDFSIZE].ob_spec.free_string, 10); xd_draw(&info, WDFTEXT, 1); xd_draw(&info, WDFSIZE, 1); } xd_change(&info, button, NORMAL, 1); break; case WDFOK: if ((fd[font].id != wd_font->id) || (fsize != wd_font->size)) { wd_font->id = fd[font].id; wd_font->size = fsize; wd_font->cw = chw; wd_font->ch = chh; ok = TRUE; } default: stop = TRUE; break; } } xd_change(&info, button, NORMAL, 0); xd_close(&info); free(fd); return ok; }
xd_t * xd_open (char *fn, int rdwr) { char dn[24]; xd_t *xd; int hd, pp, tt; pp = -1; tt = XDF_FILE; if (fn[0] == '(') { int dd; char *p; if (((fn[1] != 'h') && (fn[1] != 'f')) || (fn[2] != 'd')) return NULL; dd = strtol (fn + 3, &p, 0); if ((dd < 0) || (dd >= MAX_DISKS)) return NULL; if (*p == ',') { pp = strtol (p + 1, &p, 0); if ((pp < 0) || (pp >= MAX_PARTS)) return NULL; } if ((*p != ')') || (*(p + 1) != 0)) return NULL; #if defined(DOS) tt = XDF_DISK; hd = dd; if (fn[1] == 'h') hd += 0x80; goto next; #else tt |= XDF_DISK; if (fn[1] == 'h') { #if defined(WIN32) sprintf (dn, "\\\\.\\PhysicalDrive%d", dd); #elif defined(LINUX) sprintf (dn, "/dev/hd%c", 'a' + dd); #elif defined(FREEBSD) sprintf (dn, "/dev/ad%d", dd); #else return NULL; #endif } else { #if defined(WIN32) if (dd > 1) return NULL; sprintf (dn, "\\\\.\\%c:", 'A' + dd); #elif defined(LINUX) || defined(FREEBSD) sprintf (dn, "/dev/fd%d", dd); #else return NULL; #endif } fn = dn; #endif } #ifdef WIN32 hd = (int) CreateFile (fn, ((rdwr) ? GENERIC_WRITE : 0) | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, 0); #else hd = open (fn, ((rdwr) ? O_RDWR : O_RDONLY) | O_BINARY); #endif if (hd < 0) return NULL; xd = malloc (sizeof (xd_t)); if (xd == NULL) return NULL; xd->flg = tt; xd->num = hd; xd->ofs = 0; #ifdef DOS if (tt == XDF_DISK) xd16_init (xd); #endif if (pp != -1) { xde_t xe; xe.cur = 0xFF; xe.nxt = pp; if ((xd_enum (xd, &xe)) || (xd_seek (xd, xe.bse))) { xd_close (xd); return NULL; } } return xd; }