Merge pull request #1962 from Zwelf/pr-add-paste

Added paste
This commit is contained in:
oy 2019-01-12 21:23:53 +01:00 committed by GitHub
commit bf76ab1f83
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 71 additions and 9 deletions

View file

@ -39,12 +39,18 @@ CInput::CInput()
m_InputCounter = 1;
m_InputGrabbed = 0;
m_pClipboardText = 0;
m_MouseDoubleClick = false;
m_NumEvents = 0;
}
CInput::~CInput()
{
free(m_pClipboardText);
}
void CInput::Init()
{
m_pGraphics = Kernel()->RequestInterface<IEngineGraphics>();
@ -103,6 +109,21 @@ int CInput::MouseDoubleClick()
return 0;
}
const char *CInput::GetClipboardText()
{
if(m_pClipboardText)
{
free(m_pClipboardText);
}
m_pClipboardText = SDL_GetClipboardText();
return m_pClipboardText;
}
void CInput::SetClipboardText(const char *pText)
{
SDL_SetClipboardText(pText);
}
void CInput::Clear()
{
mem_zero(m_aInputState, sizeof(m_aInputState));

View file

@ -9,6 +9,7 @@ class CInput : public IEngineInput
IConsole *m_pConsole;
int m_InputGrabbed;
char *m_pClipboardText;
bool m_MouseDoubleClick;
@ -28,6 +29,7 @@ class CInput : public IEngineInput
public:
CInput();
~CInput();
virtual void Init();
@ -38,6 +40,8 @@ public:
virtual void MouseModeAbsolute();
virtual void MouseModeRelative();
virtual int MouseDoubleClick();
virtual const char *GetClipboardText();
virtual void SetClipboardText(const char *pText);
virtual int Update();
};

View file

@ -63,6 +63,9 @@ public:
virtual void MouseModeRelative() = 0;
virtual void MouseModeAbsolute() = 0;
virtual int MouseDoubleClick() = 0;
virtual const char* GetClipboardText() = 0;
virtual void SetClipboardText(const char *Text) = 0;
virtual void MouseRelative(float *x, float *y) = 0;
};

View file

@ -37,7 +37,7 @@ void CLineInput::Set(const char *pString)
}
}
bool CLineInput::CtrlStop(char c)
bool CLineInput::MoveWordStop(char c)
{
// jump to spaces and special ASCII characters
return ((32 <= c && c <= 47) || // !"#$%&'()*+,-./
@ -55,7 +55,8 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
if(CursorPos > Len)
CursorPos = Len;
if(Event.m_Flags&IInput::FLAG_TEXT)
if(Event.m_Flags&IInput::FLAG_TEXT &&
!(KEY_LCTRL <= Event.m_Key && Event.m_Key <= KEY_RGUI))
{
// gather string stats
int CharCount = 0;
@ -89,13 +90,13 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
if(Event.m_Flags&IInput::FLAG_PRESS)
{
int Key = Event.m_Key;
bool Ctrl = false;
bool MoveWord = false;
#ifdef CONF_PLATFORM_MACOSX
if(pInput && (pInput->KeyIsPressed(KEY_LALT) || pInput->KeyIsPressed(KEY_RALT)))
#else
if(pInput && (pInput->KeyIsPressed(KEY_LCTRL) || pInput->KeyIsPressed(KEY_RCTRL)))
#endif
Ctrl = true;
MoveWord = true;
if(Key == KEY_BACKSPACE && CursorPos > 0)
{
int NewCursorPos = CursorPos;
@ -103,7 +104,7 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
{
NewCursorPos = str_utf8_rewind(pStr, NewCursorPos);
NumChars -= 1;
} while(Ctrl && NewCursorPos > 0 && !CtrlStop(pStr[NewCursorPos - 1]));
} while(MoveWord && NewCursorPos > 0 && !MoveWordStop(pStr[NewCursorPos - 1]));
int CharSize = CursorPos-NewCursorPos;
mem_move(pStr+NewCursorPos, pStr+CursorPos, Len - NewCursorPos - CharSize + 1); // +1 == null term
CursorPos = NewCursorPos;
@ -117,7 +118,7 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
{
EndCursorPos = str_utf8_forward(pStr, EndCursorPos);
NumChars -= 1;
} while(Ctrl && EndCursorPos < Len && !CtrlStop(pStr[EndCursorPos - 1]));
} while(MoveWord && EndCursorPos < Len && !MoveWordStop(pStr[EndCursorPos - 1]));
int CharSize = EndCursorPos - CursorPos;
mem_move(pStr + CursorPos, pStr + CursorPos + CharSize, Len - CursorPos - CharSize + 1); // +1 == null term
Len -= CharSize;
@ -128,19 +129,52 @@ bool CLineInput::Manipulate(IInput::CEvent Event, char *pStr, int StrMaxSize, in
do
{
CursorPos = str_utf8_rewind(pStr, CursorPos);
} while(Ctrl && CursorPos > 0 && !CtrlStop(pStr[CursorPos - 1]));
} while(MoveWord && CursorPos > 0 && !MoveWordStop(pStr[CursorPos - 1]));
}
else if(Key == KEY_RIGHT && CursorPos < Len)
{
do
{
CursorPos = str_utf8_forward(pStr, CursorPos);
} while(Ctrl && CursorPos < Len && !CtrlStop(pStr[CursorPos - 1]));
} while(MoveWord && CursorPos < Len && !MoveWordStop(pStr[CursorPos - 1]));
}
else if(Key == KEY_HOME)
CursorPos = 0;
else if(Key == KEY_END)
CursorPos = Len;
else if((pInput->KeyIsPressed(KEY_LCTRL) || pInput->KeyIsPressed(KEY_RCTRL)) && Key == KEY_V)
{
// paste clipboard to cursor
const char *pClipboardText = pInput->GetClipboardText();
// gather string stats
int CharCount = 0;
int CharSize = 0;
while(pClipboardText[CharSize])
{
int NewCharSize = str_utf8_forward(pClipboardText, 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] = pClipboardText[i];
CursorPos += CharSize;
Len += CharSize;
NumChars += CharCount;
Changes = true;
}
}
}
}
*pNumCharsPtr = NumChars;

View file

@ -19,7 +19,7 @@ class CLineInput
int m_NumChars;
IInput *m_pInput;
public:
static bool CtrlStop(char c);
static bool MoveWordStop(char c);
static bool Manipulate(IInput::CEvent e, char *pStr, int StrMaxSize, int StrMaxChars, int *pStrLenPtr, int *pCursorPosPtr, int *pNumCharsPtr, IInput *pInput);
class CCallback