1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-27 00:57:50 +00:00

* Update to 1.4

* Mark IGNORE on Alpha -STABLE
This commit is contained in:
Joe Marcus Clarke 2003-07-01 06:14:02 +00:00
parent 42891ae158
commit a47f001dcc
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=83943
8 changed files with 37 additions and 626 deletions

View File

@ -6,7 +6,7 @@
#
PORTNAME?= mozilla
PORTVERSION= 1.3.1
PORTVERSION= 1.4
PORTEPOCH?= 2
CATEGORIES?= www
MASTER_SITES= ${MASTER_SITE_MOZILLA} \
@ -62,6 +62,7 @@ EXTRACT_AFTER_ARGS= | ${TAR} -xf - --exclude */CVS/* \
--exclude .cvsignore \
--exclude makefile.win \
--exclude MANIFEST
USE_BZIP2= yes
USE_X_PREFIX= yes
USE_PERL5= yes
USE_GMAKE= yes
@ -135,8 +136,7 @@ CONFIGURE_ARGS+= --disable-composer
.if defined(WITH_GTK2)
CONFIGURE_ARGS+= --enable-default-toolkit=gtk2
PKGCONFIG_FILES= mozilla-gtkmozembed.pc mozilla-js.pc mozilla-xpcom.pc \
mozilla-nspr.pc mozilla-nss.pc
EXTRA_PATCHES= ${FILESDIR}/xim_dekita2.patch
mozilla-nspr.pc mozilla-nss.pc mozilla-plugin.pc
.else
CONFIGURE_ARGS+= --enable-default-toolkit=gtk
.endif
@ -163,7 +163,7 @@ CONFIGURE_ARGS+= --enable-optimize=-O2
.endif
.if ${ARCH} == "alpha" && ${OSVERSION} < 500035
BROKEN= "core dumps on alpha during post-build"
IGNORE= "core dumps on alpha during post-build"
.endif
.if exists(${LOCALBASE}/include/freetype/freetype.h)

View File

@ -1,2 +1,2 @@
MD5 (mozilla-source-1.3.1.tar.bz2) = b3a1442a1365461e5ad3e2cc633dd8c0
MD5 (mozilla-source-1.4.tar.bz2) = a4644caeeeb323d0d8b59758b67d4454
MD5 (libart_lgpl.tar.bz2) = f332c3c026adc1c2c0ceb3ac5847d5f5

View File

@ -1,6 +1,6 @@
--- gfx/src/gtk/nsFontMetricsXft.cpp.orig Mon Mar 31 12:30:39 2003
+++ gfx/src/gtk/nsFontMetricsXft.cpp Mon Mar 31 12:30:58 2003
@@ -84,6 +84,7 @@
--- gfx/src/gtk/nsFontMetricsXft.cpp.orig Thu May 29 19:10:54 2003
+++ gfx/src/gtk/nsFontMetricsXft.cpp Mon Jun 30 23:11:39 2003
@@ -90,6 +90,7 @@
FcPattern *mPattern;
FcPattern *mFontName;
FcCharSet *mCharset;
@ -8,43 +8,25 @@
};
struct MozXftLangGroup {
@@ -375,7 +376,7 @@
PRInt32 end = mLoadedFonts.Count();
for (PRInt32 j = 0; j < end; ++j) {
font = (nsFontXft *)mLoadedFonts.ElementAt(j);
- if (FcCharSetHasChar(font->mCharset, c)) {
+ if (FcCharSetHasChar(font->mCharset, c) && font->GetXftFont()) {
currFont = font;
goto FoundFont; // for speed -- avoid "if" statement
}
@@ -635,7 +636,7 @@
for (PRInt32 j = 0, end = mLoadedFonts.Count(); j < end; ++j) {
font = (nsFontXft *)mLoadedFonts.ElementAt(j);
- if (FcCharSetHasChar(font->mCharset, c)) {
+ if (FcCharSetHasChar(font->mCharset, c) && font->GetXftFont()) {
currFont = font;
goto FoundFont; // for speed -- avoid "if" statement
}
@@ -888,7 +889,7 @@
@@ -774,7 +775,7 @@
// font in our loaded list that supports the character
for (PRInt32 i = 0, end = mLoadedFonts.Count(); i < end; ++i) {
nsFontXft *font = (nsFontXft *)mLoadedFonts.ElementAt(i);
- if (FcCharSetHasChar(font->mCharset, aChar))
+ if (FcCharSetHasChar(font->mCharset, aChar) && font->GetXftFont() != NULL)
+ if (FcCharSetHasChar(font->mCharset, aChar) && font->GetXftFont())
return font;
}
@@ -1051,7 +1052,7 @@
@@ -1196,7 +1197,7 @@
for (PRInt32 j = 0, end = mLoadedFonts.Count(); j < end; ++j) {
nsFontXft *font;
font = (nsFontXft *)mLoadedFonts.ElementAt(j);
- if (FcCharSetHasChar(font->mCharset, c)) {
+ if (FcCharSetHasChar(font->mCharset, c) && font->GetXftFont()) {
currFont = font;
goto FoundFont; // for speed -- avoid "if" statement
foundFont = font;
break;
}
@@ -1461,6 +1462,7 @@
@@ -1566,6 +1567,7 @@
FcPatternReference(mFontName);
mXftFont = nsnull;
@ -52,7 +34,7 @@
// set up our charset
mCharset = nsnull;
@@ -1487,14 +1489,16 @@
@@ -1592,7 +1594,7 @@
XftFont *
nsFontXft::GetXftFont(void)
{
@ -61,13 +43,15 @@
FcPattern *pat = FcFontRenderPrepare(0, mPattern, mFontName);
if (!pat)
return nsnull;
@@ -1611,8 +1613,10 @@
FcPatternDel(pat, FC_SPACING);
mXftFont = XftFontOpenPattern(GDK_DISPLAY(), pat);
- if (!mXftFont)
+ if (!mXftFont) {
+ if (!mXftFont) {
FcPatternDestroy(pat);
+ mNotXft = 1;
+ }
+ mNotXft = 1;
+ }
}
return mXftFont;

View File

@ -1,29 +0,0 @@
--- js/src/jsfun.c.orig Fri May 30 20:55:38 2003
+++ js/src/jsfun.c Fri May 30 20:54:24 2003
@@ -1081,7 +1081,7 @@
JSString *atomstr;
char *propname;
JSScopeProperty *sprop;
- jsid userid;
+ uint32 userid;
JSAtom *atom;
uintN i, n, dupflag;
uint32 type;
@@ -1157,7 +1157,7 @@
userid = INT_TO_JSVAL(sprop->shortid);
propname = ATOM_BYTES((JSAtom *)sprop->id);
if (!JS_XDRUint32(xdr, &type) ||
- !JS_XDRUint32(xdr, (uint32 *)&userid) ||
+ !JS_XDRUint32(xdr, &userid) ||
!JS_XDRCString(xdr, &propname)) {
if (mark)
JS_ARENA_RELEASE(&cx->tempPool, mark);
@@ -1173,7 +1173,7 @@
uintN attrs = JSPROP_ENUMERATE | JSPROP_PERMANENT;
if (!JS_XDRUint32(xdr, &type) ||
- !JS_XDRUint32(xdr, (uint32 *)&userid) ||
+ !JS_XDRUint32(xdr, &userid) ||
!JS_XDRCString(xdr, &propname)) {
return JS_FALSE;
}

View File

@ -1,11 +0,0 @@
--- nsprpub/pr/src/misc/prnetdb.c 16 Jan 2003 23:09:16 -0000 3.21.2.8
+++ nsprpub/pr/src/misc/prnetdb.c 25 Jan 2003 00:12:13 -0000
@@ -319,7 +319,7 @@
PR_Free(buf);
}
-#elif (defined(DARWIN) && defined(HAVE_GETIFADDRS))
+#elif (defined(DARWIN) && defined(HAVE_GETIFADDRS)) || defined(FREEBSD)
/*
* Use the BSD getifaddrs function.

View File

@ -1,18 +1,11 @@
--- nsprpub/pr/src/misc/prtime.c.orig Sun Mar 31 12:17:46 2002
+++ nsprpub/pr/src/misc/prtime.c Tue Dec 17 21:30:30 2002
@@ -1666,12 +1666,13 @@
* values for these two fields.
--- nsprpub/pr/src/misc/prtime.c.orig Wed Feb 26 19:01:02 2003
+++ nsprpub/pr/src/misc/prtime.c Mon Jun 30 23:18:29 2003
@@ -1666,7 +1666,7 @@
*/
-#if defined(SUNOS4) || (__GLIBC__ >= 2) || defined(XP_BEOS)
+#if defined(__FreeBSD__)|| defined(SUNOS4) \
+ || (__GLIBC__ >= 2) || defined(XP_BEOS)
if (mktime(&a) == -1) {
PR_snprintf(buf, buflen, "can't get timezone");
return 0;
}
-#endif
+#endif /* check for __FreeBSD__, too <alane@freebsd.org> */
return strftime(buf, buflen, fmt, &a);
}
#if defined(SUNOS4) || (__GLIBC__ >= 2) || defined(XP_BEOS) \
- || defined(NETBSD)
+ || defined(NETBSD) || defined(FREEBSD)
a.tm_zone = NULL;
a.tm_gmtoff = tm->tm_params.tp_gmt_offset + tm->tm_params.tp_dst_offset;
#endif

