⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 megab.c

📁 安装DDD之前
💻 C
📖 第 1 页 / 共 3 页
字号:
			else			if (XmIsLabel(children[i]))				labelCount++;			if ((myI != -1) && (oldI != -1))				break;		}		if ( (oldI != -1) && ((myI < oldI) ||			 ((myI > oldI) && labelCount)))			VIS_POS(_mbw) = (HAS_ARROWS(_mbw) ? VIS_COUNT(_mbw) + 1 : ICOUNT(_mbw)-1);	}	drawShadowedItem(_mbw, VIS_POS(_mbw), FALSE);}static void focusOut(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){	if (ICOUNT(_mbw) == 0)		return;	if (TIMER(_mbw) != -1)	{		XtRemoveTimeOut(TIMER(_mbw));		TIMER(_mbw) = -1;	}	drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE);	VIS_POS(_mbw) = 0;}static void borderHighlight(Widget _mbw){	if (ICOUNT(_mbw) == 0)		return;	if ((LABEL(_mbw).menu_type == XmMENU_PULLDOWN) || (LABEL(_mbw).menu_type == XmMENU_POPUP))	{		drawShadowedItem(_mbw, VIS_POS(_mbw), FALSE);	}}static void borderUnhighlight(Widget _mbw){	if (ICOUNT(_mbw) == 0)		return;	if ((LABEL(_mbw).menu_type == XmMENU_PULLDOWN) || (LABEL(_mbw).menu_type == XmMENU_POPUP))		drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE);}static void drawMiniSeparator(Widget _mbw, Position _y){	int i, firstHalf, secondHalf;	firstHalf = MINI_SEP_HEIGHT/2;	secondHalf = firstHalf;	if (MINI_SEP_HEIGHT % 2)		secondHalf++;	for(i=secondHalf;i<MINI_SEP_HEIGHT;i++)		XDrawLine(XtDisplay(_mbw), XtWindow(_mbw), PRIM(_mbw).top_shadow_GC,			0, _y+i, WIDTH(_mbw), _y+i);	for(i=0;i<firstHalf;i++)		XDrawLine(XtDisplay(_mbw), XtWindow(_mbw), PRIM(_mbw).bottom_shadow_GC,			0, _y+i, WIDTH(_mbw), _y+i);}static void drawArrow(Widget _mbw, int _pos, int _direction, Boolean _sensitive){	Dimension arrowWidth;	Position y = 0;	if (HAS_ARROWS(_mbw))	{		if (_pos > 0)			y += MINI_SEP_HEIGHT;		if (_pos > VIS_COUNT(_mbw) )			y += MINI_SEP_HEIGHT;	}	y += (_pos * EL_HEIGHT(_mbw));	arrowWidth = WIDTH(_mbw)/5;	_XmDrawArrow(XtDisplay((Widget)(_mbw)),			XtWindow ((Widget)(_mbw)),			_sensitive ? PRIM(_mbw).top_shadow_GC : PRIM(_mbw).bottom_shadow_GC,			_sensitive ? PRIM(_mbw).bottom_shadow_GC : PRIM(_mbw).top_shadow_GC,			_sensitive ? COPY_GC(_mbw) : LABEL(_mbw).insensitive_GC,			WIDTH(_mbw)/2 - arrowWidth/2,			y + PRIM(_mbw).shadow_thickness,			arrowWidth,			EL_HEIGHT(_mbw) - 2 * (PRIM(_mbw).shadow_thickness),			PRIM(_mbw).shadow_thickness, _direction);}static void timedScroll(XtPointer _closure, XtIntervalId *_id){	XmMegaButtonWidget mbw = (XmMegaButtonWidget)_closure;	scroll((Widget)mbw, TDIR(mbw), TRUE, RDELAY(mbw));}static void scroll(Widget _mbw, int _direction, Boolean _addTimeout, int _delay){	Position sy, dy;	TIMER(_mbw) = -1;	if (_direction == XmTRAVERSE_DOWN)	{		if ((FPOS(_mbw) + VIS_COUNT(_mbw)) >= ICOUNT(_mbw))			return;		/* drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); */		sy = 2 * EL_HEIGHT(_mbw) + MINI_SEP_HEIGHT;		dy = sy - EL_HEIGHT(_mbw);		XCopyArea(XtDisplay(_mbw), XtWindow(_mbw), XtWindow(_mbw),			COPY_GC(_mbw), 			0, sy, WIDTH(_mbw), EL_HEIGHT(_mbw) * (VIS_COUNT(_mbw)-1),			0, dy);		XClearArea(XtDisplay(_mbw), XtWindow(_mbw),			PRIM(_mbw).shadow_thickness, dy + EL_HEIGHT(_mbw) * (VIS_COUNT(_mbw)-1),			WIDTH(_mbw)-2*PRIM(_mbw).shadow_thickness,			EL_HEIGHT(_mbw), FALSE);		FPOS(_mbw)++;		LABEL(_mbw)._label = ITEMS(_mbw)[FPOS(_mbw)+VIS_COUNT(_mbw)-1];		_XmCalcLabelDimensions((Widget)_mbw);		LABEL(_mbw).TextRect.y = YOFFSET(_mbw) + (VIS_COUNT(_mbw)*EL_HEIGHT(_mbw)) + MINI_SEP_HEIGHT;		LABEL(_mbw).TextRect.x = XOFFSET(_mbw);		(*xmLabelWidgetClass->core_class.expose)			((Widget)_mbw,  NULL, (Region)NULL);		if ( (MODE(_mbw) == XmMODE_TOGGLE_BUTTON) && 			((XmMegaButtonWidgetClass)XtClass(_mbw))->mega_button_class.toggleDrawProc)		{			if ((FPOS(_mbw)+VIS_COUNT(_mbw)-1) == SET_POS(_mbw))				(*((XmMegaButtonWidgetClass)XtClass(_mbw))->mega_button_class.toggleDrawProc)(_mbw, LABEL(_mbw).TextRect.x, LABEL(_mbw).TextRect.y, TRUE);			else			if (VIS_W_OFF(_mbw)) 				(*((XmMegaButtonWidgetClass)XtClass(_mbw))->mega_button_class.toggleDrawProc)					(_mbw, LABEL(_mbw).TextRect.x, LABEL(_mbw).TextRect.y, FALSE);		}		if (_addTimeout && ((FPOS(_mbw) + VIS_COUNT(_mbw)) < ICOUNT(_mbw)))		{			TDIR(_mbw) = XmTRAVERSE_DOWN;			TIMER(_mbw) = XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)_mbw),				(unsigned long) _delay,				timedScroll, (XtPointer)_mbw);		}				}	else	if (_direction == XmTRAVERSE_UP)	{		if (FPOS(_mbw) == 0)			return;		/* drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); */		sy = EL_HEIGHT(_mbw) + MINI_SEP_HEIGHT;		dy = sy + EL_HEIGHT(_mbw);		XCopyArea(XtDisplay(_mbw), XtWindow(_mbw), XtWindow(_mbw),			COPY_GC(_mbw),			0, sy, WIDTH(_mbw), EL_HEIGHT(_mbw) * (VIS_COUNT(_mbw)-1),			0, dy);		XClearArea(XtDisplay(_mbw), XtWindow(_mbw),			PRIM(_mbw).shadow_thickness, EL_HEIGHT(_mbw) + MINI_SEP_HEIGHT,			WIDTH(_mbw)-2*PRIM(_mbw).shadow_thickness,			EL_HEIGHT(_mbw), FALSE);		FPOS(_mbw)--;		LABEL(_mbw)._label = ITEMS(_mbw)[FPOS(_mbw)];		_XmCalcLabelDimensions((Widget)_mbw);		LABEL(_mbw).TextRect.y = YOFFSET(_mbw) + EL_HEIGHT(_mbw) + MINI_SEP_HEIGHT;		LABEL(_mbw).TextRect.x = XOFFSET(_mbw);		(*xmLabelWidgetClass->core_class.expose) ((Widget)_mbw,  NULL, (Region)NULL);		if ( (MODE(_mbw) == XmMODE_TOGGLE_BUTTON) &&			((XmMegaButtonWidgetClass)XtClass(_mbw))->mega_button_class.toggleDrawProc)		{			if (FPOS(_mbw) == SET_POS(_mbw))				(*((XmMegaButtonWidgetClass)XtClass(_mbw))->mega_button_class.toggleDrawProc)						(_mbw, LABEL(_mbw).TextRect.x, LABEL(_mbw).TextRect.y, TRUE);			else			if (VIS_W_OFF(_mbw))				(*((XmMegaButtonWidgetClass)XtClass(_mbw))->mega_button_class.toggleDrawProc)					(_mbw, LABEL(_mbw).TextRect.x, LABEL(_mbw).TextRect.y, FALSE);		}		if (_addTimeout && (FPOS(_mbw) != 0))		{			TDIR(_mbw) = XmTRAVERSE_UP;			TIMER(_mbw) = XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)_mbw),				(unsigned long) _delay, 				timedScroll, (XtPointer)_mbw);		}	}	if (_direction == XmTRAVERSE_DOWN)	{		if (FPOS(_mbw) != 0)		{			if (((ICOUNT(_mbw))-FPOS(_mbw)) <= VIS_COUNT(_mbw))			{				clearArrow(_mbw, VIS_COUNT(_mbw)+1);				drawArrow(_mbw, VIS_COUNT(_mbw)+1, XmARROW_DOWN, FALSE);			}			drawArrow(_mbw, 0, XmARROW_UP, TRUE);		}	}	else	{		if (FPOS(_mbw) == 0)		{			clearArrow(_mbw, 0);			drawArrow(_mbw, 0, XmARROW_UP, FALSE);		}		drawArrow(_mbw, VIS_COUNT(_mbw)+1, XmARROW_DOWN, TRUE);	}}static void toggleDrawProc(Widget _mbw, Position _x, Position _y, Boolean _on){	int ecalc;	ecalc = STR_HEIGHT(_mbw) - 2 * PRIM(_mbw).shadow_thickness;	if (ecalc < 5)		ecalc = 5;	_y += EL_HEIGHT(_mbw)/2 - ecalc/2 - PRIM(_mbw).shadow_thickness;	_x -= (ecalc + LABEL(_mbw).margin_width);	_XmDrawDiamond(XtDisplay((Widget)_mbw), XtWindow((Widget)_mbw),			_on ? PRIM(_mbw).bottom_shadow_GC : PRIM(_mbw).top_shadow_GC,			_on ? PRIM(_mbw).top_shadow_GC : PRIM(_mbw).bottom_shadow_GC,			_on ? SELECT_GC(_mbw) : COPY_GC(_mbw),			_x, _y,			ecalc, ecalc,			PRIM(_mbw).shadow_thickness,			TRUE);}static void toggleSpaceProc(Widget _mbw, Dimension *_width, Dimension *_height){	int ecalc = STR_HEIGHT(_mbw) - 2 * PRIM(_mbw).shadow_thickness;	if (ecalc < 5)		ecalc = 5;	XOFFSET(_mbw) += ecalc + LABEL(_mbw).margin_width;	*_width += ecalc + LABEL(_mbw).margin_width;}static void findGoodShowPos(Widget _mbw){	int topDiff, bottomDiff;	if (MODE(_mbw) != XmMODE_TOGGLE_BUTTON)	{		FPOS(_mbw) = 0;		return;	}	VIS_POS(_mbw) = 0;	if (!HAS_ARROWS(_mbw) || (SET_POS(_mbw) == -1))		FPOS(_mbw) = 0;	else	{		topDiff = SET_POS(_mbw) - VIS_COUNT(_mbw)/2;		if (topDiff < 0)			FPOS(_mbw) = 0;		else		{			bottomDiff = (ICOUNT(_mbw)-1) - SET_POS(_mbw);			if (bottomDiff < VIS_COUNT(_mbw))				FPOS(_mbw) = (ICOUNT(_mbw))-VIS_COUNT(_mbw);			else				FPOS(_mbw) = topDiff;		}	}}static void toLower(char *_str1, char *_str2, int _length){	int i;	char *ptr;	for(ptr=_str1,i=0;(ptr!=NULL) && (i<_length);ptr++,i++)		*(_str2+i) = tolower(*ptr);}static Boolean cvtStringToMegaButtonMode(Display *_display, XrmValuePtr _args,	Cardinal *_numArgs, XrmValuePtr _from, XrmValuePtr _to, XtPointer *_data){	char *lower;	static unsigned char mode;	Boolean badConversion = FALSE;	if (*_numArgs != 0)	{		XtAppWarningMsg(XtDisplayToApplicationContext(_display), "cvtStringToMegaButtonMode", "wrongParamaters",		"ResourceError",		"cvtStringToMegaButtonMode needs no arguments.",		(String *)NULL, (Cardinal *)NULL);	}	lower = XtNewString(_from->addr);	toLower(_from->addr, lower, strlen(_from->addr));	mode = XmMODE_TOGGLE_BUTTON;	if (!strncmp(lower, "mode_toggle_button", 18))		mode = XmMODE_TOGGLE_BUTTON;	else	if (!strncmp(lower, "mode_push_button", 16))		mode = XmMODE_PUSH_BUTTON;	else	if (!strncmp(lower, "toggle_button", 13))		mode = XmMODE_TOGGLE_BUTTON;	else	if (!strncmp(lower, "push_button", 11))		mode = XmMODE_PUSH_BUTTON;	else		badConversion = TRUE;	XtFree(lower);	if (badConversion)		XtDisplayStringConversionWarning(_display, _from->addr, XmRMegaButtonMode);	else	{		if (_to->addr == NULL)			_to->addr = (XtPointer)&mode;		else		if (_to->size < sizeof(unsigned char))			badConversion = TRUE;		else			*(unsigned char *)_to->addr = mode;			_to->size = sizeof(unsigned char);	}	return !badConversion;}void XmMegaButtonAddItem(Widget _w, XmString _item, int _pos, XtPointer _cbData){	XmMegaButtonWidget mbw;	if (!XmIsMegaButton(_w))		return;	mbw = (XmMegaButtonWidget)_w;	if (FAKE_ITEM(mbw))	{		ICOUNT(mbw)--;		FAKE_ITEM(mbw) = FALSE;		WIDTH(mbw) = 0;		MAX_STRING_WIDTH(mbw) = 1;	}	if ((_pos < 0) ||  (_pos > (ICOUNT(mbw))))		_pos = ICOUNT(mbw);	if (ICOUNT(mbw) == CUR_SIZE(mbw))	{		CUR_SIZE(mbw) += CHUNK_SIZE(mbw);		ITEMS(mbw) = (_XmString *)XtRealloc((char *)ITEMS(mbw), sizeof(_XmString) * CUR_SIZE(mbw));		DATA(mbw) = (XtPointer *)XtRealloc((char *)DATA(mbw), sizeof(XtPointer) * CUR_SIZE(mbw));	}	bcopy(ITEMS(mbw)+_pos, ITEMS(mbw)+_pos+1, (ICOUNT(mbw)-_pos) * sizeof(_XmString));	bcopy(DATA(mbw)+_pos, DATA(mbw)+_pos+1, (ICOUNT(mbw)-_pos) * sizeof(XtPointer));	ITEMS(mbw)[_pos] = _XmStringCreate(_item);	DATA(mbw)[_pos] = _cbData;	ICOUNT(mbw)++;	recheckSizesAtPos((Widget)mbw, _pos);}static void recheckSizesAtPos(Widget _mbw, int _pos){	ShellWidget popupShell;	XtGeometryResult result;	popupShell = (ShellWidget)XtGetShell((Widget)_mbw);	if (popupShell && !popupShell->shell.popped_up)	{		Dimension width, height;		Dimension replyWidth, replyHeight, oldWidth;		width = WIDTH(_mbw);		height = HEIGHT(_mbw);		if (!HAS_ARROWS(_mbw))		{			HAS_ARROWS(_mbw) = ICOUNT(_mbw) > VIS_COUNT(_mbw);			if (!HAS_ARROWS(_mbw))				height = EL_HEIGHT(_mbw) * ICOUNT(_mbw);			else				height = EL_HEIGHT(_mbw) * (VIS_COUNT(_mbw) + 2) + 2 * MINI_SEP_HEIGHT;		}		LABEL(_mbw)._label = ITEMS(_mbw)[_pos];		_XmCalcLabelDimensions((Widget)_mbw);		if (LABEL(_mbw).TextRect.width > MAX_STRING_WIDTH(_mbw))		{			MAX_STRING_WIDTH(_mbw) = LABEL(_mbw).TextRect.width;			MAX_STRING_POS(_mbw) = _pos;			oldWidth = WIDTH(_mbw);			WIDTH(_mbw) = 0;			(*xmLabelWidgetClass->core_class.resize) ((Widget)_mbw);			width = WIDTH(_mbw);			WIDTH(_mbw) = oldWidth;/* 			YOFFSET(_mbw) = LABEL(_mbw).TextRect.y; */			XOFFSET(_mbw) = LABEL(_mbw).TextRect.x;			if ( (MODE(_mbw) == XmMODE_TOGGLE_BUTTON) && 						( ((XmMegaButtonWidgetClass)XtClass(_mbw))->mega_button_class.toggleSpaceProc))				(( (XmMegaButtonWidgetClass)XtClass(_mbw))->mega_button_class.toggleSpaceProc)						(_mbw, &width, &EL_HEIGHT(_mbw));		}		if (height == 0)			height = 2 * PRIM(_mbw).shadow_thickness;		if (width == 0)			width = 2 * PRIM(_mbw).shadow_thickness;		while((result = XtMakeResizeRequest((Widget)_mbw, width, height, &replyWidth,			&replyHeight)) == XtGeometryAlmost)		{			width = replyWidth;			height = replyHeight;		}	}}XtPointer XmMegaButtonRemoveItem(Widget _w, int _pos){	XtPointer data;	XmMegaButtonWidget mbw;	mbw = (XmMegaButtonWidget)_w;	if ((_pos < 0) || (_pos >= ICOUNT(mbw)))		return NULL;	_XmStringFree(ITEMS(mbw)[_pos]);	data = DATA(mbw)[_pos];	ICOUNT(mbw)--;	bcopy(ITEMS(mbw)+_pos+1, ITEMS(mbw)+_pos, (ICOUNT(mbw)-_pos) * sizeof(_XmString));	bcopy(DATA(mbw)+_pos+1, DATA(mbw)+_pos, (ICOUNT(mbw)-_pos) * sizeof(XtPointer));	if (ICOUNT(mbw) != 0)		recheckSizesAtPos((Widget)mbw, 0);	return data;}int XmMegaButtonItemCount(Widget _w, Boolean _forgetFake){	XmMegaButtonWidget mbw;	mbw = (XmMegaButtonWidget)_w;	if (_forgetFake && FAKE_ITEM(mbw))		return 0;	else		return (ICOUNT(mbw));}int XmMegaButtonGetPos(Widget _w){	XmMegaButtonWidget mbw;	mbw = (XmMegaButtonWidget)_w;	if (MODE(mbw) == XmMODE_TOGGLE_BUTTON)		return SET_POS(mbw);	else		return -1;}void XmMegaButtonSetPos(Widget _w, int _pos){	XmMegaButtonWidget mbw;	mbw = (XmMegaButtonWidget)_w;	if (MODE(mbw) == XmMODE_TOGGLE_BUTTON)	{		if (_pos > (ICOUNT(mbw)-1))			_pos = ICOUNT(mbw) - 1;		SET_POS(mbw) = _pos;	}}extern XmString XmMegaButtonGetXmStringAtPos(Widget _w, int _pos){	XmMegaButtonWidget mbw = (XmMegaButtonWidget)_w;		if ((_pos >= 0) && (_pos < ICOUNT(mbw)))		return _XmStringCreateExternal(LABEL(mbw).font, ITEMS(mbw)[_pos]);	return (XmString)NULL;}extern void XmMegaButtonSetXmStringAtPos(Widget _w, XmString _xmstring, int _pos){	XmMegaButtonWidget mbw = (XmMegaButtonWidget)_w;	if ((_pos >= 0) && (_pos < ICOUNT(mbw)))	{		_XmStringFree(ITEMS(mbw)[_pos]);		ITEMS(mbw)[_pos] = _XmStringCreate(_xmstring);		recheckSizesAtPos((Widget)mbw, _pos);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -