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

📄 textfield.c

📁 NIST Net – A Linux-based Network Emulation Tool, It is a raw IP packet filter with many controllable
💻 C
📖 第 1 页 / 共 4 页
字号:
    changed = True ;  }  else if (w->text.CursorPos > 0) {    ClearHighlight(w);    TextDelete(w, w->text.CursorPos - 1, 1);    w->text.CursorPos--;    Draw(w);    changed = True ;  }  if( changed && w->text.valueChangedCallback )    textfieldCallbacks(w, w->text.valueChangedCallback,	TF_VALUE_CHANGED, event, w->text.Text);}/* ARGSUSED */static voidSelectStart(Widget aw, XEvent * event, String * params, Cardinal * num_params){  TextFieldWidget w = (TextFieldWidget) aw;  if (!w->text.AllowSelection)    return;  w->text.CursorPos = TextPixelToPos(w, event->xbutton.x);  w->text.HighlightPivotStart =    w->text.HighlightPivotEnd = w->text.CursorPos;  if (w->text.HighlightStart >= 0) {    ClearHighlight(w);  }  else {    EraseCursor(w);    DrawCursor(w);  }}/* ARGSUSED */static voidExtendStart(Widget aw, XEvent * event, String * params, Cardinal * num_params){  TextFieldWidget w = (TextFieldWidget) aw;  int pos;  if (!w->text.AllowSelection)    return;  pos = TextPixelToPos(w, event->xbutton.x);  EraseCursor(w);  if (w->text.HighlightStart < 0) {    w->text.HighlightStart =      w->text.HighlightEnd =      w->text.HighlightPivotStart =      w->text.HighlightPivotEnd = w->text.CursorPos;  }  else {    w->text.HighlightPivotStart = w->text.HighlightStart;    w->text.HighlightPivotEnd = w->text.HighlightEnd;  }  if (pos < w->text.HighlightStart) {    w->text.HighlightStart = pos;  }  else {    w->text.HighlightEnd = pos;  }  w->text.CursorPos = pos;#ifdef DEBUG_TF  printf("ExtendStart: %d - %d\n", w->text.HighlightStart,    w->text.HighlightEnd);#endif  DrawHighlight(w);  DrawCursor(w);}static voidExtendHighlight(TextFieldWidget w){  int x, pos;  if (!w->text.AllowSelection)    return;  x = w->text.timer_x;  pos = TextPixelToPos(w, x);  if (x < (int) w->text.Margin) {    pos = TextPixelToPos(w, (int) 0);    if (pos > 0)      pos--;    else if (pos == w->text.CursorPos)      return;  }  else if (x > (int) (w->text.Margin + w->text.ViewWidth)) {    pos = TextPixelToPos(w, (int) (w->text.Margin + w->text.ViewWidth));    if (pos < w->text.TextLen)      pos++;    else if (pos == w->text.CursorPos)      return;  }  if (pos == w->text.CursorPos)    return;  EraseCursor(w);  if (pos <= w->text.HighlightPivotStart) {    w->text.HighlightStart = pos;    w->text.HighlightEnd = w->text.HighlightPivotEnd;  }  else {    w->text.HighlightStart = w->text.HighlightPivotStart;    w->text.HighlightEnd = pos;  }  w->text.CursorPos = pos;#ifdef DEBUG_TF  printf("Highlighting: x=%d pos=%d  %d - %d\n", x, pos, w->text.HighlightStart,    w->text.HighlightEnd);#endif  if (PositionCursor(w))    DrawTextReposition(w);  DrawHighlight(w);  DrawCursor(w);}static voidExtendTimer(XtPointer client_data, XtIntervalId * idp){  TextFieldWidget w = (TextFieldWidget) client_data;  ExtendHighlight(w);  w->text.timer_id = XtAppAddTimeOut(    XtWidgetToApplicationContext((Widget) w),    (unsigned long) w->text.highlight_time,    ExtendTimer,    (XtPointer) w);}/* ARGSUSED */static voidExtendAdjust(Widget aw, XEvent * event, String * params, Cardinal * num_params){  TextFieldWidget w = (TextFieldWidget) aw;  if (!w->text.AllowSelection)    return;  w->text.timer_x = event->xbutton.x;  if (event->xbutton.x < w->text.Margin || event->xbutton.x > w->text.Margin + w->text.ViewWidth) {    if (w->text.timer_id)      ExtendHighlight(w);    else      ExtendTimer((XtPointer) w, (XtIntervalId) 0);  }  else {    if (w->text.timer_id) {      XtRemoveTimeOut(w->text.timer_id);      w->text.timer_id = (XtIntervalId) 0;    }    ExtendHighlight(w);  }}/* ARGSUSED */static BooleanConvertSelection(Widget aw, Atom * selection, Atom * target, Atom * type,  XtPointer * value, unsigned long *length, int *format){  TextFieldWidget w = (TextFieldWidget) aw;  XSelectionRequestEvent *req = XtGetSelectionRequest(aw, *selection, NULL);  if (*target == XA_TARGETS(XtDisplay(aw))) {    Atom *targetP, *std_targets;    unsigned long std_length;    XmuConvertStandardSelection(aw, req->time, selection,      target, type, (XPointer *) & std_targets,      &std_length, format);    *value = XtMalloc((unsigned) sizeof(Atom) * (std_length + 1));    targetP = *(Atom **) value;    *length = std_length + 1;    *targetP++ = XA_STRING;    memmove((char *) targetP, (char *) std_targets, sizeof(Atom) * std_length);    XtFree((char *) std_targets);    *type = XA_ATOM;    *format = sizeof(Atom) * 8;    return True;  }  else if (*target == XA_STRING) {    *length = (long) w->text.SelectionLen;    *value = w->text.SelectionText;    *type = XA_STRING;    *format = 8;    return True;  }  return False;}/* ARGSUSED */static voidLoseSelection(Widget aw, Atom * selection){  TextFieldWidget w = (TextFieldWidget) aw;  ClearHighlight(w);  if( *selection == XA_PRIMARY && w->text.losePrimaryCallback )  {    TextFieldReturnStruct ret;    ret.reason = TF_LOSE_PRIMARY ;    ret.event = NULL ;    ret.string = w->text.Text;    XtCallCallbackList(aw, w->text.losePrimaryCallback, &ret);  }}/* ARGSUSED */static voidExtendEnd(Widget aw, XEvent * event, String * params, Cardinal * num_params){  TextFieldWidget w = (TextFieldWidget) aw;  int len;  if (!w->text.AllowSelection)    return;  if (w->text.timer_id) {    XtRemoveTimeOut(w->text.timer_id);    w->text.timer_id = (XtIntervalId) 0;  }  len = w->text.HighlightEnd - w->text.HighlightStart;  if (len > 0) {    w->text.SelectionLen = len;    if (w->text.SelectionText)      XtFree(w->text.SelectionText);    w->text.SelectionText = XtMalloc(len);    strncpy(w->text.SelectionText, &w->text.Text[w->text.HighlightStart], len);    XtOwnSelection(aw, XA_PRIMARY, event->xbutton.time,      ConvertSelection, LoseSelection, NULL);    XChangeProperty(XtDisplay(aw), DefaultRootWindow(XtDisplay(aw)),      XA_CUT_BUFFER0, XA_STRING, 8, PropModeReplace,      (unsigned char *) w->text.SelectionText, len);    if( w->text.gainPrimaryCallback != NULL )    {      TextFieldReturnStruct ret;      ret.reason = TF_GAIN_PRIMARY ;      ret.event = event;      ret.string = w->text.Text;      XtCallCallbackList(aw, w->text.gainPrimaryCallback, &ret);    }  }}/* ARGSUSED */static voidRequestSelection(Widget aw, XtPointer client, Atom * selection, Atom * type,  XtPointer value, unsigned long *length, int *format){  TextFieldWidget w = (TextFieldWidget) aw;  if ((value == NULL) || (*length == 0)) {#ifdef DEBUG_TF    printf("RequestSelection: no selection\n");#endif  }  else {    int savex;    ClearHighlight(w);    savex = w->text.OldCursorX;    w->text.CursorPos = (int) client;#ifdef DEBUG_TF    printf("RequestSelection: inserting %s length=%d at pos: %d\n",      (char *) value, (int) (*length), w->text.CursorPos);#endif    TextInsert(w, (char *) value, (int) (*length));    w->text.OldCursorX = savex;    Draw(w);  }}/* ARGSUSED */static voidInsertSelection(Widget aw, XEvent * event, String * params, Cardinal * num_params){  TextFieldWidget w = (TextFieldWidget) aw;  int pos;  if (!w->text.AllowSelection)    return;  pos = TextPixelToPos(w, event->xbutton.x);#ifdef DEBUG_TF  printf("InsertSelection: event at pos: %d\n", pos);#endif  XtGetSelectionValue(aw, XA_PRIMARY, XA_STRING,    RequestSelection,    (XtPointer) pos, event->xbutton.time);}/* * TextField private drawing functions */static BooleanPositionCursor(TextFieldWidget w){  int x, start, end;  Boolean moved;  moved = False;  if (w->text.CursorPos < 0)    w->text.CursorPos = 0;  else if (w->text.CursorPos > w->text.TextLen)    w->text.CursorPos = w->text.TextLen;  x = FontTextWidth(w->text.font, w->text.Text, w->text.CursorPos);  start = -w->text.XOffset;  end = start + w->text.ViewWidth;  if (x < start) {    w->text.XOffset = -x;    moved = True;  }  else if (x > end) {    w->text.XOffset = w->text.ViewWidth - x;    moved = True;  }  return moved;}static BooleanMassiveCursorAdjust(TextFieldWidget w){  int start, end, last;  Boolean moved;  moved = False;  end = FontTextWidth(w->text.font, w->text.Text, w->text.CursorPos);  if (w->text.HighlightStart >= 0)    start = FontTextWidth(w->text.font, w->text.Text, w->text.HighlightStart);  else    start = end;  if (end < w->text.ViewWidth) {    if (w->text.XOffset < 0) {      w->text.XOffset = 0;      moved = True;    }  }  else if (start >= w->text.XOffset && end < w->text.XOffset + w->text.ViewWidth)    return moved;  else {    last = FontTextWidth(w->text.font, w->text.Text, w->text.TextLen);    if (start - end > w->text.ViewWidth) {      if (last - end > w->text.ViewWidth)	w->text.XOffset = w->text.ViewWidth - last;      else	w->text.XOffset = w->text.ViewWidth - end;    }    else if (end > w->text.ViewWidth)      w->text.XOffset = w->text.ViewWidth - end;    else      w->text.XOffset = 0;    moved = True;  }  return moved;}/* * Actually draw a range of text onto the widget */static voidDrawText(TextFieldWidget w, int start, int end, Boolean highlight){  int x;  GC gc;  Widget aw = (Widget) w;  if (!w->text.Echo)    return;  if (w->text.TextLen > 0) {    if (start < 0)      return;    else if (end < start) {      int temp;      temp = start;      start = end;      end = temp;    }    if (end <= w->text.TextLen) {      x = w->text.Margin + w->text.XOffset +	FontTextWidth(w->text.font, w->text.Text, start);      if (highlight)	gc = w->text.highlightGC;      else	gc = w->text.drawGC;      if (XtIsRealized(aw))        XDrawImageString(XtDisplay(w), XtWindow(w), gc,	  x, w->text.YOffset,	  &w->text.Text[start], end - start);    }  }}static voidDrawTextRange(TextFieldWidget w, int start, int end){  if (!w->text.Echo)    return;  if (w->text.TextLen > 0) {    if (start < 0)      return;    else if (end < start) {      int temp;      temp = start;      start = end;      end = temp;    }/* If there is no highlighting, or the refresh area doesn't cross the *//* the highlight borders, just redraw it. */    if (w->text.HighlightStart < 0 ||      start >= w->text.HighlightEnd ||      end <= w->text.HighlightStart) {      DrawText(w, start, end, False);    }/* OK, the refresh area crosses one or both highlight borders. */    else {      int clip;      while (start < end) {	if (start < w->text.HighlightStart) {	  if (end <= w->text.HighlightStart)	    clip = end;	  else	    clip = w->text.HighlightStart;	  DrawText(w, start, clip, False);	  start = clip;	}	else if (start < w->text.HighlightEnd) {

⌨️ 快捷键说明

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