📄 textfield.c
字号:
if (end <= w->text.HighlightEnd) clip = end; else clip = w->text.HighlightEnd; DrawText(w, start, clip, True); start = clip; } else { DrawText(w, start, end, False); start = end; } } } }}static voidDrawTextReposition(TextFieldWidget w){ int xsrc, xdest, width, start, end; Widget aw = (Widget) w; if (!w->text.Echo) return; if (w->text.XOffset < w->text.OldXOffset) { xsrc = w->text.OldXOffset - w->text.XOffset; xdest = 0; width = w->text.ViewWidth - xsrc + 1; /* Need to redraw some characters at the end. */ end = TextPixelToPos(w, w->text.Margin + w->text.ViewWidth); start = TextPixelToPos(w, w->text.Margin + w->text.ViewWidth - xsrc); } else if (w->text.XOffset > w->text.OldXOffset) { xsrc = 0; xdest = w->text.XOffset - w->text.OldXOffset; width = w->text.ViewWidth - xdest + 1; /* Need to redraw some characters at the beginning. */ start = TextPixelToPos(w, w->text.Margin); end = TextPixelToPos(w, w->text.Margin + xdest); } else return; if (width > 0) {#ifdef DEBUG_TF printf("Reposition: xoff=%d old=%d src=%d dest=%d width=%d refresh %d-%d\n", w->text.XOffset, w->text.OldXOffset, xsrc, xdest, width, start, end);#endif if (XtIsRealized(aw)) XCopyArea(XtDisplay(w), XtWindow(w), XtWindow(w), w->text.drawGC, w->text.Margin + xsrc, 0, (unsigned int) width, (unsigned int) w->core.height, w->text.Margin + xdest, 0); DrawTextRange(w, start, end); } w->text.OldXOffset = w->text.XOffset;}static voidDrawTextWithCopyArea(TextFieldWidget w){ int x, insert_width; int xsrc, xdest, width; Widget aw = (Widget) w; if (!w->text.Echo) return; x = w->text.XOffset; insert_width = FontTextWidth(w->text.font, &w->text.Text[w->text.FastInsertCursorStart], w->text.FastInsertTextLen); if (PositionCursor(w)) { /* * if the text is scrolled, then: * 1. the cursor is at the end * 2. the copy will move to the left. */ xsrc = 0; width = w->text.OldCursorX + x; xdest = w->text.ViewWidth - (x + w->text.OldCursorX) - insert_width; if (XtIsRealized(aw)) XCopyArea(XtDisplay(w), XtWindow(w), XtWindow(w), w->text.drawGC, w->text.Margin + xsrc, 0, (unsigned int) width, (unsigned int) w->core.height, w->text.Margin + xdest, 0);#ifdef DEBUG_TF printf("DrawInsert: x=%d xsrc=%d xdest=%d width=%d\n", x, xsrc, xdest, width);#endif } else { /* * the text hasn't been scrolled, so: * 1. the text left of the cursor won't change * 2. the stuff after the cursor will be moved right. */ xsrc = FontTextWidth(w->text.font, w->text.Text, w->text.FastInsertCursorStart) + x; width = w->text.ViewWidth - xsrc; xdest = xsrc + insert_width; if (XtIsRealized(aw)) XCopyArea(XtDisplay(w), XtWindow(w), XtWindow(w), w->text.drawGC, w->text.Margin + xsrc, 0, (unsigned int) width, (unsigned int) w->core.height, w->text.Margin + xdest, 0);#ifdef DEBUG_TF printf("DrawInsert: x=%d xsrc=%d xdest=%d width=%d\n", x, xsrc, xdest, width);#endif } DrawTextRange(w, w->text.FastInsertCursorStart, w->text.FastInsertCursorStart + w->text.FastInsertTextLen); if (w->text.TextMaxLen > 0) { /* * This is pretty much a hack: * clear everything to end of window if this is a * fixed length TextField */ xsrc = w->text.XOffset + w->text.TextWidth; width = w->text.ViewWidth - xsrc; /* printf("DrawInsert: TextWidth=%d Old=%d\n", w->text.TextWidth, w->text.OldTextWidth); */ if (XtIsRealized(aw)) XClearArea(XtDisplay(w), XtWindow(w), w->text.Margin + xsrc, 0, (unsigned int) width, w->core.height, False); } else if (w->text.TextWidth < w->text.OldTextWidth) { if (XtIsRealized(aw)) XClearArea(XtDisplay(w), XtWindow(w), w->text.Margin + w->text.XOffset + w->text.TextWidth, 0, w->text.OldTextWidth - w->text.TextWidth + 1, w->core.height, False); } w->text.OldTextWidth = w->text.TextWidth; w->text.OldXOffset = w->text.XOffset;}static voidDrawAllText(TextFieldWidget w){ Widget aw = (Widget) w; if (!w->text.Echo) return; DrawTextRange(w, 0, w->text.TextLen); if (w->text.TextWidth < w->text.OldTextWidth) { if (XtIsRealized(aw)) XClearArea(XtDisplay(w), XtWindow(w), w->text.Margin + w->text.XOffset + w->text.TextWidth, 0, w->text.OldTextWidth - w->text.TextWidth + 1, w->core.height, False); } w->text.OldTextWidth = w->text.TextWidth; w->text.OldXOffset = w->text.XOffset; w->text.OldHighlightStart = w->text.HighlightStart; w->text.OldHighlightEnd = w->text.HighlightEnd;}/* Draw an I-beam cursor */static voidDrawIBeamCursor(TextFieldWidget w, int x, GC gc){ Widget aw = (Widget) w; if (!XtIsRealized(aw)) return; XDrawLine(XtDisplay(w), XtWindow(w), gc, x, w->text.YOffset - FontAscent(w->text.font) - 1, x, w->text.YOffset + FontDescent(w->text.font) + 1); XDrawLine(XtDisplay(w), XtWindow(w), gc, x - 2, w->text.YOffset - FontAscent(w->text.font) - 1, x + 2, w->text.YOffset - FontAscent(w->text.font) - 1); XDrawLine(XtDisplay(w), XtWindow(w), gc, x - 2, w->text.YOffset + FontDescent(w->text.font) + 1, x + 2, w->text.YOffset + FontDescent(w->text.font) + 1);}static voidDrawCursor(TextFieldWidget w){ int x; GC gc; if (w->text.DisplayCursor) { x = FontTextWidth(w->text.font, w->text.Text, w->text.CursorPos); w->text.OldCursorPos = w->text.CursorPos; w->text.OldCursorX = x; x += w->text.Margin + w->text.XOffset; gc = w->text.cursorGC; DrawIBeamCursor(w, x, gc); }}static voidEraseCursor(TextFieldWidget w){ int x; if (w->text.DisplayCursor && w->text.OldCursorX >= 0) { x = w->text.OldCursorX + w->text.Margin + w->text.XOffset; DrawIBeamCursor(w, x, w->text.eraseGC); /* Little hack to fix up the character that might have been affected by * erasing the old cursor. */ if (w->text.OldCursorPos < w->text.TextLen) DrawTextRange(w, w->text.OldCursorPos, w->text.OldCursorPos + 1); }}static voidClearHighlight(TextFieldWidget w){ if (!w->text.Echo) return; if (w->text.HighlightStart >= 0) { EraseCursor(w); DrawText(w, w->text.HighlightStart, w->text.HighlightEnd, False); DrawCursor(w); w->text.HighlightStart = w->text.HighlightEnd = -1; } w->text.OldHighlightStart = w->text.OldHighlightEnd = -1;}static voidDrawHighlight(TextFieldWidget w){ if (!w->text.Echo) return; if (w->text.OldHighlightStart < 0) { DrawText(w, w->text.HighlightStart, w->text.HighlightEnd, True); } else { DrawText(w, w->text.HighlightStart, w->text.OldHighlightStart, (w->text.HighlightStart < w->text.OldHighlightStart)); DrawText(w, w->text.HighlightEnd, w->text.OldHighlightEnd, (w->text.HighlightEnd > w->text.OldHighlightEnd)); } w->text.OldHighlightStart = w->text.HighlightStart; w->text.OldHighlightEnd = w->text.HighlightEnd;}/* * Special redraw function after a text insertion */static voidDrawInsert(TextFieldWidget w){ /* EraseCursor must be called before this */ DrawTextWithCopyArea(w); DrawCursor(w);}/* * Redraw the entire widget, but don't scroll the window much */static voidDraw(TextFieldWidget w){ EraseCursor(w); PositionCursor(w); DrawAllText(w); DrawCursor(w);}/* * Like Draw(), but has different rules about scrolling the window to * place the cursor in a good place */static voidMassiveChangeDraw(TextFieldWidget w){ EraseCursor(w); MassiveCursorAdjust(w); DrawAllText(w); DrawCursor(w);}/* * Motif-like TextField public functions * * Note that this set of functions is only a subset of the functions available * in the real Motif XmTextField. */BooleanTextFieldGetEditable(Widget aw){ TextFieldWidget w = (TextFieldWidget) aw; if (!XtIsTextField(aw)) return 0; return w->text.Editable;}intTextFieldGetInsertionPosition(Widget aw){ TextFieldWidget w = (TextFieldWidget) aw; if (!XtIsTextField(aw)) return 0; return w->text.CursorPos;}char *TextFieldGetString(Widget aw){ TextFieldWidget w = (TextFieldWidget) aw; char *ret; if (!XtIsTextField(aw)) { ret = XtMalloc(1); *ret = '\0'; return ret; } ret = XtMalloc(w->text.TextLen + 1); strncpy(ret, w->text.Text, w->text.TextLen); ret[w->text.TextLen] = '\0'; return ret;}voidTextFieldInsert(Widget aw, int pos, char *str){ TextFieldWidget w = (TextFieldWidget) aw; int len; if (!XtIsTextField(aw)) return; if (str && ((len = strlen(str)) > 0) && pos >= 0 && pos <= w->text.TextLen) { w->text.HighlightStart = w->text.HighlightEnd = pos; TextInsert(w, str, len); MassiveChangeDraw(w); }}voidTextFieldReplace(Widget aw, int first, int last, char *str){ TextFieldWidget w = (TextFieldWidget) aw; int len; if (!XtIsTextField(aw)) return; if (str) { len = strlen(str); if (last > w->text.TextLen) last = w->text.TextLen; if (first <= last) { w->text.HighlightStart = first; w->text.HighlightEnd = last; TextDeleteHighlighted(w); TextInsert(w, str, len); MassiveChangeDraw(w); } }}voidTextFieldSetEditable(Widget aw, Boolean editable){ TextFieldWidget w = (TextFieldWidget) aw; if (!XtIsTextField(aw)) return; w->text.Editable = editable;}voidTextFieldSetInsertionPosition(Widget aw, int pos){ TextFieldWidget w = (TextFieldWidget) aw; if (!XtIsTextField(aw)) return; if (pos >= 0 && pos <= w->text.TextLen) { w->text.CursorPos = pos; MassiveChangeDraw(w); }}/* ARGSUSED */voidTextFieldSetSelection(Widget aw, int start, int end, Time time){ TextFieldWidget w = (TextFieldWidget) aw; if (!XtIsTextField(aw)) return; if (end < start) { int temp; temp = start; start = end; end = temp; } if (start < 0) start = 0; if (end > w->text.TextLen) end = w->text.TextLen; w->text.HighlightStart = start; w->text.HighlightEnd = w->text.CursorPos = end; MassiveChangeDraw(w);}voidTextFieldSetString(Widget aw, char *str){ TextFieldWidget w = (TextFieldWidget) aw; int len; if (!XtIsTextField(aw)) return; if (str) { len = strlen(str); w->text.HighlightStart = 0; w->text.HighlightEnd = w->text.TextLen; TextDeleteHighlighted(w); TextInsert(w, str, len); MassiveChangeDraw(w); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -