bool CLineInput::Manipulate(IInput::CEvent e, char *pStr, int StrMaxSize, int *pStrLenPtr, int *pCursorPosPtr) { int CursorPos = *pCursorPosPtr; int Len = *pStrLenPtr; bool Changes = false; if(CursorPos > Len) CursorPos = Len; int Code = e.m_Unicode; int k = e.m_Key; // 127 is produced on Mac OS X and corresponds to the delete key if (!(Code >= 0 && Code < 32) && Code != 127) { char Tmp[8]; int CharSize = str_utf8_encode(Tmp, Code); if (Len < StrMaxSize - CharSize && CursorPos < StrMaxSize - CharSize) { mem_move(pStr + CursorPos + CharSize, pStr + CursorPos, Len-CursorPos+1); // +1 == null term for(int i = 0; i < CharSize; i++) pStr[CursorPos+i] = Tmp[i]; CursorPos += CharSize; Len += CharSize; Changes = true; } } if(e.m_Flags&IInput::FLAG_PRESS) { // backspace, ctrl+backspace, ctrl+w if ((k == KEY_BACKSPACE || (k == KEY_w && e.GetKeyMods()&(KEYMOD_LCTRL|KEYMOD_RCTRL))) && CursorPos > 0) { int NewCursorPos; if(e.GetKeyMods()&(KEYMOD_LCTRL|KEYMOD_RCTRL)) NewCursorPos = str_skip_word_backward(pStr, CursorPos); else NewCursorPos = str_utf8_rewind(pStr, CursorPos); int CharSize = CursorPos-NewCursorPos; mem_move(pStr+NewCursorPos, pStr+CursorPos, Len - NewCursorPos - CharSize + 1); // +1 == null term CursorPos = NewCursorPos; Len -= CharSize; Changes = true; } // ctrl+u else if(k == KEY_u && e.GetKeyMods()&(KEYMOD_LCTRL|KEYMOD_RCTRL)) { mem_move(pStr, pStr+CursorPos, Len - CursorPos + 1); // +1 == null term Len -= CursorPos; CursorPos = 0; Changes = true; } else if (k == KEY_DELETE && CursorPos < Len) { int p = str_utf8_forward(pStr, CursorPos); int CharSize = p-CursorPos; mem_move(pStr + CursorPos, pStr + CursorPos + CharSize, Len - CursorPos - CharSize + 1); // +1 == null term Len -= CharSize; Changes = true; } else if (k == KEY_LEFT && CursorPos > 0) { if(e.GetKeyMods()&(KEYMOD_LCTRL|KEYMOD_RCTRL)) CursorPos = str_skip_word_backward(pStr, CursorPos); else CursorPos = str_utf8_rewind(pStr, CursorPos); } else if (k == KEY_RIGHT && CursorPos < Len) { if(e.GetKeyMods()&(KEYMOD_LCTRL|KEYMOD_RCTRL)) CursorPos = str_skip_word_forward(pStr, CursorPos); else CursorPos = str_utf8_forward(pStr, CursorPos); } else if (k == KEY_HOME) CursorPos = 0; else if (k == KEY_END) CursorPos = Len; // ctrl+v -- paste else if(k == KEY_v && e.GetKeyMods()&(KEYMOD_LCTRL|KEYMOD_RCTRL)) { char aBuf[MAX_SIZE]; str_copy(aBuf, pStr + CursorPos, sizeof(aBuf)); int size = get_clipboard_data(pStr + CursorPos, MAX_SIZE - CursorPos); if(size >= 0 && size < MAX_SIZE - CursorPos) // success { CursorPos += size; Len += size; str_copy(pStr + CursorPos, aBuf, MAX_SIZE - CursorPos); } Changes = true; } } *pCursorPosPtr = CursorPos; *pStrLenPtr = Len; return Changes; }
bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, int StrMaxChars, int *pStrLenPtr, int *pCursorPosPtr, int *pNumCharsPtr) { int NumChars = *pNumCharsPtr; int CursorPos = *pCursorPosPtr; int Len = *pStrLenPtr; bool Changes = false; if(CursorPos > Len) CursorPos = Len; if(Event.m_Flags&IInput::FLAG_TEXT) { // gather string stats int CharCount = 0; int CharSize = 0; while(Event.m_aText[CharSize]) { int NewCharSize = str_utf8_forward(Event.m_aText, CharSize); if(NewCharSize != CharSize) { ++CharCount; CharSize = NewCharSize; } } // add new string if(CharCount) { if(Len+CharSize < StrMaxSize && CursorPos+CharSize < StrMaxSize && NumChars+CharCount < StrMaxChars) { mem_move(pStr + CursorPos + CharSize, pStr + CursorPos, Len-CursorPos+1); // +1 == null term for(int i = 0; i < CharSize; i++) pStr[CursorPos+i] = Event.m_aText[i]; CursorPos += CharSize; Len += CharSize; NumChars += CharCount; Changes = true; } } } if(Event.m_Flags&IInput::FLAG_PRESS) { int Key = Event.m_Key; if(Key == KEY_BACKSPACE && CursorPos > 0) { int NewCursorPos = str_utf8_rewind(pStr, CursorPos); int CharSize = CursorPos-NewCursorPos; mem_move(pStr+NewCursorPos, pStr+CursorPos, Len - NewCursorPos - CharSize + 1); // +1 == null term CursorPos = NewCursorPos; Len -= CharSize; if(CharSize > 0) --NumChars; Changes = true; } else if(Key == KEY_DELETE && CursorPos < Len) { int p = str_utf8_forward(pStr, CursorPos); int CharSize = p-CursorPos; mem_move(pStr + CursorPos, pStr + CursorPos + CharSize, Len - CursorPos - CharSize + 1); // +1 == null term Len -= CharSize; if(CharSize > 0) --NumChars; Changes = true; } else if(Key == KEY_LEFT && CursorPos > 0) CursorPos = str_utf8_rewind(pStr, CursorPos); else if(Key == KEY_RIGHT && CursorPos < Len) CursorPos = str_utf8_forward(pStr, CursorPos); else if(Key == KEY_HOME) CursorPos = 0; else if(Key == KEY_END) CursorPos = Len; } *pNumCharsPtr = NumChars; *pCursorPosPtr = CursorPos; *pStrLenPtr = Len; return Changes; }
bool CLineInput::Manipulate(IInput::CEvent e, char *pStr, int StrMaxSize, int *pStrLenPtr, int *pCursorPosPtr) { int CursorPos = *pCursorPosPtr; int Len = *pStrLenPtr; bool Changes = false; if(CursorPos > Len) CursorPos = Len; int Code = e.m_Unicode; int k = e.m_Key; // 127 is produced on Mac OS X and corresponds to the delete key if (!(Code >= 0 && Code < 32) && Code != 127) { char Tmp[8]; int CharSize = str_utf8_encode(Tmp, Code); if (Len < StrMaxSize - CharSize && CursorPos < StrMaxSize - CharSize) { mem_move(pStr + CursorPos + CharSize, pStr + CursorPos, Len - CursorPos + CharSize); for(int i = 0; i < CharSize; i++) pStr[CursorPos+i] = Tmp[i]; CursorPos += CharSize; Len += CharSize; Changes = true; } } if(e.m_Flags&IInput::FLAG_PRESS) { if (k == KEY_BACKSPACE && CursorPos > 0) { int NewCursorPos = str_utf8_rewind(pStr, CursorPos); int CharSize = CursorPos-NewCursorPos; mem_move(pStr+NewCursorPos, pStr+CursorPos, Len - NewCursorPos - CharSize + 1); // +1 == null term CursorPos = NewCursorPos; Len -= CharSize; Changes = true; } else if (k == KEY_DELETE && CursorPos < Len) { int p = str_utf8_forward(pStr, CursorPos); int CharSize = p-CursorPos; mem_move(pStr + CursorPos, pStr + CursorPos + CharSize, Len - CursorPos - CharSize + 1); // +1 == null term Len -= CharSize; Changes = true; } else if (k == KEY_LEFT && CursorPos > 0) CursorPos = str_utf8_rewind(pStr, CursorPos); else if (k == KEY_RIGHT && CursorPos < Len) CursorPos = str_utf8_forward(pStr, CursorPos); else if (k == KEY_HOME) CursorPos = 0; else if (k == KEY_END) CursorPos = Len; } *pCursorPosPtr = CursorPos; *pStrLenPtr = Len; return Changes; }