📄 megab.c
字号:
} first = FPOS(_mbw); mwp = 0; maxHeight = 1; maxWidth = 1; for(i=0; (first + i) < ICOUNT(_mbw); i++) { LABEL(_mbw)._label = ITEMS(_mbw)[first+i]; _XmCalcLabelDimensions((Widget)_mbw); if (LABEL(_mbw).TextRect.width > maxWidth) { maxWidth = LABEL(_mbw).TextRect.width; mwp = i; } if (LABEL(_mbw).TextRect.height > maxHeight) maxHeight = LABEL(_mbw).TextRect.height; } *_maxWidthPos = mwp; *_height = maxHeight;} static void drawShadowedItem(Widget _mbw, int _pos, Boolean _clear){ Position y; if ( (_pos < 0) || (HAS_ARROWS(_mbw) && (_pos > (VIS_COUNT(_mbw)+1))) || (!HAS_ARROWS(_mbw) && (_pos >= VIS_COUNT(_mbw))) ) return; 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)); if (_clear) { _XmClearBorder(XtDisplay((Widget)_mbw), XtWindow((Widget)_mbw), 0, y, WIDTH(_mbw), EL_HEIGHT(_mbw), PRIM(_mbw).shadow_thickness); } else { _XmDrawShadows(XtDisplay((Widget)_mbw), XtWindow((Widget)_mbw), PRIM(_mbw).top_shadow_GC, PRIM(_mbw).bottom_shadow_GC, 0, y, WIDTH(_mbw), EL_HEIGHT(_mbw), PRIM(_mbw).shadow_thickness, XmSHADOW_OUT); }}static void clearArrow(Widget _mbw, int _pos){ 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)); XClearArea(XtDisplay(_mbw), XtWindow(_mbw), PRIM(_mbw).shadow_thickness, y + PRIM(_mbw).shadow_thickness, WIDTH(_mbw) - 2 * PRIM(_mbw).shadow_thickness, EL_HEIGHT(_mbw) - 2 * PRIM(_mbw).shadow_thickness, FALSE);}static int yToPos(Widget _mbw, Position _y){ Dimension topOffset, bottomOffset; if ((_y >= 0) && HAS_ARROWS(_mbw)) { if ((Dimension)_y <= EL_HEIGHT(_mbw)) return 0; topOffset = EL_HEIGHT(_mbw) + MINI_SEP_HEIGHT; if ((Dimension)_y <= topOffset) return 0; bottomOffset = HEIGHT(_mbw) - EL_HEIGHT(_mbw); if ((Dimension)_y >= bottomOffset) return VIS_COUNT(_mbw)+1; bottomOffset -= MINI_SEP_HEIGHT; if ((Dimension)_y >= bottomOffset) return VIS_COUNT(_mbw); _y -= MINI_SEP_HEIGHT; } return _y/EL_HEIGHT(_mbw);}static void enterWidget(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){ if (ICOUNT(_mbw) == 0) return; XtCallActionProc((Widget)_mbw, "PrimitiveEnter", _event, _params, *_numParams); if ( LABEL(_mbw).menu_type != XmWORK_AREA ) { if (_XmGetInDragMode((Widget)_mbw)) { drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); VIS_POS(_mbw) = yToPos(_mbw, _event->xbutton.y); drawShadowedItem(_mbw, VIS_POS(_mbw), FALSE); if (HAS_ARROWS(_mbw)) { if (VIS_POS(_mbw) == VIS_COUNT(_mbw)+1) { TDIR(_mbw) = XmTRAVERSE_DOWN; TIMER(_mbw) = XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)_mbw), (unsigned long)IDELAY(_mbw), timedScroll, (XtPointer)_mbw); } else if (VIS_POS(_mbw) == 0) { TDIR(_mbw) = XmTRAVERSE_UP; TIMER(_mbw) = XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)_mbw), (unsigned long)IDELAY(_mbw), timedScroll, (XtPointer)_mbw); } } } } } static void leaveWidget(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){ if (ICOUNT(_mbw) == 0) return; XtCallActionProc((Widget)_mbw, "PrimitiveLeave", _event, _params, *_numParams); if ( LABEL(_mbw).menu_type != XmWORK_AREA ) {/* if ( _XmGetInDragMode((Widget)_mbw) ) */ /* drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); */ if (TIMER(_mbw) != -1) { XtRemoveTimeOut(TIMER(_mbw)); TIMER(_mbw) = -1; } } drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE);} static void buttonMotion(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){ if (ICOUNT(_mbw) == 0) return; if ( LABEL(_mbw).menu_type != XmWORK_AREA ) { int pos = yToPos(_mbw, _event->xmotion.y); if (pos != VIS_POS(_mbw)) { if (TIMER(_mbw) != -1) { XtRemoveTimeOut(TIMER(_mbw)); TIMER(_mbw) = -1; } drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); drawShadowedItem(_mbw, pos, FALSE); VIS_POS(_mbw) = pos; if (HAS_ARROWS(_mbw)) { if (VIS_POS(_mbw) == VIS_COUNT(_mbw)+1) scroll(_mbw, XmTRAVERSE_DOWN, TRUE, IDELAY(_mbw)); else if (VIS_POS(_mbw) == 0) scroll(_mbw, XmTRAVERSE_UP, TRUE, IDELAY(_mbw)); } _XmSetInDragMode((Widget)_mbw, TRUE); } }} static void up(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){ int vpos; if (ICOUNT(_mbw) == 0) return; if (LABEL(_mbw).menu_type != XmWORK_AREA ) { if (!_XmGetInDragMode((Widget)_mbw)) { vpos = VIS_POS(_mbw); vpos--; if ((vpos == -1) && (FPOS(_mbw) == 0)) { CompositeWidget parent = (CompositeWidget)XtParent(_mbw); if (parent->composite.num_children > 1) { XtCallActionProc((Widget)_mbw, "PrimitiveTraverseUp", _event, _params, *_numParams); return; } } if (HAS_ARROWS(_mbw) && (vpos <= 0)) { if (vpos == 0) { drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); drawShadowedItem(_mbw, vpos, FALSE); } scroll(_mbw, XmTRAVERSE_UP, FALSE, 0); VIS_POS(_mbw) = 0; } else { if (!HAS_ARROWS(_mbw) && (vpos == -1)) vpos = ICOUNT(_mbw)-1; if (vpos != VIS_POS(_mbw)) { drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); drawShadowedItem(_mbw, vpos, FALSE); VIS_POS(_mbw) = vpos; } } _XmRecordEvent(_event); } }}static void down(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){ int vpos; if (ICOUNT(_mbw) == 0) return; if (LABEL(_mbw).menu_type != XmWORK_AREA ) { if (!_XmGetInDragMode((Widget)_mbw)) { vpos = VIS_POS(_mbw); vpos++; _XmRecordEvent(_event); if (HAS_ARROWS(_mbw) && (vpos >= (VIS_COUNT(_mbw) + 1))) { if (VIS_POS(_mbw) != (VIS_COUNT(_mbw)+1)) { drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); drawShadowedItem(_mbw, vpos, FALSE); } else if (FPOS(_mbw) >= (ICOUNT(_mbw)-VIS_COUNT(_mbw))) { CompositeWidget parent = (CompositeWidget)XtParent(_mbw); if (parent->composite.num_children > 1) { XtCallActionProc((Widget)_mbw, "PrimitiveTraverseDown", _event, _params, *_numParams); return; } } scroll(_mbw, XmTRAVERSE_DOWN, FALSE, 0); VIS_POS(_mbw) = VIS_COUNT(_mbw) + 1; } else { if (!HAS_ARROWS(_mbw)) { if (vpos == ICOUNT(_mbw)) { CompositeWidget parent = (CompositeWidget)XtParent(_mbw); if (parent->composite.num_children > 1) { XtCallActionProc((Widget)_mbw, "PrimitiveTraverseDown", _event, _params, *_numParams); return; } else vpos = 0; } } drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); drawShadowedItem(_mbw, vpos, FALSE); VIS_POS(_mbw) = vpos; } } }}static void buttonUp(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){ XmMegaButtonCallbackStruct mtbcs; Widget parent, shell; Boolean validButton; Boolean poppedUp; Boolean isMenuPane; if (TIMER(_mbw) != -1) { XtRemoveTimeOut(TIMER(_mbw)); TIMER(_mbw) = -1; } if (ICOUNT(_mbw) == 0) return; isMenuPane = (LABEL(_mbw).menu_type == XmMENU_PULLDOWN) || (LABEL(_mbw).menu_type == XmMENU_POPUP); shell = XtGetShell((Widget)_mbw); parent = XtParent(_mbw); if (_event && (_event->type == ButtonRelease)) { (* xmLabelClassRec.label_class.menuProcs) (XmMENU_BUTTON, parent, NULL, _event, &validButton); if (!validButton) return; VIS_POS(_mbw) = yToPos(_mbw, _event->xbutton.y); } if (HAS_ARROWS(_mbw) && !_XmGetInDragMode((Widget)_mbw)) { if (VIS_POS(_mbw) == 0) { _XmRecordEvent(_event); return; } else if (VIS_POS(_mbw) == (VIS_COUNT(_mbw)+1)) { _XmRecordEvent(_event); return; } } if (isMenuPane && !XmIsMenuShell(shell)) (* xmLabelClassRec.label_class.menuProcs) (XmMENU_POPDOWN, (Widget) _mbw, NULL, _event, &poppedUp); else (* xmLabelClassRec.label_class.menuProcs) (XmMENU_BUTTON_POPDOWN, (Widget) _mbw , NULL, _event, &poppedUp); _XmRecordEvent(_event); if (poppedUp) return; mtbcs.reason = XmCR_ACTIVATE; mtbcs.event = _event; if (HAS_ARROWS(_mbw)) { if ((VIS_POS(_mbw) == 0) || (VIS_POS(_mbw) == (VIS_COUNT(_mbw)+1))) return; mtbcs.pos = FPOS(_mbw) + VIS_POS(_mbw) - 1; } else mtbcs.pos = VIS_POS(_mbw); mtbcs.callbackValue = DATA(_mbw)[mtbcs.pos]; mtbcs.string = _XmStringCreateExternal(LABEL(_mbw).font, ITEMS(_mbw)[mtbcs.pos]); SET_POS(_mbw) = mtbcs.pos;#if 0 if (XmIsRowColumn(parent)) (* xmLabelClassRec.label_class.menuProcs) (XmMENU_CALLBACK, parent, FALSE, _mbw, (XtPointer)&mtbcs); else#endif XtCallCallbackList((Widget)_mbw, PUSH(_mbw).activate_callback, &mtbcs); _XmSetInDragMode((Widget)_mbw, False);}static void buttonDown(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParms){ ShellWidget popupShell; int validButton, pos = 0; Widget child; if (ICOUNT(_mbw) == 0) return; XAllowEvents(XtDisplay(_mbw), SyncPointer, CurrentTime); if (_event && (_event->type == ButtonPress)) { (* xmLabelClassRec.label_class.menuProcs) (XmMENU_BUTTON, XtParent(_mbw), NULL, _event, &validButton); if (!validButton) return; pos = yToPos(_mbw, _event->xbutton.y); } if (HAS_ARROWS(_mbw) && !_XmGetInDragMode((Widget)_mbw)) { if (pos == 0) { drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); VIS_POS(_mbw) = pos; drawShadowedItem(_mbw, VIS_POS(_mbw), FALSE); _XmRecordEvent(_event); scroll(_mbw, XmTRAVERSE_UP, TRUE, IDELAY(_mbw)); return; } else if (pos == (VIS_COUNT(_mbw)+1)) { drawShadowedItem(_mbw, VIS_POS(_mbw), TRUE); VIS_POS(_mbw) = pos; drawShadowedItem(_mbw, VIS_POS(_mbw), FALSE); _XmRecordEvent(_event); scroll(_mbw, XmTRAVERSE_DOWN, TRUE, IDELAY(_mbw)); return; } } VIS_POS(_mbw) = pos; _XmSetInDragMode((Widget)_mbw, TRUE); popupShell = (ShellWidget)_XmGetRC_PopupPosted(XtParent(_mbw)); if (popupShell) { if (popupShell->shell.popped_up) (* xmLabelClassRec.label_class.menuProcs)(XmMENU_SHELL_POPDOWN, (Widget)popupShell, NULL, _event, NULL); child = ((XmManagerWidget)XtParent(_mbw))->manager.active_child; if (child && (XmIsCascadeButton(child) || XmIsCascadeButtonGadget(child))) XmCascadeButtonHighlight (child, FALSE); } XmProcessTraversal( (Widget)_mbw, XmTRAVERSE_CURRENT); _XmSetInDragMode((Widget)_mbw, FALSE); _XmRecordEvent(_event);}static void armAndActivate(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){ XmMegaButtonCallbackStruct mtbcs; if (ICOUNT(_mbw) == 0) return; mtbcs.reason = XmCR_ACTIVATE; mtbcs.event = _event; if (HAS_ARROWS(_mbw)) { if ((VIS_POS(_mbw) == 0) || (VIS_POS(_mbw) == (VIS_COUNT(_mbw)+1))) return; mtbcs.pos = FPOS(_mbw) + VIS_POS(_mbw) - 1; } else mtbcs.pos = VIS_POS(_mbw); mtbcs.callbackValue = DATA(_mbw)[mtbcs.pos]; mtbcs.string = _XmStringCreateExternal(LABEL(_mbw).font, ITEMS(_mbw)[mtbcs.pos]); SET_POS(_mbw) = mtbcs.pos; XFlush(XtDisplay(_mbw)); XtCallCallbackList((Widget)_mbw, PUSH(_mbw).activate_callback, &mtbcs);}static Widget XtGetShell(Widget _w){ Widget temp; temp = _w; while(temp && !XtIsSubclass(temp, shellWidgetClass)) temp = XtParent(temp); return temp;}#if !HAVE_SOURCE && !defined(LESSTIF_VERSION)struct _XmFocusDataRec{ Widget not_used; Widget not_used_2; Widget old_focus_item;};#endif /* HAVE_SOURCE *//*** This is a tad hackish. The general idea is that there is no way to tell which** directory the focusIn event came from if we are in a menu. So get the** focusData which has the last widget to have focus. Use this as an index** into the RowCol's children, and go from there.*/static void focusIn(Widget _mbw, XEvent *_event, String *_params, Cardinal *_numParams){ int labelCount; Widget oldFocus; CompositeWidget parent; XmFocusData focusData; WidgetList children; int myI, oldI, i; VIS_POS(_mbw) = 0; if (ICOUNT(_mbw) == 0) return; focusData = _XmGetFocusData((Widget)_mbw); if (focusData && focusData->old_focus_item) { oldFocus = focusData->old_focus_item; parent = (CompositeWidget)XtParent(_mbw); children = parent->composite.children; myI = -1; oldI = -1; labelCount = 0; for(i=0;(i<parent->composite.num_children);i++) { if (children[i] == (Widget)_mbw) myI = i; else if (children[i] == oldFocus) oldI = i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -