aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <devnull@localhost>2003-12-15 11:47:32 +0000
committernyamatongwe <devnull@localhost>2003-12-15 11:47:32 +0000
commit31aab3b5113dedbe84c0a86d23ef52511bc53dfe (patch)
tree382728022222527de5aa5ae4f5820e09510f2634
parente9450969b8948e703439f1595316fa2a652a84f8 (diff)
downloadscintilla-mirror-31aab3b5113dedbe84c0a86d23ef52511bc53dfe.tar.gz
Changes to allow international input on GTK+ 2.
-rw-r--r--gtk/ScintillaGTK.cxx64
1 files changed, 62 insertions, 2 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx
index 21b938a69..74d3b976b 100644
--- a/gtk/ScintillaGTK.cxx
+++ b/gtk/ScintillaGTK.cxx
@@ -52,9 +52,7 @@
#include "ExternalLexer.h"
#endif
-#if GTK_MAJOR_VERSION < 2
#define INTERNATIONAL_INPUT
-#endif
#if !PLAT_GTK_WIN32
#include <iconv.h>
@@ -106,9 +104,13 @@ class ScintillaGTK : public ScintillaBase {
CLIPFORMAT cfColumnSelect;
#endif
#ifdef INTERNATIONAL_INPUT
+#if GTK_MAJOR_VERSION < 2
// Input context used for supporting internationalized key entry
GdkIC *ic;
GdkICAttr *ic_attr;
+#else
+ GtkIMContext *im_context;
+#endif
#endif
// Wheel mouse support
unsigned int linesPerScroll;
@@ -198,6 +200,10 @@ private:
gint KeyThis(GdkEventKey *event);
static gint KeyPress(GtkWidget *widget, GdkEventKey *event);
static gint KeyRelease(GtkWidget *widget, GdkEventKey *event);
+#if GTK_MAJOR_VERSION >= 2
+ static void Commit(GtkIMContext *context, char *str, ScintillaGTK *sciThis);
+ void CommitThis(char *str);
+#endif
static void Destroy(GtkObject *object);
static void SelectionReceived(GtkWidget *widget, GtkSelectionData *selection_data,
guint time);
@@ -264,8 +270,12 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) :
capturedMouse(false), dragWasDropped(false),
lastKey(0), parentClass(0),
#ifdef INTERNATIONAL_INPUT
+#if GTK_MAJOR_VERSION < 2
ic(NULL),
ic_attr(NULL),
+#else
+ im_context(NULL),
+#endif
#endif
lastWheelMouseDirection(0),
wheelMouseIntensity(0) {
@@ -323,6 +333,7 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) {
gdk_window_show(widget->window);
gdk_cursor_destroy(cursor);
#ifdef INTERNATIONAL_INPUT
+#if GTK_MAJOR_VERSION < 2
if (gdk_im_ready() && (ic_attr = gdk_ic_attr_new()) != NULL) {
gint width, height;
GdkColormap *colormap;
@@ -379,6 +390,12 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) {
gdk_im_begin(ic, widget->window);
}
}
+#else
+ im_context = gtk_im_multicontext_new();
+ g_signal_connect(im_context, "commit",
+ G_CALLBACK(Commit), this);
+ gtk_im_context_set_client_window(im_context, widget->window);
+#endif
#endif
gtk_widget_realize(PWidget(wText));
gtk_widget_realize(PWidget(scrollbarv));
@@ -399,6 +416,7 @@ void ScintillaGTK::UnRealizeThis(GtkWidget *widget) {
gtk_widget_unrealize(PWidget(scrollbarv));
gtk_widget_unrealize(PWidget(scrollbarh));
#ifdef INTERNATIONAL_INPUT
+#if GTK_MAJOR_VERSION < 2
if (ic) {
gdk_ic_destroy(ic);
ic = NULL;
@@ -407,6 +425,9 @@ void ScintillaGTK::UnRealizeThis(GtkWidget *widget) {
gdk_ic_attr_destroy(ic_attr);
ic_attr = NULL;
}
+#else
+ g_object_unref(im_context);
+#endif
#endif
if (GTK_WIDGET_CLASS(parentClass)->unrealize)
GTK_WIDGET_CLASS(parentClass)->unrealize(widget);
@@ -474,12 +495,21 @@ void ScintillaGTK::MainForAll(GtkContainer *container, gboolean include_internal
#ifdef INTERNATIONAL_INPUT
gint ScintillaGTK::CursorMoved(GtkWidget *widget, int xoffset, int yoffset, ScintillaGTK *sciThis) {
+#if GTK_MAJOR_VERSION < 2
if (GTK_WIDGET_HAS_FOCUS(widget) && gdk_im_ready() && sciThis->ic &&
(gdk_ic_get_style (sciThis->ic) & GDK_IM_PREEDIT_POSITION)) {
sciThis->ic_attr->spot_location.x = xoffset;
sciThis->ic_attr->spot_location.y = yoffset;
gdk_ic_set_attr (sciThis->ic, sciThis->ic_attr, GDK_IC_SPOT_LOCATION);
}
+#else
+ GdkRectangle area;
+ area.x = xoffset;
+ area.y = yoffset;
+ area.width = 1;
+ area.height = 1;
+ gtk_im_context_set_cursor_location(sciThis->im_context, &area);
+#endif
return FALSE;
}
#else
@@ -495,8 +525,12 @@ gint ScintillaGTK::FocusIn(GtkWidget *widget, GdkEventFocus * /*event*/) {
sciThis->SetFocusState(true);
#ifdef INTERNATIONAL_INPUT
+#if GTK_MAJOR_VERSION < 2
if (sciThis->ic)
gdk_im_begin(sciThis->ic, widget->window);
+#else
+ gtk_im_context_focus_in(sciThis->im_context);
+#endif
#endif
return FALSE;
@@ -509,7 +543,11 @@ gint ScintillaGTK::FocusOut(GtkWidget *widget, GdkEventFocus * /*event*/) {
sciThis->SetFocusState(false);
#ifdef INTERNATIONAL_INPUT
+#if GTK_MAJOR_VERSION < 2
gdk_im_end();
+#else
+ gtk_im_context_focus_out(sciThis->im_context);
+#endif
#endif
return FALSE;
@@ -537,6 +575,7 @@ void ScintillaGTK::SizeAllocate(GtkWidget *widget, GtkAllocation *allocation) {
sciThis->Resize(allocation->width, allocation->height);
#ifdef INTERNATIONAL_INPUT
+#if GTK_MAJOR_VERSION < 2
if (sciThis->ic && (gdk_ic_get_style (sciThis->ic) & GDK_IM_PREEDIT_POSITION)) {
gint width, height;
@@ -547,6 +586,7 @@ void ScintillaGTK::SizeAllocate(GtkWidget *widget, GtkAllocation *allocation) {
gdk_ic_set_attr(sciThis->ic, sciThis->ic_attr, GDK_IC_PREEDIT_AREA);
}
#endif
+#endif
}
void ScintillaGTK::Initialise() {
@@ -966,6 +1006,7 @@ static int MakeAccent(int key, int acc) {
int ScintillaGTK::KeyDefault(int key, int modifiers) {
if (!(modifiers & SCI_CTRL) && !(modifiers & SCI_ALT)) {
+#ifndef INTERNATIONAL_INPUT
#if GTK_MAJOR_VERSION >= 2
char utfVal[4]="\0\0\0";
wchar_t wcs[2];
@@ -1007,6 +1048,7 @@ int ScintillaGTK::KeyDefault(int key, int modifiers) {
}
}
#endif
+#endif
if (key < 256) {
AddChar(key);
return 1;
@@ -1710,6 +1752,10 @@ gint ScintillaGTK::KeyThis(GdkEventKey *event) {
if (!event->keyval) {
return true;
}
+#if GTK_MAJOR_VERSION >= 2
+ if (gtk_im_context_filter_keypress(im_context, event))
+ return 1;
+#endif
bool shift = (event->state & GDK_SHIFT_MASK) != 0;
bool ctrl = (event->state & GDK_CONTROL_MASK) != 0;
@@ -1754,6 +1800,20 @@ gint ScintillaGTK::KeyRelease(GtkWidget *, GdkEventKey * /*event*/) {
return FALSE;
}
+#if GTK_MAJOR_VERSION >= 2
+void ScintillaGTK::Commit(GtkIMContext *context,
+ char *str,
+ ScintillaGTK *sciThis)
+{
+ sciThis->CommitThis(str);
+}
+
+void ScintillaGTK::CommitThis(char *str)
+{
+ AddCharUTF(str, strlen(str));
+}
+#endif
+
void ScintillaGTK::Destroy(GtkObject* object) {
ScintillaObject *scio = reinterpret_cast<ScintillaObject *>(object);
// This avoids a double destruction