static int motTextSetSelectionPosAttrib(Ihandle* ih, const char* value) { int start=0, end=0; if (!value || iupStrEqualNoCase(value, "NONE")) { XmTextClearSelection(ih->handle, CurrentTime); return 0; } if (iupStrEqualNoCase(value, "ALL")) { XmTextSetSelection(ih->handle, (XmTextPosition)0, (XmTextPosition)XmTextGetLastPosition(ih->handle), CurrentTime); return 0; } if (iupStrToIntInt(value, &start, &end, ':')!=2) return 0; if(start<0 || end<0) return 0; /* end is inside the selection, in IUP is outside */ end--; XmTextSetSelection(ih->handle, (XmTextPosition)start, (XmTextPosition)end, CurrentTime); return 0; }
static void templates_cb( Widget w, XtPointer cbd, XtPointer cbs) { TemplateCallbackData *cbdata = cbd; XmTextPosition start, end, after; if(!text_w) { char m[80]; sprintf(m, "unexpected argument %p", cbdata); msg("template handler", m); return; } if(get_map_state(text_w) != IsViewable) { beep(); return; } if( XmTextGetSelectionPosition(text_w, &start, &end) && start < end) { XmTextReplace(text_w, start, end, *cbdata); XmTextClearSelection(text_w, CurrentTime); } else { start = XmTextGetInsertionPosition(text_w); XmTextInsert(text_w, start, *cbdata); } after = start + strlen (*cbdata); XmTextSetInsertionPosition(text_w, after); XmTextShowPosition(text_w, after); set_input_focus(text_w); }
void RXmTextClearSelection(message_t message) { Widget w; Time t; toolkit_read_value(message,&w,XtRWidget); t = XtLastTimestampProcessed(display); XmTextClearSelection(w,t); }
static void Yank(Widget w, XEvent *ev, char **str, Cardinal *num) { /* copy current selection at current cursor position */ if (listener_selection) { XmTextPosition curpos; curpos = XmTextGetCursorPosition(w); XmTextInsert(w, curpos, listener_selection); curpos += strlen(listener_selection); XmTextShowPosition(w, curpos); XmTextSetCursorPosition(w, curpos); XmTextClearSelection(w, ev->xkey.time); /* so C-y + edit doesn't forbid the edit */ } }
static int motTextSetSelectionAttrib(Ihandle* ih, const char* value) { int start=1, end=1; if (!value || iupStrEqualNoCase(value, "NONE")) { XmTextClearSelection(ih->handle, CurrentTime); return 0; } if (iupStrEqualNoCase(value, "ALL")) { XmTextSetSelection(ih->handle, (XmTextPosition)0, (XmTextPosition)XmTextGetLastPosition(ih->handle), CurrentTime); return 0; } if (ih->data->is_multiline) { int lin_start=1, col_start=1, lin_end=1, col_end=1; char *str; if (sscanf(value, "%d,%d:%d,%d", &lin_start, &col_start, &lin_end, &col_end)!=4) return 0; if (lin_start<1 || col_start<1 || lin_end<1 || col_end<1) return 0; str = XmTextGetString(ih->handle); start = motTextSetLinColToPosition(str, lin_start, col_start); end = motTextSetLinColToPosition(str, lin_end, col_end); XtFree(str); } else { if (iupStrToIntInt(value, &start, &end, ':')!=2) return 0; if(start<1 || end<1) return 0; start--; /* IUP starts at 1 */ end--; } /* end is inside the selection, in IUP is outside */ end--; XmTextSetSelection(ih->handle, (XmTextPosition)start, (XmTextPosition)end, CurrentTime); return 0; }
static void B1_press(Widget w, XEvent *event, char **str, Cardinal *num) { XmTextPosition pos; XButtonEvent *ev = (XButtonEvent *)event; XmProcessTraversal(w, XmTRAVERSE_CURRENT); /* we're replacing the built-in take_focus action here, so do it by hand, but leave listener blue, so to speak */ if (w != listener_text) XtVaSetValues(w, XmNbackground, ss->sgx->white, NULL); else XmTextClearSelection(listener_text, CurrentTime); /* should this happen in other windows as well? */ pos = XmTextXYToPos(w, (Position)(ev->x), (Position)(ev->y)); XmTextSetCursorPosition(w, pos); down_pos = pos; last_pos = pos; if (XEN_HOOKED(listener_click_hook)) run_hook(listener_click_hook, XEN_LIST_1(C_TO_XEN_INT((int)pos)), S_listener_click_hook); }
// // Input from motif text-widget with recall // Returns 1 if return i pressed, else 0. // int mrm_TextInput( Widget w, XEvent *event, char *recall, int line_size, int recall_size, int *current_recall_line) { KeySym keysym; Modifiers mod; int pos; char *text; char newtext[160]; int i; XmTextPosition left, right; char *s, *t; text = XmTextGetString( w); XtTranslateKeycode( flow_Display(w), event->xkey.keycode, event->xkey.state, &mod, &keysym); keysym &= 0xFFFF; switch ( keysym) { case XK_Return: case XK_Linefeed: // Insert in recall buffer if ( strcmp( text, "") != 0) { for ( i = recall_size - 2; i >= 0; i--) strcpy( recall + (i+1) * line_size, recall + i * line_size); strncpy( recall, text, line_size); recall[line_size-1] = 0; } *current_recall_line = 0; return 1; case XK_Up: (*current_recall_line)++; if ( *current_recall_line > recall_size - 1) *current_recall_line = recall_size - 1; XmTextSetString( w, recall + (*current_recall_line - 1) * line_size); XmTextSetCursorPosition( w, strlen(recall + (*current_recall_line - 1) * line_size)); break; case XK_Down: if ( *current_recall_line == 0) XmTextSetString( w, ""); else if ( *current_recall_line == 1) { XmTextSetString( w, ""); (*current_recall_line)--; } else { (*current_recall_line)--; XmTextSetString( w, recall + (*current_recall_line - 1) * line_size); XmTextSetCursorPosition( w, strlen(recall + (*current_recall_line - 1) * line_size)); } break; case XK_Left: XmTextClearSelection( w, CurrentTime); pos = XmTextGetCursorPosition( w); if ( pos == 0) break; pos--; XmTextSetCursorPosition( w, pos); break; case XK_Right: XmTextClearSelection( w, CurrentTime); pos = XmTextGetCursorPosition( w); if ( pos >= line_size - 1) break; pos++; if ( pos > strlen(text)) break; XmTextSetCursorPosition( w, pos); break; case XK_BackSpace: case 65535: if ( XmTextGetSelectionPosition( w, &left, &right)) { for ( s = text + left, t = text + right; *t; s++,t++) *s = *t; *s = 0; XmTextSetString( w, text); XmTextSetCursorPosition( w, left); } else { pos = XmTextGetCursorPosition( w); if ( pos == 0) break; if ( pos == 1) strcpy( newtext, ""); else strncpy( newtext, text, pos-1); newtext[pos-1] = 0; strncat( newtext, &text[pos], sizeof( newtext)); XmTextSetString( w, newtext); XmTextSetCursorPosition( w, pos-1); } break; default: if ( event->xkey.state & ControlMask) return 0; if ( keysym > 256) return 0; if ( XmTextGetSelectionPosition( w, &left, &right)) { for ( s = text + left, t = text + right; *t; s++,t++) *s = *t; *s = 0; XmTextSetCursorPosition( w, left); } pos = XmTextGetCursorPosition( w); if ( pos >= line_size - 1) break; if ( pos == 0) strcpy( newtext, ""); else strncpy( newtext, text, pos); newtext[pos] = keysym; newtext[pos+1] = 0; strncat( newtext, &text[pos], sizeof( newtext)); XmTextSetString( w, newtext); XmTextSetCursorPosition( w, pos+1); } return 0; }