📄 megab.c
字号:
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 + -