diff options
-rw-r--r-- | gtk/ScintillaGTK.cxx | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index e0fd95a99..f4de1f772 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -41,6 +41,7 @@ #include "Editor.h" #include "SString.h" #include "ScintillaBase.h" +#include "UniConversion.h" #include "gtk/gtksignal.h" #include "gtk/gtkmarshal.h" @@ -169,6 +170,7 @@ private: static gint ScrollEvent(GtkWidget *widget, GdkEventScroll *event); #endif static gint Motion(GtkWidget *widget, GdkEventMotion *event); + gint KeyThis(GdkEventKey *event); static gint KeyPress(GtkWidget *widget, GdkEventKey *event); static gint KeyRelease(GtkWidget *widget, GdkEventKey *event); static void Destroy(GtkObject *object); @@ -827,9 +829,26 @@ void ScintillaGTK::NotifyURIDropped(const char *list) { } int ScintillaGTK::KeyDefault(int key, int modifiers) { - if (!(modifiers & SCI_CTRL) && !(modifiers & SCI_ALT) && (key < 256)) { - AddChar(key); - return 1; + if (!(modifiers & SCI_CTRL) && !(modifiers & SCI_ALT)) { +#if GTK_MAJOR_VERSION >= 2 + if (IsUnicodeMode() && (key <= 0xFE00)) { + char utfval[4]="\0\0\0"; + wchar_t wcs[2]; + wcs[0] = gdk_keyval_to_unicode(key); + wcs[1] = 0; + UTF8FromUCS2(wcs, 1, utfval, 3); + AddCharUTF(utfval,strlen(utfval)); + return 1; + } +#endif + if (key < 256) { + AddChar(key); + return 1; + } else { + // Pass up to container in case it is an accelerator + NotifyKey(key, modifiers); + return 0; + } } else { // Pass up to container in case it is an accelerator NotifyKey(key, modifiers); @@ -1416,8 +1435,7 @@ static int KeyTranslate(int keyIn) { } } -gint ScintillaGTK::KeyPress(GtkWidget *widget, GdkEventKey *event) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); +gint ScintillaGTK::KeyThis(GdkEventKey *event) { //Platform::DebugPrintf("SC-key: %d %x [%s]\n", // event->keyval, event->state, (event->length > 0) ? event->string : "empty"); bool shift = (event->state & GDK_SHIFT_MASK) != 0; @@ -1430,25 +1448,32 @@ gint ScintillaGTK::KeyPress(GtkWidget *widget, GdkEventKey *event) { key &= 0x7F; // Hack for keys over 256 and below command keys but makes Hungarian work. // This will have to change for Unicode + else if (key >= 0xFE00) + key = KeyTranslate(key); + else if (IsUnicodeMode()) + ; // No operation else if ((key >= 0x100) && (key < 0x1000)) key &= 0xff; - else - key = KeyTranslate(key); bool consumed = false; - bool added = sciThis->KeyDown(key, shift, ctrl, alt, &consumed) != 0; + bool added = KeyDown(key, shift, ctrl, alt, &consumed) != 0; if (!consumed) consumed = added; //Platform::DebugPrintf("SK-key: %d %x %x\n",event->keyval, event->state, consumed); if (event->keyval == 0xffffff && event->length > 0) { - sciThis->ClearSelection(); - if (sciThis->pdoc->InsertString(sciThis->CurrentPosition(), event->string)) { - sciThis->MovePositionTo(sciThis->CurrentPosition() + event->length); + ClearSelection(); + if (pdoc->InsertString(CurrentPosition(), event->string)) { + MovePositionTo(CurrentPosition() + event->length); } } return consumed; } +gint ScintillaGTK::KeyPress(GtkWidget *widget, GdkEventKey *event) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + return sciThis->KeyThis(event); +} + gint ScintillaGTK::KeyRelease(GtkWidget *, GdkEventKey * /*event*/) { //Platform::DebugPrintf("SC-keyrel: %d %x %3s\n",event->keyval, event->state, event->string); return FALSE; |