View File

@ -1,23 +1,14 @@
--- configure.orig Thu Feb 6 17:15:12 2003
+++ configure Tue Feb 11 22:52:48 2003
@@ -10974,7 +10974,7 @@
fi
MOC=$HOST_MOC
- QT_CFLAGS="-I${QTDIR}${QTINCDIR} -DQT_GENUINE_STR -DQT_NO_STL"
+ QT_CFLAGS="-I${QTDIR}/include/X11/qt -DQT_GENUINE_STR"
if test -z "$MOZ_DEBUG"; then
QT_CFLAGS="$QT_CFLAGS -DQT_NO_DEBUG -DNO_DEBUG"
fi
@@ -11840,9 +11840,9 @@
--- configure.orig Mon Jun 16 15:15:10 2003
+++ configure Mon Jun 30 23:21:49 2003
@@ -11992,9 +11992,9 @@
-MOZ_EXTENSIONS_DEFAULT=" cookie wallet content-packs xml-rpc xmlextras help pref transformiix venkman inspector irc universalchardet typeaheadfind"
+MOZ_EXTENSIONS_DEFAULT=" cookie wallet content-packs xml-rpc xmlextras help pref transformiix venkman inspector universalchardet typeaheadfind"
-MOZ_EXTENSIONS_DEFAULT=" cookie wallet content-packs xml-rpc xmlextras help p3p pref transformiix venkman inspector irc universalchardet typeaheadfind webservices"
+MOZ_EXTENSIONS_DEFAULT=" cookie wallet content-packs xml-rpc xmlextras help p3p pref transformiix venkman inspector universalchardet typeaheadfind webservices"
-MOZ_EXTENSIONS_ALL="$MOZ_EXTENSIONS_DEFAULT xmlterm access-builtin p3p interfaceinfo datetime finger cview"
+MOZ_EXTENSIONS_ALL="$MOZ_EXTENSIONS_DEFAULT irc xmlterm access-builtin p3p interfaceinfo datetime finger cview"
-MOZ_EXTENSIONS_ALL="$MOZ_EXTENSIONS_DEFAULT xmlterm access-builtin datetime finger cview"
+MOZ_EXTENSIONS_ALL="$MOZ_EXTENSIONS_DEFAULT irc xmlterm access-builtin datetime finger cview"
# Check whether --enable-extensions or --disable-extensions was given.
if test "${enable_extensions+set}" = set; then

View File

@ -1,517 +0,0 @@
Index: Makefile.in
===================================================================
RCS file: /cvsroot/mozilla/widget/src/gtk2/Makefile.in,v
retrieving revision 1.24
diff -u -r1.24 Makefile.in
--- widget/src/gtk2/Makefile.in 28 Dec 2002 01:14:45 -0000 1.24
+++ widget/src/gtk2/Makefile.in 7 Mar 2003 07:39:24 -0000
@@ -90,7 +90,7 @@
CFLAGS += $(MOZ_GTK2_CFLAGS)
CXXFLAGS += $(MOZ_GTK2_CFLAGS)
-#DEFINES += -DUSE_XIM
+DEFINES += -DUSE_XIM
INCLUDES += \
-I$(srcdir)/../xpwidgets \
Index: nsWindow.cpp
===================================================================
RCS file: /cvsroot/mozilla/widget/src/gtk2/nsWindow.cpp,v
retrieving revision 1.68
diff -u -r1.68 nsWindow.cpp
--- widget/src/gtk2/nsWindow.cpp 5 Mar 2003 23:17:28 -0000 1.68
+++ widget/src/gtk2/nsWindow.cpp 6 Mar 2003 02:22:39 -0000
@@ -179,6 +179,7 @@
nsWeakPtr gRollupWindow;
#ifdef USE_XIM
+static nsWindow *gIMEFocusWindow = NULL;
struct nsXICLookupEntry {
PLDHashEntryHdr mKeyHash;
@@ -186,7 +187,9 @@
GtkIMContext* mXIC;
};
-PLDHashTable nsWindow::gXICLookupTable;
+PLDHashTable nsWindow::gXICLookupTable;
+GdkEventKey* nsWindow::gIMEKeyEvent = NULL;
+PRBool nsWindow::gIMEStringCommited = PR_TRUE;
static void IM_commit_cb (GtkIMContext *context,
const gchar *str,
@@ -257,61 +260,6 @@
#endif
}
-#ifdef USE_XIM
-void
-nsWindow::IMEGetShellWindow(void)
-{
- GtkWidget* top_window = nsnull;
- GetToplevelWidget(&top_window);
- if (top_window) {
- mIMEShellWindow = get_window_for_gtk_widget(top_window);
- }
-}
-
-GtkIMContext*
-nsWindow::IMEGetContext()
-{
- if (!mIMEShellWindow) {
- return NULL;
- }
- PLDHashEntryHdr* hash_entry;
- nsXICLookupEntry* entry;
-
- hash_entry = PL_DHashTableOperate(&gXICLookupTable,
- mIMEShellWindow, PL_DHASH_LOOKUP);
-
- if (hash_entry) {
- entry = NS_REINTERPRET_CAST(nsXICLookupEntry *, hash_entry);
- if (entry->mXIC) {
- return entry->mXIC;
- }
- }
- return NULL;
-}
-
-void
-nsWindow::IMECreateContext(GdkWindow* aGdkWindow)
-{
- PLDHashEntryHdr* hash_entry;
- nsXICLookupEntry* entry;
- GtkIMContext *im = gtk_im_multicontext_new();
- if (im) {
- hash_entry = PL_DHashTableOperate(&gXICLookupTable, this, PL_DHASH_ADD);
- if (hash_entry) {
- entry = NS_REINTERPRET_CAST(nsXICLookupEntry *, hash_entry);
- entry->mShellWindow = this;
- entry->mXIC = im;
- }
- gtk_im_context_set_client_window(im, aGdkWindow);
- g_signal_connect(G_OBJECT(im), "commit",
- G_CALLBACK(IM_commit_cb), this);
- g_signal_connect(G_OBJECT(im), "preedit_changed",
- G_CALLBACK(IM_preedit_changed_cb), this);
- this->mIMEShellWindow = this;
- }
-}
-#endif
-
nsWindow::~nsWindow()
{
LOG(("nsWindow::~nsWindow() [%p]\n", (void *)this));
@@ -397,22 +345,7 @@
}
#ifdef USE_XIM
- GtkIMContext *im = IMEGetContext();
- // If this is the focus window and we have an IM context we need
- // to unset the focus on this window before we destroy the window.
- if (im && gFocusWindow == this) {
- LOGFOCUS((" gtk_im_context_focus_out() from Destroy()\n"));
- gtk_im_context_focus_out(im);
- }
-
- // if shell, delete GtkIMContext
- if (im && mShell) {
- gtk_im_context_reset(im);
- PL_DHashTableOperate(&gXICLookupTable, this, PL_DHASH_REMOVE);
- g_object_unref(G_OBJECT(im));
- }
-
- mIMEShellWindow = nsnull;
+ IMEDestroyContext();
#endif
// make sure that we remove ourself as the focus window
@@ -656,21 +589,30 @@
return NS_OK;
}
+#ifdef USE_XIM
+ if (mWindowType == eWindowType_child && !mIMEShellWindow) {
+ IMEGetShellWindow();
+ }
+#endif
+
// If there is already a focued child window, dispatch a LOSTFOCUS
// event from that widget and unset its got focus flag.
- if (gFocusWindow)
+ if (gFocusWindow) {
+#ifdef USE_XIM
+ // If same ic is focused, do not call LoseFocus()
+ if (mIMEShellWindow != gFocusWindow->mIMEShellWindow) {
+ gFocusWindow->IMELoseFocus();
+ }
+#endif
gFocusWindow->LoseFocus();
+ }
// Set this window to be the focused child window, update our has
// focus flag and dispatch a GOTFOCUS event.
gFocusWindow = this;
#ifdef USE_XIM
- GtkIMContext *im = IMEGetContext();
- if (im && !mIsTopLevel) {
- LOGFOCUS((" gtk_im_context_focus_in()\n"));
- gtk_im_context_focus_in(im);
- }
+ IMESetFocus();
#endif
LOGFOCUS((" widget now has focus - dispatching events [%p]\n",
@@ -1165,18 +1107,6 @@
void
nsWindow::LoseFocus(void)
{
-#ifdef USE_XIM
- GtkIMContext *im = IMEGetContext();
- if (im && !mIsTopLevel) {
- LOGFOCUS((" gtk_im_context_focus_out()\n"));
- gtk_im_context_focus_out(im);
- IMEComposeStart();
- IMEComposeText(NULL, 0, NULL, NULL);
- IMEComposeEnd();
- LOG(("gtk_im_context_focus_out\n"));
- }
-#endif
-
// make sure that we reset our repeat counter so the next keypress
// for this widget will get the down event
mInKeyRepeat = PR_FALSE;
@@ -1449,6 +1379,7 @@
DispatchEvent(&event, status);
}
+
void
nsWindow::OnContainerFocusInEvent(GtkWidget *aWidget, GdkEventFocus *aEvent)
{
@@ -1516,6 +1447,9 @@
foundit:
+#ifdef USE_XIM
+ gFocusWindow->IMELoseFocus();
+#endif
gFocusWindow->LoseFocus();
// We only dispatch a deactivate event if we are a toplevel
@@ -1537,7 +1471,7 @@
#ifdef USE_XIM
GtkIMContext *im = IMEGetContext();
if (im) {
- if (gtk_im_context_filter_keypress(im, aEvent)) {
+ if (IMFilterKeypress(im, aEvent)) {
LOGFOCUS((" keypress filtered by XIM\n"));
return TRUE;
}
@@ -1621,7 +1555,7 @@
#ifdef USE_XIM
GtkIMContext *im = IMEGetContext();
if (im) {
- if (gtk_im_context_filter_keypress(im, aEvent)) {
+ if (IMFilterKeypress(im, aEvent)) {
LOGFOCUS((" keypress filtered by XIM\n"));
return TRUE;
}
@@ -2155,6 +2089,15 @@
// and the drawing area
mDrawingarea = moz_drawingarea_new(nsnull, mContainer);
+
+#ifdef USE_XIM
+#ifndef XIM_CREATE_IC_AT_FOCUS
+ if (mWindowType != eWindowType_popup) {
+ // create im context for shell
+ IMECreateContext(mShell->window);
+ }
+#endif /* XIM_CREATE_IC_AT_FOCUS */
+#endif /* USE_XIM */
}
break;
case eWindowType_child: {
@@ -2167,11 +2110,13 @@
gtk_widget_realize(GTK_WIDGET(mContainer));
mDrawingarea = moz_drawingarea_new(nsnull, mContainer);
- }
#ifdef USE_XIM
- // get mIMEShellWindow and keep it
- IMEGetShellWindow();
-#endif
+#ifndef XIM_CREATE_IC_AT_FOCUS
+ // create im context for gtk container
+ IMECreateContext(GTK_WIDGET(mContainer)->window);
+#endif /* XIM_CREATE_IC_AT_FOCUS */
+#endif /* USE_XIM */
+ }
}
break;
default:
@@ -2216,13 +2161,6 @@
G_CALLBACK(property_notify_event_cb), NULL);
}
-#ifdef USE_XIM
- if (mShell) {
- // init GtkIMContext for shell
- IMECreateContext(mShell->window);
- }
-#endif
-
if (mContainer) {
g_signal_connect_after(G_OBJECT(mContainer), "size_allocate",
G_CALLBACK(size_allocate_cb), NULL);
@@ -3667,6 +3605,77 @@
}
#ifdef USE_XIM
+void
+nsWindow::IMEGetShellWindow(void)
+{
+ GtkWidget* top_window = nsnull;
+ GetToplevelWidget(&top_window);
+ if (top_window) {
+ mIMEShellWindow = get_window_for_gtk_widget(top_window);
+ if (mIMEShellWindow) {
+ return;
+ }
+ }
+
+ // find deepest nsWindow
+ if (!mDrawingarea) {
+ return;
+ }
+ GdkWindow *parent = gdk_window_get_parent(mDrawingarea->inner_window);
+ while (parent) {
+ nsWindow *window = get_window_for_gdk_window(parent);
+ if (window == nsnull) {
+ break;
+ }
+ if (window->mContainer) {
+ mIMEShellWindow = window;
+ }
+ parent = gdk_window_get_parent (parent);
+ }
+}
+
+GtkIMContext*
+nsWindow::IMEGetContext()
+{
+ if (!mIMEShellWindow) {
+ return NULL;
+ }
+ PLDHashEntryHdr* hash_entry;
+ nsXICLookupEntry* entry;
+
+ hash_entry = PL_DHashTableOperate(&gXICLookupTable,
+ mIMEShellWindow, PL_DHASH_LOOKUP);
+
+ if (hash_entry) {
+ entry = NS_REINTERPRET_CAST(nsXICLookupEntry *, hash_entry);
+ if (entry->mXIC) {
+ return entry->mXIC;
+ }
+ }
+ return NULL;
+}
+
+void
+nsWindow::IMECreateContext(GdkWindow* aGdkWindow)
+{
+ PLDHashEntryHdr* hash_entry;
+ nsXICLookupEntry* entry;
+ GtkIMContext *im = gtk_im_multicontext_new();
+ if (im) {
+ hash_entry = PL_DHashTableOperate(&gXICLookupTable, this, PL_DHASH_ADD);
+ if (hash_entry) {
+ entry = NS_REINTERPRET_CAST(nsXICLookupEntry *, hash_entry);
+ entry->mShellWindow = this;
+ entry->mXIC = im;
+ }
+ gtk_im_context_set_client_window(im, aGdkWindow);
+ g_signal_connect(G_OBJECT(im), "commit",
+ G_CALLBACK(IM_commit_cb), this);
+ g_signal_connect(G_OBJECT(im), "preedit_changed",
+ G_CALLBACK(IM_preedit_changed_cb), this);
+ this->mIMEShellWindow = this;
+ }
+}
void
nsWindow::IMEComposeStart(void)
@@ -3737,6 +3746,26 @@
DispatchEvent(&compEvent, status);
}
+PRBool
+nsWindow::IMFilterKeypress (GtkIMContext *context,
+ GdkEventKey *aEvent)
+{
+ gIMEKeyEvent = aEvent;
+ if (gtk_im_context_filter_keypress(context, aEvent)) {
+ /* return true if the keyevent is commited as string and
+ ** has been dispatched as TextEvent.
+ */
+ if( gIMEStringCommited ) {
+ return TRUE;
+ }
+ gIMEStringCommited = PR_TRUE;
+ }
+ gIMEKeyEvent = NULL;
+
+ /* the Keyevent is not filtered by IME */
+ return FALSE;
+}
+
/* static */
void
IM_preedit_changed_cb(GtkIMContext *context,
@@ -3747,7 +3776,8 @@
PangoAttrList *feedback_list;
// call for focused window
- nsWindow *window = gFocusWindow;
+ // if gFocusWindow is null, use the last focused gIMEFocusWindow
+ nsWindow *window = gFocusWindow ? gFocusWindow : gIMEFocusWindow;
if (!window) return;
// Should use cursor_pos ?
@@ -3760,6 +3790,7 @@
if (!preedit_string || !*preedit_string) {
window->IMEComposeStart();
window->IMEComposeText(NULL, 0, NULL, NULL);
+ window->IMEComposeEnd();
return;
}
@@ -3800,9 +3831,31 @@
glong uniStrLen;
// call for focused window
- nsWindow *window = gFocusWindow;
+ // if gFocusWindow is null, use the last focused gIMEFocusWindow
+ nsWindow *window = gFocusWindow ? gFocusWindow : gIMEFocusWindow;
if (!window) return;
+ /* if the IME does not change the keystrock, we won't send it
+ * through the TextEvent.
+ */
+ nsWindow::gIMEStringCommited = PR_TRUE;
+ if ( nsWindow::gIMEKeyEvent )
+ {
+ char keyval_utf8[8]; /* should have at least 6 bytes of space */
+ gint keyval_utf8_len;
+ keyval_utf8_len = g_unichar_to_utf8(
+ gdk_keyval_to_unicode(nsWindow::gIMEKeyEvent->keyval),
+ keyval_utf8);
+
+ keyval_utf8[keyval_utf8_len] = '\0';
+ if ( strcmp(utf8_str, keyval_utf8) == 0)
+ {
+ nsWindow::gIMEStringCommited = PR_FALSE;
+ return;
+ }
+ nsWindow::gIMEKeyEvent = NULL;
+ }
+
uniStr = NULL;
uniStrLen = 0;
uniStr = g_utf8_to_utf16(utf8_str, -1, NULL, &uniStrLen, NULL);
@@ -3944,6 +3997,60 @@
*aTextRangeListLengthResult = count + 1;
pango_attr_iterator_destroy(aFeedbackIterator);
+}
+
+void
+nsWindow::IMELoseFocus(void)
+{
+ GtkIMContext *im = IMEGetContext();
+ if (!im) {
+ return;
+ }
+ gtk_im_context_focus_out(im);
+}
+
+void
+nsWindow::IMESetFocus(void)
+{
+ GtkIMContext *im = IMEGetContext();
+#ifdef XIM_CREATE_IC_AT_FOCUS
+ if (!im && mIMEShellWindow) {
+ if (mIMEShellWindow->mShell) {
+ // init GtkIMContext for shell
+ mIMEShellWindow->IMECreateContext(mIMEShellWindow->mShell->window);
+ } else if (mIMEShellWindow->mContainer) {
+ // init GtkIMContext for mContainer
+ mIMEShellWindow->IMECreateContext(GTK_WIDGET(mIMEShellWindow->mContainer)->window);
+ }
+ }
+ im = IMEGetContext();
+#endif /* XIM_CREATE_IC_AT_FOCUS */
+ if (!im) {
+ return;
+ }
+ gtk_im_context_focus_in(im);
+ gIMEFocusWindow = this;
+}
+
+void
+nsWindow::IMEDestroyContext(void)
+{
+ GtkIMContext *im = IMEGetContext();
+ if (im) {
+ // If this is the focus window and we have an IM context we need
+ // to unset the focus on this window before we destroy the window.
+ if (gIMEFocusWindow == this) {
+ gIMEFocusWindow->IMELoseFocus();
+ gIMEFocusWindow = nsnull;
+ }
+ // if shell, delete GtkIMContext
+ if (mIMEShellWindow == this) {
+ gtk_im_context_set_client_window(im, NULL);
+ PL_DHashTableOperate(&gXICLookupTable, this, PL_DHASH_REMOVE);
+ g_object_unref(G_OBJECT(im));
+ }
+ }
+ mIMEShellWindow = nsnull;
}
#endif
Index: nsWindow.h
===================================================================
RCS file: /cvsroot/mozilla/widget/src/gtk2/nsWindow.h,v
retrieving revision 1.32
diff -u -r1.32 nsWindow.h
--- widget/src/gtk2/nsWindow.h 17 Feb 2003 18:50:01 -0000 1.32
+++ widget/src/gtk2/nsWindow.h 6 Mar 2003 02:22:39 -0000
@@ -239,6 +239,9 @@
static guint32 mLastButtonPressTime;
#ifdef USE_XIM
+ void IMEDestroyContext(void);
+ void IMESetFocus(void);
+ void IMELoseFocus(void);
void IMEComposeStart(void);
void IMEComposeText(const PRUnichar *aText,
const PRInt32 aLen,
@@ -249,9 +252,13 @@
void IMEGetShellWindow(void);
GtkIMContext* IMEGetContext(void);
void IMECreateContext(GdkWindow* aGdkWindow);
-
+ PRBool IMFilterKeypress (GtkIMContext *context,
+ GdkEventKey *aEvent);
+
nsWindow* mIMEShellWindow;
static PLDHashTable gXICLookupTable;
+ static GdkEventKey* gIMEKeyEvent;
+ static PRBool gIMEStringCommited;
#endif
private: