void SelectMoveX (Widget w, XEvent * event, String * params, Cardinal * nParams) { XawTextPosition index, dummy; XawTextGetSelectionPos(w, &index, &dummy); FindMoveByCharIndex( index ); // [HGM] also does the actual moving to it, now }
void SelectPV (Widget w, XEvent * event, String * params, Cardinal * nParams) { // [HGM] pv: translate click to PV line, and load it for display String val; int start, end; XawTextPosition index, dummy; int x, y; Arg arg; x = event->xmotion.x; y = event->xmotion.y; currentPV = (w == outputField[1][nMemo]); XawTextGetSelectionPos(w, &index, &dummy); XtSetArg(arg, XtNstring, &val); XtGetValues(w, &arg, 1); if(LoadMultiPV(x, y, val, index, &start, &end)) { XawTextSetSelection( outputField[currentPV][nMemo], start, end ); highTextStart[currentPV] = start; highTextEnd[currentPV] = end; } }
/******************************************************************************* Name: CompletionEditCallback Description: Called when Completion is selected form File menu in the editor. Arguments: w - menu item that was selected client_data - dialog window or edit window call_data - not used Returns: None *******************************************************************************/ void CompletionEditCallback( Widget w, XtPointer client_data, XtPointer call_data) { int NumberOfMatches,i,length; Boolean tempFlag; struct symbolMatch *matches; extern char* GetCommandString(); XawTextBlock text; char *matchString = NULL; Widget source = XawTextGetSource((Widget)client_data); XawTextPosition CurrentPosition,EndPosition; /* ================================================== */ /* Free the memory of completionString before assign */ /* it to the new string. */ /* ================================================== */ if(completionString != NULL) { free(completionString); completionString = NULL; } /* =================================================== */ /* Get the beginning and ending positions of the */ /* selection. If there is no selection get the last */ /* word from the cursor. */ /* ====================================================*/ XawTextGetSelectionPos((Widget)client_data,&CurrentPosition,&EndPosition); if(CurrentPosition == EndPosition) /* No selection was made */ { matchString = GetBufferFromTextEdit((Widget)client_data); length = strlen(matchString); } else { XawTextSourceRead(source,CurrentPosition,&text,EndPosition - CurrentPosition); XawTextUnsetSelection((Widget)client_data); XawTextSetInsertionPoint((Widget)client_data,EndPosition); matchString = text.ptr; length = text.length; } /* ======================================= */ /* Determine if the word can be matched. */ /* ======================================= */ matchString = GetCommandCompletionString(matchString,length); if(matchString == NULL) { XBell(XtDisplay(toplevel),100); return; } completionString = (char*)malloc(strlen(matchString) + 1); strcpy(completionString,matchString); matches = FindSymbolMatches(completionString,&NumberOfMatches,NULL); if(NumberOfMatches == 0) { XBell(XtDisplay(toplevel),100); return; } else if (NumberOfMatches == 1) { length = strlen(completionString); text.firstPos = 0; text.length = strlen(&(matches->match->contents[length])); text.ptr = &(matches->match->contents[length]); XawTextReplace((Widget)client_data, XawTextGetInsertionPoint((Widget)client_data), XawTextGetInsertionPoint((Widget)client_data),&text); XawTextSetInsertionPoint((Widget)client_data, XawTextGetInsertionPoint((Widget)client_data) + text.length); } else { DisplayMatchedList((Widget)client_data,matches); } }
int GTgetwidgetattr (Gwidget_t *widget, int attrn, Gwattr_t *attrp) { Dimension width, height; XawTextEditType mode; XawTextBlock tb; Widget w; int rtn, ai; long fi, li; for (ai = 0; ai < attrn; ai++) { RESETARGS; switch (attrp[ai].id) { case G_ATTRSIZE: ADD2ARGS (XtNwidth, &width); ADD2ARGS (XtNheight, &height); XtGetValues (widget->w, argp, argn); attrp[ai].u.s.x = width, attrp[ai].u.s.y = height; break; case G_ATTRBORDERWIDTH: ADD2ARGS (XtNborderWidth, &width); XtGetValues (widget->w, argp, argn); attrp[ai].u.i = width; break; case G_ATTRTEXT: w = XawTextGetSource (widget->w); tb.firstPos = 0, tb.ptr = NULL, tb.format = FMT8BIT, tb.length = 0; rtn = XawTextSourceRead (w, 0, &tb, 30000); if (rtn > Gbufn + 1) { Gbufp = Marraygrow (Gbufp, (long) (rtn + 1) * BUFSIZE); Gbufn = rtn + 1; } for (Gbufi = 0; Gbufi < rtn; Gbufi++) Gbufp[Gbufi] = tb.ptr[Gbufi]; Gbufp[Gbufi++] = '\000'; attrp[ai].u.t = &Gbufp[0]; break; case G_ATTRAPPENDTEXT: Gerr (POS, G_ERRCANNOTGETATTR, "appendtext"); return -1; case G_ATTRSELECTION: w = XawTextGetSource (widget->w); XawTextGetSelectionPos (widget->w, &fi, &li); tb.firstPos = 0, tb.ptr = NULL, tb.format = FMT8BIT, tb.length = 0; rtn = XawTextSourceRead (w, fi, &tb, li - fi); if (li - fi > Gbufn + 1) { Gbufp = Marraygrow (Gbufp, (long) (rtn + 1) * BUFSIZE); Gbufn = rtn + 1; } for (Gbufi = 0; Gbufi < li - fi; Gbufi++) Gbufp[Gbufi] = tb.ptr[Gbufi]; Gbufp[Gbufi++] = '\000'; attrp[ai].u.t = &Gbufp[0]; break; case G_ATTRMODE: ADD2ARGS (XtNeditType, &mode); XtGetValues (widget->w, argp, argn); if (mode == XawtextAppend) attrp[ai].u.t = "oneline"; else if (mode == XawtextEdit) attrp[ai].u.t = "input"; else if (mode == XawtextRead) attrp[ai].u.t = "output"; else { panic (POS, "GTgetwidgetattr", "unexpected text mode"); return -1; } break; case G_ATTRWINDOWID: sprintf (&Gbufp[0], "0x%lx", XtWindow (widget->w)); attrp[ai].u.t = &Gbufp[0]; break; case G_ATTRNEWLINECB: attrp[ai].u.func = WTU->func; break; case G_ATTRUSERDATA: attrp[ai].u.u = widget->udata; break; default: Gerr (POS, G_ERRBADATTRID, attrp[ai].id); return -1; } } return 0; }
/* * The following procedure manages the "insert" cursor */ static void InsertCursor(Widget w, int x, int y, XawTextInsertState state) { MultiSinkObject sink = (MultiSinkObject)w; XFontSet fontset = sink->multi_sink.fontset; Widget ctx = XtParent(w); XawTextPosition position = XawTextGetInsertionPoint(ctx); if (XtIsRealized(ctx)) { int fheight, fdiff; XawTextBlock block; wchar_t c; XawTextPosition selection_start, selection_end; Boolean has_selection; XFontSetExtents *ext = XExtentsOfFontSet(fontset); XawTextGetSelectionPos((Widget)ctx, &selection_start, &selection_end); has_selection = selection_start != selection_end; fheight = ext->max_logical_extent.height; fdiff = fheight - abs(ext->max_logical_extent.y); if ((sink->multi_sink.cursor_position != position || state == XawisOff) && !has_selection && sink->multi_sink.laststate != XawisOff) { wchar_t *ochar; (void)XawTextSourceRead(XawTextGetSource(ctx), sink->multi_sink.cursor_position, &block, 1); if (!block.length) ochar = NULL; else { c = ((wchar_t *)block.ptr)[0]; if (c == _Xaw_atowc(XawLF)) ochar = NULL; else if (c == _Xaw_atowc(XawTAB)) ochar = wspace; else ochar = (wchar_t *)block.ptr; } if (!ochar) _XawTextSinkClearToBackground(w, sink->multi_sink.cursor_x, (sink->multi_sink.cursor_y - 1 - fheight), CharWidth(sink, fontset, 0, wspace[0]), fheight); else { if (XwcTextEscapement(sink->multi_sink.fontset, ochar, 1) != 0) DisplayText(w, sink->multi_sink.cursor_x, sink->multi_sink.cursor_y - 1 - fheight, sink->multi_sink.cursor_position, sink->multi_sink.cursor_position + 1, False); else PaintText(w, sink->multi_sink.normgc, sink->multi_sink.cursor_x, sink->multi_sink.cursor_y - 1 - fdiff, ochar, 1, ctx->core.background_pixmap != XtUnspecifiedPixmap); } } if (!has_selection && state != XawisOff) { wchar_t *nchar; Boolean focus = ((TextWidget)ctx)->text.hasfocus; (void)XawTextSourceRead(XawTextGetSource(ctx), position, &block, 1); c = ((wchar_t *)block.ptr)[0]; if (!block.length || c == _Xaw_atowc(XawLF) || c == _Xaw_atowc(XawTAB)) nchar = wspace; else nchar = (wchar_t *)block.ptr; if (focus) { if (XwcTextEscapement(sink->multi_sink.fontset, nchar, 1) != 0) XwcDrawImageString(XtDisplay(ctx), XtWindow(ctx), fontset, sink->multi_sink.invgc, x, (y - 1 - fdiff), nchar, 1); else DisplayText(w, x, y - 1 - fheight, position, position + 1, True); } else XDrawRectangle(XtDisplay(ctx), XtWindow(ctx), sink->multi_sink.xorgc ? sink->multi_sink.xorgc : sink->multi_sink.normgc, x, y - 1 - fheight, CharWidth(sink, fontset, 0, *nchar) - 1, fheight - 1); } } sink->multi_sink.cursor_x = x; sink->multi_sink.cursor_y = y; sink->multi_sink.laststate = state; sink->multi_sink.cursor_position = position; }