Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
I
Irrlicht New
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
Irrlicht New
Commits
0cea1bc5
Commit
0cea1bc5
authored
Nov 26, 2021
by
mercury233
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wide char clipboard & IME support
parent
22f631c5
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
95 additions
and
27 deletions
+95
-27
include/IOSOperator.h
include/IOSOperator.h
+2
-2
include/irrTypes.h
include/irrTypes.h
+3
-0
source/Irrlicht/CGUIEditBox.cpp
source/Irrlicht/CGUIEditBox.cpp
+4
-10
source/Irrlicht/CIrrDeviceWin32.cpp
source/Irrlicht/CIrrDeviceWin32.cpp
+73
-2
source/Irrlicht/COSOperator.cpp
source/Irrlicht/COSOperator.cpp
+11
-11
source/Irrlicht/COSOperator.h
source/Irrlicht/COSOperator.h
+2
-2
No files found.
include/IOSOperator.h
View file @
0cea1bc5
...
...
@@ -26,11 +26,11 @@ public:
}
//! Copies text to the clipboard
virtual
void
copyToClipboard
(
const
c
8
*
text
)
const
=
0
;
virtual
void
copyToClipboard
(
const
c
16
*
text
)
const
=
0
;
//! Get text from the clipboard
/** \return Returns 0 if no string is in there. */
virtual
const
c
8
*
getTextFromClipboard
()
const
=
0
;
virtual
const
c
16
*
getTextFromClipboard
()
const
=
0
;
//! Get the processor speed in megahertz
/** \param MHz The integer variable to store the speed in.
...
...
include/irrTypes.h
View file @
0cea1bc5
...
...
@@ -48,6 +48,9 @@ typedef __int16 s16;
typedef
signed
short
s16
;
#endif
//! 16 bit character variable.
/** This is a typedef for wchar_t, it ensures portability of the engine. */
typedef
wchar_t
c16
;
//! 32 bit unsigned variable.
...
...
source/Irrlicht/CGUIEditBox.cpp
View file @
0cea1bc5
...
...
@@ -287,7 +287,7 @@ bool CGUIEditBox::processKey(const SEvent& event)
const
s32
realmbgn
=
MarkBegin
<
MarkEnd
?
MarkBegin
:
MarkEnd
;
const
s32
realmend
=
MarkBegin
<
MarkEnd
?
MarkEnd
:
MarkBegin
;
core
::
string
c
s
;
core
::
string
w
s
;
s
=
Text
.
subString
(
realmbgn
,
realmend
-
realmbgn
).
c_str
();
Operator
->
copyToClipboard
(
s
.
c_str
());
}
...
...
@@ -300,7 +300,7 @@ bool CGUIEditBox::processKey(const SEvent& event)
const
s32
realmend
=
MarkBegin
<
MarkEnd
?
MarkEnd
:
MarkBegin
;
// copy
core
::
string
c
sc
;
core
::
string
w
sc
;
sc
=
Text
.
subString
(
realmbgn
,
realmend
-
realmbgn
).
c_str
();
Operator
->
copyToClipboard
(
sc
.
c_str
());
...
...
@@ -330,16 +330,10 @@ bool CGUIEditBox::processKey(const SEvent& event)
const
s32
realmend
=
MarkBegin
<
MarkEnd
?
MarkEnd
:
MarkBegin
;
// add new character
const
c
8
*
p
=
Operator
->
getTextFromClipboard
();
const
c
16
*
p
=
Operator
->
getTextFromClipboard
();
if
(
p
)
{
// TODO: we should have such a function in core::string
size_t
lenOld
=
strlen
(
p
);
wchar_t
*
ws
=
new
wchar_t
[
lenOld
+
1
];
size_t
len
=
mbstowcs
(
ws
,
p
,
lenOld
);
ws
[
len
]
=
0
;
irr
::
core
::
stringw
widep
(
ws
);
delete
[]
ws
;
irr
::
core
::
stringw
widep
(
p
);
if
(
MarkBegin
==
MarkEnd
)
{
...
...
source/Irrlicht/CIrrDeviceWin32.cpp
View file @
0cea1bc5
...
...
@@ -20,6 +20,8 @@
#include "COSOperator.h"
#include "dimension2d.h"
#include "IGUISpriteBank.h"
#include "IGUIEnvironment.h"
#include "IGUIElement.h"
#include <winuser.h>
#if defined(_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)
#ifdef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_
...
...
@@ -749,6 +751,24 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
return
0
;
}
dev
=
getDeviceFromHWnd
(
hWnd
);
if
(
dev
)
{
irr
::
gui
::
IGUIElement
*
ele
=
dev
->
getGUIEnvironment
()
->
getFocus
();
if
(
!
ele
||
(
ele
->
getType
()
!=
irr
::
gui
::
EGUIET_EDIT_BOX
)
||
!
ele
->
isEnabled
())
{
HIMC
hIMC
=
ImmGetContext
(
hWnd
);
if
(
hIMC
)
{
ImmNotifyIME
(
hIMC
,
NI_COMPOSITIONSTR
,
CPS_COMPLETE
,
0
);
ImmReleaseContext
(
hWnd
,
hIMC
);
}
ImmAssociateContextEx
(
hWnd
,
NULL
,
0
);
}
else
ImmAssociateContextEx
(
hWnd
,
NULL
,
IACE_DEFAULT
);
}
switch
(
message
)
{
case
WM_PAINT
:
...
...
@@ -773,7 +793,11 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
event
.
KeyInput
.
Key
=
(
irr
::
EKEY_CODE
)
wParam
;
event
.
KeyInput
.
PressedDown
=
(
message
==
WM_KEYDOWN
||
message
==
WM_SYSKEYDOWN
);
#ifdef MAPVK_VSC_TO_VK_EX
const
UINT
MY_MAPVK_VSC_TO_VK_EX
=
MAPVK_VSC_TO_VK_EX
;
#else
const
UINT
MY_MAPVK_VSC_TO_VK_EX
=
3
;
// MAPVK_VSC_TO_VK_EX should be in SDK according to MSDN, but isn't in mine.
#endif
if
(
event
.
KeyInput
.
Key
==
irr
::
KEY_SHIFT
)
{
// this will fail on systems before windows NT/2000/XP, not sure _what_ will return there instead.
...
...
@@ -904,6 +928,53 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
KEYBOARD_INPUT_HKL
=
GetKeyboardLayout
(
0
);
KEYBOARD_INPUT_CODEPAGE
=
LocaleIdToCodepage
(
LOWORD
(
KEYBOARD_INPUT_HKL
)
);
return
0
;
case
WM_IME_STARTCOMPOSITION
:
{
dev
=
getDeviceFromHWnd
(
hWnd
);
irr
::
gui
::
IGUIElement
*
ele
=
dev
->
getGUIEnvironment
()
->
getFocus
();
if
(
!
ele
)
break
;
irr
::
core
::
position2di
pos
=
ele
->
getAbsolutePosition
().
UpperLeftCorner
;
COMPOSITIONFORM
CompForm
=
{
CFS_POINT
,
{
pos
.
X
,
pos
.
Y
+
ele
->
getAbsolutePosition
().
getHeight
()
}
};
HIMC
hIMC
=
ImmGetContext
(
hWnd
);
ImmSetCompositionWindow
(
hIMC
,
&
CompForm
);
ImmReleaseContext
(
hWnd
,
hIMC
);
}
break
;
case
WM_IME_CHAR
:
event
.
EventType
=
irr
::
EET_KEY_INPUT_EVENT
;
event
.
KeyInput
.
PressedDown
=
true
;
#ifdef _UNICODE
event
.
KeyInput
.
Char
=
wParam
;
#else
BYTE
ch
[
3
];
if
(
wParam
>>
8
)
{
ch
[
0
]
=
wParam
>>
8
;
ch
[
1
]
=
wParam
&
0xff
;
ch
[
2
]
=
0
;
}
else
{
ch
[
0
]
=
wParam
;
ch
[
1
]
=
0
;
}
WORD
unicodeChar
;
MultiByteToWideChar
(
KEYBOARD_INPUT_CODEPAGE
,
MB_PRECOMPOSED
,
// default
(
LPCSTR
)
ch
,
sizeof
(
wParam
),
(
WCHAR
*
)
&
unicodeChar
,
1
);
event
.
KeyInput
.
Char
=
unicodeChar
;
#endif
event
.
KeyInput
.
Key
=
irr
::
KEY_ACCEPT
;
event
.
KeyInput
.
Shift
=
0
;
event
.
KeyInput
.
Control
=
0
;
dev
=
getDeviceFromHWnd
(
hWnd
);
if
(
dev
)
dev
->
postEventFromUser
(
event
);
return
0
;
}
return
DefWindowProc
(
hWnd
,
message
,
wParam
,
lParam
);
}
...
...
@@ -1797,8 +1868,8 @@ void CIrrDeviceWin32::handleSystemMessages()
while
(
PeekMessage
(
&
msg
,
NULL
,
0
,
0
,
PM_REMOVE
))
{
//
No message translation because we don't use WM_CHAR and it would conflict with our
// deadkey handling.
//
conflict with deadkey handling.
TranslateMessage
(
&
msg
);
if
(
ExternalWindow
&&
msg
.
hwnd
==
HWnd
)
WndProc
(
HWnd
,
msg
.
message
,
msg
.
wParam
,
msg
.
lParam
);
...
...
source/Irrlicht/COSOperator.cpp
View file @
0cea1bc5
...
...
@@ -52,9 +52,9 @@ const core::stringc& COSOperator::getOperatingSystemVersion() const
//! copies text to the clipboard
void
COSOperator
::
copyToClipboard
(
const
c
8
*
text
)
const
void
COSOperator
::
copyToClipboard
(
const
c
16
*
text
)
const
{
if
(
str
len
(
text
)
==
0
)
if
(
wcs
len
(
text
)
==
0
)
return
;
// Windows version
...
...
@@ -66,15 +66,15 @@ void COSOperator::copyToClipboard(const c8* text) const
EmptyClipboard
();
HGLOBAL
clipbuffer
;
char
*
buffer
;
wchar_t
*
buffer
;
clipbuffer
=
GlobalAlloc
(
GMEM_DDESHARE
,
s
trlen
(
text
)
+
1
);
buffer
=
(
char
*
)
GlobalLock
(
clipbuffer
);
clipbuffer
=
GlobalAlloc
(
GMEM_DDESHARE
,
s
izeof
(
wchar_t
)
*
(
wcslen
(
text
)
+
1
)
);
buffer
=
(
wchar_t
*
)
GlobalLock
(
clipbuffer
);
str
cpy
(
buffer
,
text
);
wcs
cpy
(
buffer
,
text
);
GlobalUnlock
(
clipbuffer
);
SetClipboardData
(
CF_TEXT
,
clipbuffer
);
SetClipboardData
(
CF_
UNICODE
TEXT
,
clipbuffer
);
CloseClipboard
();
// MacOSX version
...
...
@@ -93,7 +93,7 @@ void COSOperator::copyToClipboard(const c8* text) const
//! gets text from the clipboard
//! \return Returns 0 if no string is in there.
const
c
8
*
COSOperator
::
getTextFromClipboard
()
const
const
c
16
*
COSOperator
::
getTextFromClipboard
()
const
{
#if defined(_IRR_XBOX_PLATFORM_)
return
0
;
...
...
@@ -101,10 +101,10 @@ const c8* COSOperator::getTextFromClipboard() const
if
(
!
OpenClipboard
(
NULL
))
return
0
;
char
*
buffer
=
0
;
wchar_t
*
buffer
=
0
;
HANDLE
hData
=
GetClipboardData
(
CF_TEXT
);
buffer
=
(
char
*
)
GlobalLock
(
hData
);
HANDLE
hData
=
GetClipboardData
(
CF_
UNICODE
TEXT
);
buffer
=
(
wchar_t
*
)
GlobalLock
(
hData
);
GlobalUnlock
(
hData
);
CloseClipboard
();
return
buffer
;
...
...
source/Irrlicht/COSOperator.h
View file @
0cea1bc5
...
...
@@ -27,11 +27,11 @@ public:
virtual
const
core
::
stringc
&
getOperatingSystemVersion
()
const
;
//! copies text to the clipboard
virtual
void
copyToClipboard
(
const
c
8
*
text
)
const
;
virtual
void
copyToClipboard
(
const
c
16
*
text
)
const
;
//! gets text from the clipboard
//! \return Returns 0 if no string is in there.
virtual
const
c
8
*
getTextFromClipboard
()
const
;
virtual
const
c
16
*
getTextFromClipboard
()
const
;
//! gets the processor speed in megahertz
//! \param Mhz:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment