DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦4aa94133c⟧ TextFile

    Length: 4319 (0x10df)
    Types: TextFile
    Notes: UNIX file
    Names: »dmenu2.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦2d53db1df⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »hr/src/desk/dmenu2.c« 

TextFile

#include <stdio.h>
#include "desk.h"


/************************************************************************

  int  MU_New(id, n, s):		Define a menu
  int  MU_Start(id):			Pop a menu to the screen
  int  MU_End():			Close popup and return choice
  void MU_Close():			Close popup without flashing
  int  MU_Point(pt):			Feed the menu system a point

 ************************************************************************/

MENU	mu_menu[NMENU];
AMENU	mu_am;
IMENU	mu_imenu[MAXIMENU];

int	mu_enable;
int	mu_im;		/* index to next free IMENU elt	*/
int	mu_flash = 5;	/* number of times to flash item*/


/*
** int MU_New(id, n, s)
**
**	Entry:	id,	= menu identifier [0..NMENU-1]
**		n,	= number of menu items [1..NIMENU]
**		s	= ^ to 'n' number of C-string pointers
**
**	Exit:	0,	if OK
**		-1,	if couldn't do it
*/
MU_New(id, n, s)
unsigned id;
unsigned n;
char	*s[];
{
	MENU	*m;
	IMENU	*mi;
	int	i;

	if ( id >= NMENU || n - 1 >= NIMENU || s == NULL )
		return -1;

	m = &mu_menu[id];
	if ( m->mn_n || mu_im + n > MAXIMENU )
		return -2;

	/*
	 *	Do menu definition header
	 */
	m->mn_n = n;
	m->mn_item = mi = &mu_imenu[mu_im];
	m->mn_height = n * dskFntH;
	m->mn_width  = 0;
	mu_im += n;

	/*
	 *	Do menu item initialization
	 */
	for ( i = n ; i ; i-- )
	{
		int	l;

		mi->mi_clen = ((l=strlen(*s)) > 255 ? 255 : l);
		mi->mi_str  = *s;
		mi->mi_flag = 01;
		mi->mi_next = -1;
		mi->mi_len  = ( mi->mi_clen ? D_StrW(*s, mi->mi_clen) : 0 );
		mi->mi_len  += 2*MHFILL;
		if ( mi->mi_len > m->mn_width )
			m->mn_width = mi->mi_len;
		mi++;
		s++;
	}
	return 0;
}


/*
**  int MU_Start(id, pt)
**
**	Entry:	id,	menu id of menu to open as the root
**		pt,	physical coordinate to use to open the window
**
**	Exit:	-1,	if couldn't do it
**
**	Notes:	The upper left corner of the menu shall be located as
**		close to 'pt' as possible. A tree of menus, according
**		to what menus are linked to the menu items is started.
*/
int MU_Start(id, pt)
unsigned id;
POINT	 pt;
{
	RECT	rect;
	int	i;

#ifdef DEBUG
	printf("\nIn MU_Start:\t%d, (%d,%d)\n", id, pt.x, pt.y);
#endif
	ioctl(myfd, CIOMOUSE, MNU_MOUSE);
	if ( (i = mu_OpenMenu(id, pt)) < 0 )
	{
		ioctl(myfd, CIOMOUSE, MNU_MOUSE);
		return i;
	}
	MU_Point(pt);
	return 0;
}


/*
**  int  MU_End() -	Close all popups and return choice
*/
int  MU_End()
{
	unsigned n;
	int	i;
	int	j;

#ifdef DEBUG
	printf("In MU_End\n");
#endif

	if ( !mu_am.ma_menu )
		return -1;
	if ( (n = mu_am.ma_elt) == -1 )
	{
		MU_Close();
		ioctl( myfd, CIOMOUSE, DSK_MOUSE );
		return -1;
	}
	n += (mu_am.ma_menu - mu_menu) << 8;
	for ( i = mu_flash ; i ; i-- )
	{
		mu_InvertItem();
		for (j=5000; j ; j--)
			;
		mu_InvertItem();
		for (j=5000; j ; j--)
			;
	}
	MU_Close();
#ifdef DEBUG
	printf("\t\treturning 0x%x\n", n);
#endif
	ioctl( myfd, CIOMOUSE, DSK_MOUSE );
	return n;
}
	


/*
**  MU_Close() - Close the open menu.
*/
MU_Close()
{
	register int	n;
	register IMENU	*mi;

	if ( !mu_am.ma_menu )
		return;
#ifdef DEBUG
	printf("\tClosing mid=%d\n", mu_am.ma_menu - mu_menu);
#endif
	D_Close(&mu_am.ma_rect, mu_am.ma_heap);
	n  = mu_am.ma_menu->mn_n;
	mi = mu_am.ma_menu->mn_item;
	mu_am.ma_menu = NULL;
	while ( n )
	{
		mi->mi_flag &= 0xfffd;	/* turn off on bit */
		mi++;
		n--;
	} 
}



/*
**  MU_Point(pt) -	Feed the active menu group a point
**
**	Entry:	pt,	physical point
*/
MU_Point(pt)
POINT	pt;
{
	register int	newitem;

#ifdef DEBUG2
	printf("\tIn MU_Point:\t(%d,%d)\n", pt.x, pt.y);
#endif
	if ( !mu_am.ma_menu )
		return;

	newitem = mu_FindItem(pt, &pt);
	if ( newitem != mu_am.ma_elt )
	{
#ifdef DEBUG
		printf("\t\titem %d, olditem %d\n", newitem, mu_am.ma_elt);
#endif
		/* Turn off menu item.
		   Turn on menu item newitem (if not -1).
		*/
		mu_InvertItem();
		if ( (mu_am.ma_elt = newitem) != -1 )
			mu_InvertItem();
	}
}


mu_Panic()
{
	fprintf(stderr, "Menu Panic\n");
	exit(-1);
}


#ifdef DEBUG
dumpamenu(ma)
register AMENU *ma;
{
	printf("\tDUMPA:");
	printf("\tma=0x%lx, mid=%d\n", ma, ma->ma_menu - mu_menu);
	printf("\t\telt=%d, pt=(%d,%d)\n", ma->ma_elt, ma->ma_point.x, ma->ma_point.y);
	printf("\t\trect=(%d,%d),(%d,%d), crect=(%d,%d),(%d,%d)\n",
		ma->ma_rect.origin.x, ma->ma_rect.origin.y,
		ma->ma_rect.corner.x, ma->ma_rect.corner.y,
		ma->ma_crect.origin.x, ma->ma_crect.origin.y,
		ma->ma_crect.corner.x, ma->ma_crect.corner.y);
}
#endif