Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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 ---^^^--- */
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}