[Date Prev][Date Next][Thread Prev][Thread Next][Thread Index]
[XaraXtreme-dev] Text input broken
- From: Martin Wuerthner <lists@xxxxxxxxxxxxxxx>
- Date: Fri, 07 Apr 2006 11:44:46 +0200
- Subject: [XaraXtreme-dev] Text input broken
> Commit by : luke
> Repository : xara
> Revision : 785
> Date : Thu Apr 6 17:52:30 BST 2006
>
> Changed paths:
> M /Trunk/XaraLX/wxOil/unicdman.cpp
>
> A fix for seg. fault when entering text, surprised no-one else saw it
Unfortunately, this change has made text input much worse than it used
to be. The symptom is that any character outside the ASCII range
(e.g., an accented character in the Latin-1 range) is reported as code
0000. More seriously, all subsequent keypresses, even ASCII
characters, are reported as 0000, too, so once a non-ASCII character
has been entered, the application has to be quit and restarted to
enter any further text.
Find attached a patch (patch17.txt) to fix the fix - you should not
pass a NULL state to mbrtowc. It is much better to pass a state
initialised to 0 because that is well-defined.
However, the whole thing is not working anyway and I am not quite sure
what the call to MultiByteToUnicode in TextTool::OnKeyPress is
supposed to do. Surely, the whole multi-byte thing is only needed for
OSes that do not have a wide key event interface so they need to send
one byte of a multi-byte code per event and the application has to
assemble them back again. This would only work if the application
actually kept the multi-byte state around, which neither of the
revisions of the above routine attempted to do.
>From what I can see, our keypress events do have proper Unicode
character codes, so calling MultiByteToUnicode is harmful (which seems
to be confirmed by the fact that, originally, the call in
TextTool::OnKeyPress only happened for non-Unicode OSes -
unfortunately, someone commented that out). Find attached below
patch18, which disables the call and finally enables non-ASCII
characters to be entered.
Martin
Index: wxOil/unicdman.cpp
===================================================================
--- wxOil/unicdman.cpp (Revision 787)
+++ wxOil/unicdman.cpp (Arbeitskopie)
@@ -279,7 +279,9 @@
return 128;
}
#else
- mbrtowc( ReturnArray, MBArray, cch, NULL );
+ mbstate_t state;
+ memset(&state, 0, sizeof(mbstate_t));
+ mbrtowc( ReturnArray, MBArray, cch, &state );
return ReturnArray[0];
#endif
}
Index: tools/texttool.cpp
===================================================================
--- tools/texttool.cpp (Revision 787)
+++ tools/texttool.cpp (Arbeitskopie)
@@ -1064,14 +1064,17 @@
(pKeyPress->IsAlternative() && pKeyPress->IsConstrain()) ) // Ctrl & left alt down
{
WCHAR UnicodeValue = pKeyPress->GetUnicode();
+ TRACEUSER("wuerthne", _T("UnicodeValue from keypress event = %04x"), UnicodeValue);
if (HandleDeadKeys(pKeyPress, &UnicodeValue))
return TRUE;
else
{
if ( (UnicodeValue>=32) && ((UnicodeValue < CAMELOT_UNICODE_BASE) || (UnicodeValue > CAMELOT_UNICODE_LAST)))
{
+#ifndef EXCLUDE_FROM_XARALX
if ((UnicodeValue < 256) /*&& !TextManager::IsUnicodeCompleteOS()*/)
UnicodeValue = UnicodeManager::MultiByteToUnicode(UnicodeValue);
+#endif
// Display a blank cursor (thus hiding the pointer)
if (!IsBlankCursorUp)
@@ -1085,6 +1088,7 @@
OpTextFormat* pOp = new OpTextFormat();
if (pOp != NULL)
{
+ TRACEUSER("wuerthne", _T("inserting Unicode char %04x"), UnicodeValue);
pOp->DoInsertChar(UnicodeValue, OpTextFormat::INSERT);
UpdateAfterTyping = TRUE;
return TRUE;