mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-19 14:38:18 +00:00
commit
bf76ab1f83
|
@ -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));
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue