diff options
author | 2004-08-16 13:52:54 +0000 | |
---|---|---|
committer | 2004-08-16 13:52:54 +0000 | |
commit | 755c36787cb73277b4327574d2858f74f1a7e700 (patch) | |
tree | 9b1d036f5f8d96cea63f3bec12dcbeb8f4562013 /x11-libs/qt | |
parent | Re-added jython-bin-2.1-r2 because all stable versions for sparc were removed. (diff) | |
download | historical-755c36787cb73277b4327574d2858f74f1a7e700.tar.gz historical-755c36787cb73277b4327574d2858f74f1a7e700.tar.bz2 historical-755c36787cb73277b4327574d2858f74f1a7e700.zip |
Updated immodule patch.
Diffstat (limited to 'x11-libs/qt')
-rw-r--r-- | x11-libs/qt/ChangeLog | 7 | ||||
-rw-r--r-- | x11-libs/qt/Manifest | 23 | ||||
-rw-r--r-- | x11-libs/qt/files/digest-qt-3.3.2 | 2 | ||||
-rw-r--r-- | x11-libs/qt/files/qt-x11-immodule-bc-qt3.3.2-20040623.diff | 4414 | ||||
-rw-r--r-- | x11-libs/qt/qt-3.3.2.ebuild | 21 |
5 files changed, 27 insertions, 4440 deletions
diff --git a/x11-libs/qt/ChangeLog b/x11-libs/qt/ChangeLog index a471105132f3..f8e3d7f749e2 100644 --- a/x11-libs/qt/ChangeLog +++ b/x11-libs/qt/ChangeLog @@ -1,11 +1,14 @@ # ChangeLog for x11-libs/qt # Copyright 2002-2004 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/x11-libs/qt/ChangeLog,v 1.158 2004/08/06 00:34:08 arj Exp $ +# $Header: /var/cvsroot/gentoo-x86/x11-libs/qt/ChangeLog,v 1.159 2004/08/16 13:52:54 usata Exp $ + + 16 Aug 2004; Mamoru KOMACHI <usata@gentoo.org> qt-3.3.2.ebuild: + Updated immodule patch. 05 Aug 2004; Anders Rune Jensen <arj@gentoo.org> qt-3.3.1-r2.ebuild, qt-3.3.2.ebuild: Depend on version 2 of sqlite. - + 05 Aug 2004; Mamoru KOMACHI <usata@gentoo.org> +files/qt-x11-immodule-bc-qt3.3.2-20040623.diff, qt-3.3.2.ebuild: Added qt-immodule patch. Thanks to Ken Deeter diff --git a/x11-libs/qt/Manifest b/x11-libs/qt/Manifest index 921e2b6deb61..0dc68edfee32 100644 --- a/x11-libs/qt/Manifest +++ b/x11-libs/qt/Manifest @@ -1,23 +1,22 @@ -MD5 9c6f722c3b354552872d37c74ba88fe8 ChangeLog 26827 +MD5 9dbbadb16ff4fb9b1518bb13ded3aaf9 ChangeLog 26921 MD5 512150b47a904b0240101e319856aab1 metadata.xml 156 MD5 c167f38f82d95bc8e7414bf15cbd693b qt-2.3.2-r1.ebuild 2282 MD5 3dc117d667771d6bd5a766379d5487b4 qt-3.2.3-r1.ebuild 5119 MD5 c31b58bb9bef0cf4b24823c9c7ce4d56 qt-3.3.1-r2.ebuild 5733 -MD5 2c5e8d91cfc23d84cb0442647a789b02 qt-3.3.2.ebuild 6002 -MD5 08cdd879d3418837cf4bad594dc0f91f files/45qtdir2 16 -MD5 c7f65a0625242eccf159e2b8ee74976d files/45qt3 109 -MD5 7dc4f78d52452c28ba797ffc7db34f23 files/50qtdir3 16 -MD5 7a287bc7609ad2420f70af6d4c58302f files/50qt2 63 -MD5 037b7ee164790946df6a2d6ea89f01fc files/digest-qt-2.3.2-r1 65 +MD5 0d6f81f289d145db1870d324d587133e qt-3.3.2.ebuild 6059 MD5 24486c56d654be71e66b7c01b143c9a9 files/digest-qt-3.2.3-r1 72 -MD5 87c645dbad7233316ff3340847a59f22 files/digest-qt-3.3.1-r2 72 -MD5 a434f0baa6c941dfcf212b48f1eb3cf3 files/digest-qt-3.3.2 157 MD5 8c01ee8bb9af451f93082717ed8f4c49 files/qfontdatabase_x11.diff 1147 MD5 057679471a1149cfba2cabd7a1fd2b55 files/qt-3.2.3-qfontdatabase-i18n-20031024.patch 10536 MD5 9ac22fe721162a565a7507763f785ab5 files/qt-3.2.3-qpsprinter-useFreeType2-20031128.patch 9972 MD5 687ac003fc61501eda26cb2cf068cb2a files/qt-3.2.3-scriptForChar-20031128.patch 18095 +MD5 da2eb517a4c29a58002e92864ff966e5 files/qt-no-rpath-uic.patch 294 +MD5 c7f65a0625242eccf159e2b8ee74976d files/45qt3 109 +MD5 08cdd879d3418837cf4bad594dc0f91f files/45qtdir2 16 +MD5 7a287bc7609ad2420f70af6d4c58302f files/50qt2 63 +MD5 7dc4f78d52452c28ba797ffc7db34f23 files/50qtdir3 16 +MD5 037b7ee164790946df6a2d6ea89f01fc files/digest-qt-2.3.2-r1 65 +MD5 33d20a19eba2cb13a7eb156d4eea10db files/qt-3.3.2-mips-relax-branches.patch 688 +MD5 87c645dbad7233316ff3340847a59f22 files/digest-qt-3.3.1-r2 72 +MD5 a9baac51734a4c0a329931b6f3ebfc06 files/digest-qt-3.3.2 165 MD5 33d20a19eba2cb13a7eb156d4eea10db files/qt-3.3.1-mips-relax-branches.patch 688 MD5 9bd231bda8dcf1508a797c80002bfaa3 files/qt-3.3.1-qclipboard-fix.patch 2878 -MD5 33d20a19eba2cb13a7eb156d4eea10db files/qt-3.3.2-mips-relax-branches.patch 688 -MD5 da2eb517a4c29a58002e92864ff966e5 files/qt-no-rpath-uic.patch 294 -MD5 7ba6437b2023d5a3d37f5731aa986480 files/qt-x11-immodule-bc-qt3.3.2-20040623.diff 137844 diff --git a/x11-libs/qt/files/digest-qt-3.3.2 b/x11-libs/qt/files/digest-qt-3.3.2 index 644c0799e5ad..318ecb5d7b71 100644 --- a/x11-libs/qt/files/digest-qt-3.3.2 +++ b/x11-libs/qt/files/digest-qt-3.3.2 @@ -1,2 +1,2 @@ MD5 903cad618274ad84d7d13fd0027a6c3c qt-x11-free-3.3.2.tar.bz2 14434821 -MD5 653f15a063bc0886050570430f973c2a qt-x11-immodule-bc-qt3.3.2-20040623.diff 137699 +MD5 5daed8d9c41d56a9b4ec339f60b2ad98 qt-x11-immodule-unified-qt3.3.2-20040814.diff.gz 131662 diff --git a/x11-libs/qt/files/qt-x11-immodule-bc-qt3.3.2-20040623.diff b/x11-libs/qt/files/qt-x11-immodule-bc-qt3.3.2-20040623.diff deleted file mode 100644 index 6f7918c39322..000000000000 --- a/x11-libs/qt/files/qt-x11-immodule-bc-qt3.3.2-20040623.diff +++ /dev/null @@ -1,4414 +0,0 @@ -diff -urN qt-x11-free-3.3.2/configure qt-x11-immodule-bc/configure ---- qt-x11-free-3.3.2/configure 2004-04-01 01:40:12.000000000 +0900 -+++ qt-x11-immodule-bc/configure 2004-06-23 01:10:27.058123680 +0900 -@@ -217,7 +217,7 @@ - fi - - # licensed modules depend on type of commercial license --MODULES="styles tools kernel widgets dialogs iconview workspace" -+MODULES="styles tools kernel widgets dialogs iconview workspace input" - [ "$PLATFORM_QWS" = "yes" ] && [ "$Products" = "qt-professional" ] && MODULES="$MODULES network" - [ "$Products" != "qt-professional" ] && MODULES="$MODULES network canvas table xml opengl sql" - CFG_MODULES_AVAILABLE=$MODULES -@@ -2999,7 +2999,7 @@ - # minimal-config small-config medium-config large-config full-config - # - # Modules: --# styles tools kernel widgets dialogs iconview workspace -+# styles tools kernel widgets dialogs iconview workspace input - # - # Enterprise/Free edition modules: - # network canvas table xml opengl sql -@@ -3031,7 +3031,7 @@ - # X11 : xftnameunparse x11sm xinerama xcursor xrandr xrender xftfreetype xkb - # Embedded: embedded ft - # --ALL_OPTIONS="styles tools kernel widgets dialogs iconview workspace network canvas table xml opengl sql stl" -+ALL_OPTIONS="styles tools kernel widgets dialogs iconview workspace input network canvas table xml opengl sql stl" - BUILD_CONFIG= - BUILD_OPTIONS= - -@@ -3045,7 +3045,7 @@ - BUILD_CONFIG="$config_option" - ;; - -- styles|tools|kernel|widgets|dialogs|iconview|workspace|network|canvas|table|xml|opengl|sql|stl) -+ styles|tools|kernel|widgets|dialogs|iconview|workspace|input|network|canvas|table|xml|opengl|sql|stl) - # these config options affect the Qt API/ABI. they should influence - # the generation of the buildkey, so we don't skip them - SKIP="no" -diff -urN qt-x11-free-3.3.2/src/input/qinputcontextfactory.cpp qt-x11-immodule-bc/src/input/qinputcontextfactory.cpp ---- qt-x11-free-3.3.2/src/input/qinputcontextfactory.cpp 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/input/qinputcontextfactory.cpp 2004-06-23 01:54:29.544404704 +0900 -@@ -0,0 +1,151 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** Implementation of QInputContextFactory class -+** -+** Created : 001103 -+** -+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. -+** -+** This file is part of the widgets module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition licenses may use this -+** file in accordance with the Qt Commercial License Agreement provided -+** with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+#include "qinputcontextinterface_p.h" // up here for GCC 2.7.* compatibility -+#include "qinputcontextfactory.h" -+ -+#ifndef QT_NO_IM -+ -+#include "qapplication.h" -+#include "qpopupmenu.h" -+#ifdef Q_WS_X11 -+#include "qximinputcontext_p.h" -+#endif -+ -+#ifdef QT_THREAD_SUPPORT -+#include <private/qmutexpool_p.h> -+#endif // QT_THREAD_SUPPORT -+ -+#include <stdlib.h> -+ -+#include "qcleanuphandler.h" -+#include <private/qpluginmanager_p.h> -+#ifndef QT_NO_COMPONENT -+ -+ -+static QPluginManager<QInputContextFactoryInterface> *manager = 0; -+static QSingleCleanupHandler< QPluginManager<QInputContextFactoryInterface> > cleanup_manager; -+ -+static void create_manager() -+{ -+ if( manager ) // already created -+ return; -+ -+#ifdef QT_THREAD_SUPPORT -+ // protect manager creation -+ QMutexLocker locker( qt_global_mutexpool ? -+ qt_global_mutexpool->get( &manager ) : 0); -+ -+ // we check the manager pointer again to make sure that another thread -+ // has not created the manager before us. -+ -+ if ( manager ) // already created -+ return; -+#endif -+ -+ manager = new QPluginManager<QInputContextFactoryInterface>( IID_QInputContextFactory, QApplication::libraryPaths(), "/input", FALSE ); -+ -+ Q_CHECK_PTR( manager ); -+ cleanup_manager.set( &manager ); -+} -+ -+#endif //QT_NO_COMPONENT -+ -+ -+/*! -+ This function generates InputMethod with the name which is in agreement -+ with key of the first argument. widget of the second argument is client -+ widget of QInputContext. -+*/ -+QInputContext *QInputContextFactory::create( const QString& key, QWidget *widget ) -+{ -+ QInputContext *ret = 0; -+ QString inputcontext = key; -+#ifdef Q_WS_X11 -+ if ( inputcontext == "XIM" ) { -+ ret = new QXIMInputContext( widget ); -+ ret->setHolderWidget( widget ); -+ } -+#endif -+ { } // Keep these here - they make the #ifdefery above work -+ -+#ifndef QT_NO_COMPONENT -+ if(!ret) { -+ // make sure the manager is created -+ create_manager(); -+ -+ QInterfacePtr<QInputContextFactoryInterface> iface; -+ manager->queryInterface( inputcontext, &iface ); -+ -+ if ( iface ) { -+ ret = iface->create( inputcontext ); -+#ifdef Q_WS_X11 -+ ret->setHolderWidget( widget ); -+#endif -+ } -+ } -+#endif -+ return ret; -+} -+ -+ -+/*! -+ This function returns the list of the names input methods. -+ Only input methods included in default and putted below -+ $QTDIR/plugins/input are listed. -+*/ -+#ifndef QT_NO_STRINGLIST -+QStringList QInputContextFactory::keys() -+{ -+ QStringList list; -+#ifndef QT_NO_COMPONENT -+ // make sure the manager is created -+ create_manager(); -+ -+ list = manager->featureList(); -+#endif //QT_NO_COMPONENT -+ -+#ifdef Q_WS_X11 -+ if ( !list.contains( "XIM" ) ) -+ list << "XIM"; -+#endif // Q_WS_X11 -+ -+ return list; -+} -+#endif // QT_NO_STRINGLIST -+ -+#endif // QT_NO_IM -diff -urN qt-x11-free-3.3.2/src/input/qinputcontextfactory.h qt-x11-immodule-bc/src/input/qinputcontextfactory.h ---- qt-x11-free-3.3.2/src/input/qinputcontextfactory.h 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/input/qinputcontextfactory.h 2004-06-23 01:10:27.059123528 +0900 -@@ -0,0 +1,60 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** Definition of QInputContextPlugin class -+** -+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. -+** -+** This file is part of the widgets module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition -+** licenses may use this file in accordance with the Qt Commercial License -+** Agreement provided with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+#ifndef QINPUTCONTEXTFACTORY_H -+#define QINPUTCONTEXTFACTORY_H -+ -+#ifndef QT_H -+#include "qstringlist.h" -+#endif // QT_H -+ -+#ifndef QT_NO_IM -+ -+class QInputContext; -+class QPopupMenu; -+ -+ -+class Q_EXPORT QInputContextFactory -+{ -+public: -+#ifndef QT_NO_STRINGLIST -+ static QStringList keys(); -+#endif -+ static QInputContext *create( const QString&, QWidget*); // should be a toplevel widget -+ -+}; -+#endif //QT_NO_IM -+ -+#endif //QINPUTCONTEXTFACTORY_H -diff -urN qt-x11-free-3.3.2/src/input/qinputcontextinterface_p.h qt-x11-immodule-bc/src/input/qinputcontextinterface_p.h ---- qt-x11-free-3.3.2/src/input/qinputcontextinterface_p.h 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/input/qinputcontextinterface_p.h 2004-06-23 01:10:27.060123376 +0900 -@@ -0,0 +1,74 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** ... -+** -+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. -+** -+** This file is part of the widgets module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition -+** licenses may use this file in accordance with the Qt Commercial License -+** Agreement provided with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+#ifndef QINPUTCONTEXTINTERFACE_P_H -+#define QINPUTCONTEXTINTERFACE_P_H -+ -+// -+// W A R N I N G -+// ------------- -+// -+// This file is not part of the Qt API. This header file may -+// change from version to version without notice, or even be -+// removed. -+// -+// We mean it. -+// -+// -+ -+#ifndef QT_H -+#include <private/qcom_p.h> -+#endif // QT_H -+ -+#ifndef QT_NO_IM -+#ifndef QT_NO_COMPONENT -+ -+class QWidget; -+class QInputContext; -+ -+// {6C2B9EDE-B63C-14c9-A729-3C7643739C4C} -+#ifndef IID_QInputContextFactory -+#define IID_QInputContextFactory QUuid(0x6c2b9ede, 0xb63c, 0x14c9, 0xa7, 0x29, 0x3c, 0x76, 0x43, 0x73, 0x9c, 0x4c) -+#endif -+ -+struct Q_EXPORT QInputContextFactoryInterface : public QFeatureListInterface -+{ -+ virtual QInputContext* create( const QString& inputcontext ) = 0; -+}; -+ -+#endif //QT_NO_COMPONENT -+#endif //QT_NO_IM -+ -+#endif //QINPUTCONTEXTINTERFACE_P_H -diff -urN qt-x11-free-3.3.2/src/input/qinputcontextplugin.cpp qt-x11-immodule-bc/src/input/qinputcontextplugin.cpp ---- qt-x11-free-3.3.2/src/input/qinputcontextplugin.cpp 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/input/qinputcontextplugin.cpp 2004-06-23 01:10:27.060123376 +0900 -@@ -0,0 +1,158 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** Implementation of QInputContextPlugin class -+** -+** Created : 010920 -+** -+** Copyright (C) 2001 Trolltech AS. All rights reserved. -+** -+** This file is part of the widgets module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition -+** licenses may use this file in accordance with the Qt Commercial License -+** Agreement provided with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+#include "qinputcontextplugin.h" -+ -+#ifndef QT_NO_IM -+#ifndef QT_NO_COMPONENT -+ -+#include "qinputcontextinterface_p.h" -+ -+/*! -+ \class QInputContextPlugin qinputcontextplugin.h -+ \brief The QInputContextPlugin class provides an abstract base for custom QInputContext plugins. -+ \reentrant -+ \ingroup plugins -+ -+ The input context plugin is a simple plugin interface that makes it -+ easy to create custom input contexts that can be loaded dynamically -+ into applications. -+ -+ Writing a input context plugin is achieved by subclassing this base -+ class, reimplementing the pure virtual functions keys(), -+ create(), and exporting the class with the \c Q_EXPORT_PLUGIN macro. -+ See the \link plugins-howto.html Qt Plugins documentation \endlink -+ for details. -+*/ -+ -+/*! -+ \fn QStringList QInputContextPlugin::keys() const -+ -+ Returns the list of InputContext keys this plugin supports. -+ -+ These keys are usually the class names of the custom input context -+ that are implemented in the plugin. -+ -+ \sa create() -+*/ -+ -+/*! -+ \fn QInputContext* QInputContextPlugin::create( const QString& key ) -+ -+ Creates and returns a QInputContext object for the InputContext key \a key. -+ The InputContext key is usually the class name of the required input method. -+ -+ \sa keys() -+*/ -+ -+ -+ -+class QInputContextPluginPrivate : public QInputContextFactoryInterface -+{ -+public: -+ QInputContextPluginPrivate( QInputContextPlugin *p ) -+ : plugin( p ) -+ { -+ } -+ -+ virtual ~QInputContextPluginPrivate(); -+ -+ QRESULT queryInterface( const QUuid &iid, QUnknownInterface **iface ); -+ Q_REFCOUNT; -+ -+ QStringList featureList() const; -+ QInputContext *create( const QString &key ); -+ -+private: -+ QInputContextPlugin *plugin; -+}; -+ -+QRESULT QInputContextPluginPrivate::queryInterface( const QUuid &iid, QUnknownInterface **iface ) -+{ -+ *iface = 0; -+ -+ if ( iid == IID_QUnknown ) -+ *iface = this; -+ else if ( iid == IID_QFeatureList ) -+ *iface = this; -+ else if ( iid == IID_QInputContextFactory ) -+ *iface = this; -+ else -+ return QE_NOINTERFACE; -+ -+ (*iface)->addRef(); -+ return QS_OK; -+} -+ -+QInputContextPluginPrivate::~QInputContextPluginPrivate() -+{ -+ delete plugin; -+} -+ -+QStringList QInputContextPluginPrivate::featureList() const -+{ -+ return plugin->keys(); -+} -+ -+QInputContext *QInputContextPluginPrivate::create( const QString &key ) -+{ -+ return plugin->create( key ); -+} -+ -+ -+/*! -+ Constructs a InputContext plugin. This is invoked automatically by the -+ \c Q_EXPORT_PLUGIN macro. -+*/ -+QInputContextPlugin::QInputContextPlugin() -+ : QGPlugin( d = new QInputContextPluginPrivate( this ) ) -+{ -+} -+ -+/*! -+ Destroys the InputContext plugin. -+ -+ You never have to call this explicitly. Qt destroys a plugin -+ automatically when it is no longer used. -+*/ -+QInputContextPlugin::~QInputContextPlugin() -+{ -+ // don't delete d, as this is deleted by d -+} -+ -+#endif // QT_NO_COMPONENT -+#endif // QT_NO_IM -diff -urN qt-x11-free-3.3.2/src/input/qinputcontextplugin.h qt-x11-immodule-bc/src/input/qinputcontextplugin.h ---- qt-x11-free-3.3.2/src/input/qinputcontextplugin.h 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/input/qinputcontextplugin.h 2004-06-23 01:10:27.061123224 +0900 -@@ -0,0 +1,64 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** Definition of QInputContextPlugin class -+** -+** Created : 010920 -+** -+** Copyright (C) 2001 Trolltech AS. All rights reserved. -+** -+** This file is part of the tools module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition -+** licenses may use this file in accordance with the Qt Commercial License -+** Agreement provided with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+#ifndef QINPUTCONTEXTPLUGIN_H -+#define QINPUTCONTEXTPLUGIN_H -+ -+#ifndef QT_H -+#include "qgplugin.h" -+#include "qstringlist.h" -+#endif // QT_H -+ -+#ifndef QT_NO_IM -+class QInputContext; -+class QInputContextPluginPrivate; -+ -+class Q_EXPORT QInputContextPlugin : public QGPlugin -+{ -+ Q_OBJECT -+public: -+ QInputContextPlugin(); -+ ~QInputContextPlugin(); -+ -+ virtual QStringList keys() const = 0; -+ virtual QInputContext *create( const QString &key ) = 0; -+ -+private: -+ QInputContextPluginPrivate *d; -+}; -+#endif // QT_NO_TEXTCODECPLUGIN -+#endif // QTEXTCODECPLUGIN_H -diff -urN qt-x11-free-3.3.2/src/input/qt_input.pri qt-x11-immodule-bc/src/input/qt_input.pri ---- qt-x11-free-3.3.2/src/input/qt_input.pri 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/input/qt_input.pri 2004-06-23 01:10:27.061123224 +0900 -@@ -0,0 +1,13 @@ -+# Qt inputcontext module -+ -+input { -+ INPUT_P = input -+ HEADERS +=$$INPUT_H/qinputcontextfactory.h \ -+ $$INPUT_P/qinputcontextinterface_p.h \ -+ $$INPUT_H/qinputcontextplugin.h \ -+ $$INPUT_H/qximinputcontext_p.h -+ SOURCES +=$$INPUT_CPP/qinputcontextfactory.cpp \ -+ $$INPUT_CPP/qinputcontextplugin.cpp \ -+ $$INPUT_CPP/qximinputcontext_x11.cpp -+ -+} -diff -urN qt-x11-free-3.3.2/src/input/qximinputcontext_p.h qt-x11-immodule-bc/src/input/qximinputcontext_p.h ---- qt-x11-free-3.3.2/src/input/qximinputcontext_p.h 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/input/qximinputcontext_p.h 2004-06-23 02:07:02.819889424 +0900 -@@ -0,0 +1,133 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** Definition of QXIMInputContext -+** -+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. -+** -+** This file is part of the kernel module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition -+** licenses may use this file in accordance with the Qt Commercial License -+** Agreement provided with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+#ifndef QXIMINPUTCONTEXT_P_H -+#define QXIMINPUTCONTEXT_P_H -+ -+ -+// -+// W A R N I N G -+// ------------- -+// -+// This file is not part of the Qt API. It exists for the convenience -+// of internal files. This header file may change from version to version -+// without notice, or even be removed. -+// -+// We mean it. -+// -+// -+ -+#if !defined(Q_NO_IM) -+ -+#include "qglobal.h" -+#include <qinputcontext.h> -+#include <qfont.h> -+#include <qcstring.h> -+ -+class QKeyEvent; -+class QWidget; -+class QFont; -+class QString; -+ -+ -+#ifdef Q_WS_X11 -+#include "qarray.h" -+#include "qwindowdefs.h" -+#include <private/qt_x11_p.h> -+#endif -+ -+class QXIMInputContext : public QInputContext -+{ -+public: -+#ifdef Q_WS_X11 -+ QXIMInputContext( QWidget * ); // should be a toplevel widget -+ ~QXIMInputContext(); -+ -+ QString name(); -+ QCString language(); -+ -+ bool x11FilterEvent( QWidget *keywidget, XEvent *event ); -+ void reset(); -+ -+ void setFocus(); -+ void unsetFocus(); -+ void setMicroFocus( int x, int y, int w, int h, QFont *f = 0 ); -+ void mouseHandler( int x, QEvent::Type type, -+ Qt::ButtonState butoon, Qt::ButtonState state ); -+ -+ bool hasFocus() const; -+ bool isComposing() const; -+ void resetClientState(); -+ -+ void sendIMEvent( QEvent::Type type, -+ const QString &text = QString::null, -+ int cursorPosition = -1, int selLength = 0 ); -+ -+ static void init_xim(); -+ static void create_xim(); -+ static void close_xim(); -+ -+ void *ic; -+ QString composingText; -+ QFont font; -+ XFontSet fontset; -+ QMemArray<bool> selectedChars; -+ -+protected: -+ bool isPreeditRelocationEnabled(); -+ virtual bool isPreeditPreservationEnabled(); // not a QInputContext func -+ -+ QCString _language; -+ -+private: -+ void setComposePosition(int, int); -+ void setComposeArea(int, int, int, int); -+ void setXFontSet(const QFont &); -+ -+ int lookupString(XKeyEvent *, QCString &, KeySym *, Status *) const; -+ -+#endif // Q_WS_X11 -+}; -+ -+ -+inline QString QXIMInputContext::name() -+{ -+ return "XIM"; -+} -+ -+ -+#endif //Q_NO_IM -+ -+#endif // QXIMINPUTCONTEXT_P_H -diff -urN qt-x11-free-3.3.2/src/input/qximinputcontext_x11.cpp qt-x11-immodule-bc/src/input/qximinputcontext_x11.cpp ---- qt-x11-free-3.3.2/src/input/qximinputcontext_x11.cpp 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/input/qximinputcontext_x11.cpp 2004-06-23 02:10:35.916493816 +0900 -@@ -0,0 +1,895 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** Implementation of QXIMInputContext class -+** -+** Copyright (C) 2000-2003 Trolltech AS. All rights reserved. -+** -+** This file is part of the kernel module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition -+** licenses for Unix/X11 may use this file in accordance with the Qt Commercial -+** License Agreement provided with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+ -+#include "qximinputcontext_p.h" -+ -+const int XKeyPress = KeyPress; -+const int XKeyRelease = KeyRelease; -+#undef KeyPress -+#undef KeyRelease -+ -+#if !defined(QT_NO_IM) -+ -+#include "qplatformdefs.h" -+ -+#include "qapplication.h" -+#include "qwidget.h" -+#include "qptrlist.h" -+#include "qintdict.h" -+#include "qtextcodec.h" -+#include "qlocale.h" -+ -+#include <stdlib.h> -+#include <limits.h> -+ -+#if !defined(QT_NO_XIM) -+ -+#define XK_MISCELLANY -+#define XK_LATIN1 -+#include <X11/keysymdef.h> -+ -+// #define QT_XIM_DEBUG -+ -+// from qapplication_x11.cpp -+static XIM qt_xim = 0; -+extern XIMStyle qt_xim_style; -+extern XIMStyle xim_preferred_style; -+extern char *ximServer; -+static bool isInitXIM = FALSE; -+static QPtrList<QXIMInputContext> *ximContextList = 0; -+#endif -+extern int composingKeycode; -+extern QTextCodec * input_mapper; -+ -+ -+#if !defined(QT_NO_XIM) -+ -+#if defined(Q_C_CALLBACKS) -+extern "C" { -+#endif // Q_C_CALLBACKS -+ -+ // These static functions should be rewritten as member of -+ // QXIMInputContext -+ -+#ifdef USE_X11R6_XIM -+ static void xim_create_callback(XIM /*im*/, -+ XPointer /*client_data*/, -+ XPointer /*call_data*/) -+ { -+ // qDebug("xim_create_callback"); -+ QXIMInputContext::create_xim(); -+ } -+ -+ static void xim_destroy_callback(XIM /*im*/, -+ XPointer /*client_data*/, -+ XPointer /*call_data*/) -+ { -+ // qDebug("xim_destroy_callback"); -+ QXIMInputContext::close_xim(); -+ Display *dpy = QPaintDevice::x11AppDisplay(); -+ XRegisterIMInstantiateCallback(dpy, 0, 0, 0, -+ (XIMProc) xim_create_callback, 0); -+ } -+ -+#endif // USE_X11R6_XIM -+ -+#if defined(Q_C_CALLBACKS) -+} -+#endif // Q_C_CALLBACKS -+ -+#endif // QT_NO_XIM -+ -+#ifndef QT_NO_XIM -+ -+/* The cache here is needed, as X11 leaks a few kb for every -+ XFreeFontSet call, so we avoid creating and deletion of fontsets as -+ much as possible -+*/ -+static XFontSet fontsetCache[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; -+static int fontsetRefCount = 0; -+ -+static const char * const fontsetnames[] = { -+ "-*-fixed-medium-r-*-*-16-*,-*-*-medium-r-*-*-16-*", -+ "-*-fixed-medium-i-*-*-16-*,-*-*-medium-i-*-*-16-*", -+ "-*-fixed-bold-r-*-*-16-*,-*-*-bold-r-*-*-16-*", -+ "-*-fixed-bold-i-*-*-16-*,-*-*-bold-i-*-*-16-*", -+ "-*-fixed-medium-r-*-*-24-*,-*-*-medium-r-*-*-24-*", -+ "-*-fixed-medium-i-*-*-24-*,-*-*-medium-i-*-*-24-*", -+ "-*-fixed-bold-r-*-*-24-*,-*-*-bold-r-*-*-24-*", -+ "-*-fixed-bold-i-*-*-24-*,-*-*-bold-i-*-*-24-*" -+}; -+ -+static XFontSet getFontSet( const QFont &f ) -+{ -+ int i = 0; -+ if (f.italic()) -+ i |= 1; -+ if (f.bold()) -+ i |= 2; -+ -+ if ( f.pointSize() > 20 ) -+ i += 4; -+ -+ if ( !fontsetCache[i] ) { -+ Display* dpy = QPaintDevice::x11AppDisplay(); -+ int missCount; -+ char** missList; -+ fontsetCache[i] = XCreateFontSet(dpy, fontsetnames[i], &missList, &missCount, 0); -+ if(missCount > 0) -+ XFreeStringList(missList); -+ if ( !fontsetCache[i] ) { -+ fontsetCache[i] = XCreateFontSet(dpy, "-*-fixed-*-*-*-*-16-*", &missList, &missCount, 0); -+ if(missCount > 0) -+ XFreeStringList(missList); -+ if ( !fontsetCache[i] ) -+ fontsetCache[i] = (XFontSet)-1; -+ } -+ } -+ return (fontsetCache[i] == (XFontSet)-1) ? 0 : fontsetCache[i]; -+} -+ -+ -+#ifdef Q_C_CALLBACKS -+extern "C" { -+#endif // Q_C_CALLBACKS -+ -+ static int xic_start_callback(XIC, XPointer client_data, XPointer) { -+ QXIMInputContext *qic = (QXIMInputContext *) client_data; -+ if (! qic) { -+#ifdef QT_XIM_DEBUG -+ qDebug("compose start: no qic"); -+#endif // QT_XIM_DEBUG -+ -+ return 0; -+ } -+ -+ qic->resetClientState(); -+ qic->sendIMEvent( QEvent::IMStart ); -+ -+#ifdef QT_XIM_DEBUG -+ qDebug("compose start"); -+#endif // QT_XIM_DEBUG -+ -+ return 0; -+ } -+ -+ static int xic_draw_callback(XIC, XPointer client_data, XPointer call_data) { -+ QXIMInputContext *qic = (QXIMInputContext *) client_data; -+ if (! qic) { -+#ifdef QT_XIM_DEBUG -+ qDebug("compose event: invalid compose event %p", qic); -+#endif // QT_XIM_DEBUG -+ -+ return 0; -+ } -+ -+ bool send_imstart = FALSE; -+ if( ! qic->isComposing() && qic->hasFocus() ) { -+ qic->resetClientState(); -+ send_imstart = TRUE; -+ } else if ( ! qic->isComposing() || ! qic->hasFocus() ) { -+#ifdef QT_XIM_DEBUG -+ qDebug( "compose event: invalid compose event composing=%d hasFocus=%d", -+ qic->isComposing(), qic->hasFocus() ); -+#endif // QT_XIM_DEBUG -+ -+ return 0; -+ } -+ -+ if ( send_imstart ) -+ qic->sendIMEvent( QEvent::IMStart ); -+ -+ XIMPreeditDrawCallbackStruct *drawstruct = -+ (XIMPreeditDrawCallbackStruct *) call_data; -+ XIMText *text = (XIMText *) drawstruct->text; -+ int cursor = drawstruct->caret, sellen = 0; -+ -+ if ( ! drawstruct->caret && ! drawstruct->chg_first && -+ ! drawstruct->chg_length && ! text ) { -+ if( qic->composingText.isEmpty() ) { -+#ifdef QT_XIM_DEBUG -+ qDebug( "compose emptied" ); -+#endif // QT_XIM_DEBUG -+ // if the composition string has been emptied, we need -+ // to send an IMEnd event -+ qic->sendIMEvent( QEvent::IMEnd ); -+ qic->resetClientState(); -+ // if the commit string has coming after here, IMStart -+ // will be sent dynamically -+ } -+ return 0; -+ } -+ -+ if (text) { -+ char *str = 0; -+ if (text->encoding_is_wchar) { -+ int l = wcstombs(NULL, text->string.wide_char, text->length); -+ if (l != -1) { -+ str = new char[l + 1]; -+ wcstombs(str, text->string.wide_char, l); -+ str[l] = 0; -+ } -+ } else -+ str = text->string.multi_byte; -+ -+ if (! str) -+ return 0; -+ -+ QString s = QString::fromLocal8Bit(str); -+ -+ if (text->encoding_is_wchar) -+ delete [] str; -+ -+ if (drawstruct->chg_length < 0) -+ qic->composingText.replace(drawstruct->chg_first, UINT_MAX, s); -+ else -+ qic->composingText.replace(drawstruct->chg_first, drawstruct->chg_length, s); -+ -+ if ( qic->selectedChars.size() < qic->composingText.length() ) { -+ // expand the selectedChars array if the compose string is longer -+ uint from = qic->selectedChars.size(); -+ qic->selectedChars.resize( qic->composingText.length() ); -+ for ( uint x = from; from < qic->selectedChars.size(); ++x ) -+ qic->selectedChars[x] = 0; -+ } -+ -+ uint x; -+ bool *p = qic->selectedChars.data() + drawstruct->chg_first; -+ // determine if the changed chars are selected based on text->feedback -+ for ( x = 0; x < s.length(); ++x ) -+ *p++ = ( text->feedback ? ( text->feedback[x] & XIMReverse ) : 0 ); -+ -+ // figure out where the selection starts, and how long it is -+ p = qic->selectedChars.data(); -+ bool started = FALSE; -+ for ( x = 0; x < qic->selectedChars.size(); ++x ) { -+ if ( started ) { -+ if ( *p ) ++sellen; -+ else break; -+ } else { -+ if ( *p ) { -+ cursor = x; -+ started = TRUE; -+ sellen = 1; -+ } -+ } -+ ++p; -+ } -+ } else { -+ if (drawstruct->chg_length == 0) -+ drawstruct->chg_length = -1; -+ -+ qic->composingText.remove(drawstruct->chg_first, drawstruct->chg_length); -+ bool qt_compose_emptied = qic->composingText.isEmpty(); -+ if ( qt_compose_emptied ) { -+#ifdef QT_XIM_DEBUG -+ qDebug( "compose emptied" ); -+#endif // QT_XIM_DEBUG -+ // if the composition string has been emptied, we need -+ // to send an IMEnd event -+ qic->sendIMEvent( QEvent::IMEnd ); -+ qic->resetClientState(); -+ // if the commit string has coming after here, IMStart -+ // will be sent dynamically -+ return 0; -+ } -+ } -+ -+ qic->sendIMEvent( QEvent::IMCompose, -+ qic->composingText, cursor, sellen ); -+ -+ return 0; -+ } -+ -+ static int xic_done_callback(XIC, XPointer client_data, XPointer) { -+ QXIMInputContext *qic = (QXIMInputContext *) client_data; -+ if (! qic) -+ return 0; -+ -+ // Don't send IMEnd here. QXIMInputContext::x11FilterEvent() -+ // handles IMEnd with commit string. -+#if 0 -+ if ( qic->isComposing() ) -+ qic->sendIMEvent( QEvent::IMEnd ); -+ qic->resetClientState(); -+#endif -+ -+ return 0; -+ } -+ -+#ifdef Q_C_CALLBACKS -+} -+#endif // Q_C_CALLBACKS -+ -+#endif // !QT_NO_XIM -+ -+ -+ -+QXIMInputContext::QXIMInputContext(QWidget *widget) -+ : QInputContext(), ic(0), fontset(0) -+{ -+ if(!isInitXIM) -+ QXIMInputContext::init_xim(); -+ -+#if !defined(QT_NO_XIM) -+ fontsetRefCount++; -+ if (! qt_xim) { -+ qWarning("QInputContext: no input method context available"); -+ return; -+ } -+ -+ if (! widget->isTopLevel()) { -+ qWarning("QInputContext: cannot create input context for non-toplevel widgets"); -+ return; -+ } -+ -+ XPoint spot; -+ XRectangle rect; -+ XVaNestedList preedit_attr = 0; -+ XIMCallback startcallback, drawcallback, donecallback; -+ -+ font = widget->font(); -+ fontset = getFontSet( font ); -+ -+ if (qt_xim_style & XIMPreeditArea) { -+ rect.x = 0; -+ rect.y = 0; -+ rect.width = widget->width(); -+ rect.height = widget->height(); -+ -+ preedit_attr = XVaCreateNestedList(0, -+ XNArea, &rect, -+ XNFontSet, fontset, -+ (char *) 0); -+ } else if (qt_xim_style & XIMPreeditPosition) { -+ spot.x = 1; -+ spot.y = 1; -+ -+ preedit_attr = XVaCreateNestedList(0, -+ XNSpotLocation, &spot, -+ XNFontSet, fontset, -+ (char *) 0); -+ } else if (qt_xim_style & XIMPreeditCallbacks) { -+ startcallback.client_data = (XPointer) this; -+ startcallback.callback = (XIMProc) xic_start_callback; -+ drawcallback.client_data = (XPointer) this; -+ drawcallback.callback = (XIMProc)xic_draw_callback; -+ donecallback.client_data = (XPointer) this; -+ donecallback.callback = (XIMProc) xic_done_callback; -+ -+ preedit_attr = XVaCreateNestedList(0, -+ XNPreeditStartCallback, &startcallback, -+ XNPreeditDrawCallback, &drawcallback, -+ XNPreeditDoneCallback, &donecallback, -+ (char *) 0); -+ } -+ -+ if (preedit_attr) { -+ ic = XCreateIC(qt_xim, -+ XNInputStyle, qt_xim_style, -+ XNClientWindow, widget->winId(), -+ XNPreeditAttributes, preedit_attr, -+ (char *) 0); -+ XFree(preedit_attr); -+ } else -+ ic = XCreateIC(qt_xim, -+ XNInputStyle, qt_xim_style, -+ XNClientWindow, widget->winId(), -+ (char *) 0); -+ -+ if (! ic) -+ qFatal("Failed to create XIM input context!"); -+ -+ // when resetting the input context, preserve the input state -+ (void) XSetICValues((XIC) ic, XNResetState, XIMPreserveState, (char *) 0); -+ -+ if( ! ximContextList ) -+ ximContextList = new QPtrList<QXIMInputContext>; -+ ximContextList->append( this ); -+#endif // !QT_NO_XIM -+} -+ -+ -+QXIMInputContext::~QXIMInputContext() -+{ -+ -+#if !defined(QT_NO_XIM) -+ if (ic) -+ XDestroyIC((XIC) ic); -+ -+ if ( --fontsetRefCount == 0 ) { -+ Display *dpy = QPaintDevice::x11AppDisplay(); -+ for ( int i = 0; i < 8; i++ ) { -+ if ( fontsetCache[i] && fontsetCache[i] != (XFontSet)-1 ) { -+ XFreeFontSet(dpy, fontsetCache[i]); -+ fontsetCache[i] = 0; -+ } -+ } -+ } -+ -+ if( ximContextList ) { -+ ximContextList->remove( this ); -+ if(ximContextList->isEmpty()) { -+ // Calling XCloseIM gives a Purify FMR error -+ // XCloseIM( qt_xim ); -+ // We prefer a less serious memory leak -+ if( qt_xim ) { -+ qt_xim = 0; -+ isInitXIM = FALSE; -+ } -+ -+ delete ximContextList; -+ ximContextList = 0; -+ } -+ } -+#endif // !QT_NO_XIM -+ -+ ic = 0; -+} -+ -+void QXIMInputContext::init_xim() -+{ -+#ifndef QT_NO_XIM -+ if(!isInitXIM) -+ isInitXIM = TRUE; -+ -+ qt_xim = 0; -+ QString ximServerName(ximServer); -+ if (ximServer) -+ ximServerName.prepend("@im="); -+ else -+ ximServerName = ""; -+ -+ if ( !XSupportsLocale() ) -+ qWarning("Qt: Locales not supported on X server"); -+ -+#ifdef USE_X11R6_XIM -+ else if ( XSetLocaleModifiers (ximServerName.ascii()) == 0 ) -+ qWarning( "Qt: Cannot set locale modifiers: %s", -+ ximServerName.ascii()); -+ else { -+ Display *dpy = QPaintDevice::x11AppDisplay(); -+ XRegisterIMInstantiateCallback(dpy, 0, 0, 0, -+ (XIMProc) xim_create_callback, 0); -+ } -+#else // !USE_X11R6_XIM -+ else if ( XSetLocaleModifiers ("") == 0 ) -+ qWarning("Qt: Cannot set locale modifiers"); -+ else -+ QXIMInputContext::create_xim(); -+#endif // USE_X11R6_XIM -+#endif // QT_NO_XIM -+} -+ -+ -+/*! \internal -+ Creates the application input method. -+ */ -+void QXIMInputContext::create_xim() -+{ -+#ifndef QT_NO_XIM -+ Display *appDpy = QPaintDevice::x11AppDisplay(); -+ qt_xim = XOpenIM( appDpy, 0, 0, 0 ); -+ if ( qt_xim ) { -+ -+#ifdef USE_X11R6_XIM -+ XIMCallback destroy; -+ destroy.callback = (XIMProc) xim_destroy_callback; -+ destroy.client_data = 0; -+ if ( XSetIMValues( qt_xim, XNDestroyCallback, &destroy, (char *) 0 ) != 0 ) -+ qWarning( "Xlib doesn't support destroy callback"); -+#endif // USE_X11R6_XIM -+ -+ XIMStyles *styles = 0; -+ XGetIMValues(qt_xim, XNQueryInputStyle, &styles, (char *) 0, (char *) 0); -+ if ( styles ) { -+ int i; -+ for ( i = 0; !qt_xim_style && i < styles->count_styles; i++ ) { -+ if ( styles->supported_styles[i] == xim_preferred_style ) { -+ qt_xim_style = xim_preferred_style; -+ break; -+ } -+ } -+ // if the preferred input style couldn't be found, look for -+ // Nothing -+ for ( i = 0; !qt_xim_style && i < styles->count_styles; i++ ) { -+ if ( styles->supported_styles[i] == (XIMPreeditNothing | -+ XIMStatusNothing) ) { -+ qt_xim_style = XIMPreeditNothing | XIMStatusNothing; -+ break; -+ } -+ } -+ // ... and failing that, None. -+ for ( i = 0; !qt_xim_style && i < styles->count_styles; i++ ) { -+ if ( styles->supported_styles[i] == (XIMPreeditNone | -+ XIMStatusNone) ) { -+ qt_xim_style = XIMPreeditNone | XIMStatusNone; -+ break; -+ } -+ } -+ -+ // qDebug("QApplication: using im style %lx", qt_xim_style); -+ XFree( (char *)styles ); -+ } -+ -+ if ( qt_xim_style ) { -+ -+#ifdef USE_X11R6_XIM -+ XUnregisterIMInstantiateCallback(appDpy, 0, 0, 0, -+ (XIMProc) xim_create_callback, 0); -+#endif // USE_X11R6_XIM -+ -+ } else { -+ // Give up -+ qWarning( "No supported input style found." -+ " See InputMethod documentation."); -+ QXIMInputContext::close_xim(); -+ } -+ } -+#endif // QT_NO_XIM -+} -+ -+ -+/*! \internal -+ Closes the application input method. -+*/ -+void QXIMInputContext::close_xim() -+{ -+#ifndef QT_NO_XIM -+ QApplication::close_xim(); -+#endif // QT_NO_XIM -+} -+ -+ -+bool QXIMInputContext::x11FilterEvent( QWidget *keywidget, XEvent *event ) -+{ -+#ifndef QT_NO_XIM -+ int xkey_keycode = event->xkey.keycode; -+ if ( XFilterEvent( event, keywidget->topLevelWidget()->winId() ) ) { -+ composingKeycode = xkey_keycode; // ### not documented in xlib -+ -+ // Cancel of the composition is realizable even if -+ // follwing codes don't exist -+#if 0 -+ if ( event->type != XKeyPress || ! (qt_xim_style & XIMPreeditCallbacks) ) -+ return TRUE; -+ -+ /* -+ * The Solaris htt input method will transform a ClientMessage -+ * event into a filtered KeyPress event, in which case our -+ * keywidget is still zero. -+ */ -+ QETWidget *widget = (QETWidget*)QWidget::find( (WId)event->xany.window ); -+ if ( ! keywidget ) { -+ keywidget = (QETWidget*)QWidget::keyboardGrabber(); -+ if ( keywidget ) { -+ grabbed = TRUE; -+ } else { -+ if ( focus_widget ) -+ keywidget = (QETWidget*)focus_widget; -+ if ( !keywidget ) { -+ if ( qApp->inPopupMode() ) // no focus widget, see if we have a popup -+ keywidget = (QETWidget*) qApp->activePopupWidget(); -+ else if ( widget ) -+ keywidget = (QETWidget*)widget->topLevelWidget(); -+ } -+ } -+ } -+ -+ /* -+ if the composition string has been emptied, we need to send -+ an IMEnd event. however, we have no way to tell if the user -+ has cancelled input, or if the user has accepted the -+ composition. -+ -+ so, we have to look for the next keypress and see if it is -+ the 'commit' key press (keycode == 0). if it is, we deliver -+ an IMEnd event with the final text, otherwise we deliver an -+ IMEnd with empty text (meaning the user has cancelled the -+ input). -+ */ -+ if ( composing && focusWidget && qt_compose_emptied ) { -+ XEvent event2; -+ bool found = FALSE; -+ if ( XCheckTypedEvent( QPaintDevice::x11AppDisplay(), -+ XKeyPress, &event2 ) ) { -+ if ( event2.xkey.keycode == 0 ) { -+ // found a key event with the 'commit' string -+ found = TRUE; -+ XPutBackEvent( QPaintDevice::x11AppDisplay(), &event2 ); -+ } -+ } -+ -+ if ( !found ) { -+ // no key event, so the user must have cancelled the composition -+ QIMEvent endevent( QEvent::IMEnd, QString::null, -1 ); -+ QApplication::sendEvent( focusWidget, &endevent ); -+ -+ focusWidget = 0; -+ } -+ -+ qt_compose_emptied = FALSE; -+ } -+#endif -+ return TRUE; -+ } else if ( focusWidget() ) { -+ if ( event->type == XKeyPress && event->xkey.keycode == 0 ) { -+ // input method has sent us a commit string -+ QCString data(513); -+ KeySym sym; // unused -+ Status status; // unused -+ QString inputText; -+ int count = lookupString( &(event->xkey), data, &sym, &status ); -+ if ( count > 0 ) -+ inputText = input_mapper->toUnicode( data, count ); -+ -+ if ( ! ( qt_xim_style & XIMPreeditCallbacks ) || ! isComposing() ) { -+ // there is no composing state -+ sendIMEvent( QEvent::IMStart ); -+ } -+ -+ sendIMEvent( QEvent::IMEnd, inputText ); -+ resetClientState(); -+ -+ return TRUE; -+ } -+ } -+#endif // !QT_NO_XIM -+ -+ return FALSE; -+} -+ -+ -+void QXIMInputContext::sendIMEvent( QEvent::Type type, const QString &text, -+ int cursorPosition, int selLength ) -+{ -+ QInputContext::sendIMEvent( type, text, cursorPosition, selLength ); -+ if ( type == QEvent::IMCompose ) -+ composingText = text; -+} -+ -+ -+void QXIMInputContext::reset() -+{ -+#if !defined(QT_NO_XIM) -+ if ( focusWidget() && isComposing() && ! composingText.isNull() ) { -+#ifdef QT_XIM_DEBUG -+ qDebug("QXIMInputContext::reset: composing - sending IMEnd (empty) to %p", -+ focusWidget() ); -+#endif // QT_XIM_DEBUG -+ -+ QInputContext::reset(); -+ resetClientState(); -+ -+ char *mb = XmbResetIC((XIC) ic); -+ if (mb) -+ XFree(mb); -+ } -+#endif // !QT_NO_XIM -+} -+ -+ -+void QXIMInputContext::resetClientState() -+{ -+#if !defined(QT_NO_XIM) -+ composingText = QString::null; -+ if ( selectedChars.size() < 128 ) -+ selectedChars.resize( 128 ); -+ selectedChars.fill( 0 ); -+#endif // !QT_NO_XIM -+} -+ -+ -+bool QXIMInputContext::hasFocus() const -+{ -+ return ( focusWidget() != 0 ); -+} -+ -+ -+// to break access permission -+bool QXIMInputContext::isComposing() const -+{ -+ return QInputContext::isComposing(); -+} -+ -+void QXIMInputContext::setMicroFocus(int x, int y, int w, int h, QFont *f) -+{ -+ QWidget *widget = focusWidget(); -+ if ( qt_xim && widget ) { -+ QPoint p( x, y ); -+ QPoint p2 = widget->mapTo( widget->topLevelWidget(), QPoint( 0, 0 ) ); -+ p = widget->topLevelWidget()->mapFromGlobal( p ); -+ setXFontSet( f ? *f : widget->font() ); -+ setComposePosition(p.x(), p.y() + h); -+ setComposeArea(p2.x(), p2.y(), widget->width(), widget->height()); -+ } -+ -+} -+ -+void QXIMInputContext::mouseHandler( int x, QEvent::Type type, -+ Qt::ButtonState button, -+ Qt::ButtonState state ) -+{ -+ if ( type == QEvent::MouseButtonPress || -+ type == QEvent::MouseButtonDblClick ) { -+ // Don't reset Japanese input context here. Japanese input -+ // context sometimes contains a whole paragraph and has -+ // minutes of lifetime different to ephemeral one in other -+ // languages. The input context should be survived until -+ // focused again. -+ if ( ! isPreeditPreservationEnabled() ) -+ reset(); -+ } -+} -+ -+void QXIMInputContext::setComposePosition(int x, int y) -+{ -+#if !defined(QT_NO_XIM) -+ if (qt_xim && ic) { -+ XPoint point; -+ point.x = x; -+ point.y = y; -+ -+ XVaNestedList preedit_attr = -+ XVaCreateNestedList(0, -+ XNSpotLocation, &point, -+ -+ (char *) 0); -+ XSetICValues((XIC) ic, XNPreeditAttributes, preedit_attr, (char *) 0); -+ XFree(preedit_attr); -+ } -+#endif // !QT_NO_XIM -+} -+ -+ -+void QXIMInputContext::setComposeArea(int x, int y, int w, int h) -+{ -+#if !defined(QT_NO_XIM) -+ if (qt_xim && ic) { -+ XRectangle rect; -+ rect.x = x; -+ rect.y = y; -+ rect.width = w; -+ rect.height = h; -+ -+ XVaNestedList preedit_attr = XVaCreateNestedList(0, -+ XNArea, &rect, -+ -+ (char *) 0); -+ XSetICValues((XIC) ic, XNPreeditAttributes, preedit_attr, (char *) 0); -+ XFree(preedit_attr); -+ } -+#endif -+} -+ -+ -+void QXIMInputContext::setXFontSet(const QFont &f) -+{ -+#if !defined(QT_NO_XIM) -+ if (font == f) return; // nothing to do -+ font = f; -+ -+ XFontSet fs = getFontSet(font); -+ if (fontset == fs) return; // nothing to do -+ fontset = fs; -+ -+ XVaNestedList preedit_attr = XVaCreateNestedList(0, XNFontSet, fontset, (char *) 0); -+ XSetICValues((XIC) ic, XNPreeditAttributes, preedit_attr, (char *) 0); -+ XFree(preedit_attr); -+#else -+ Q_UNUSED( f ); -+#endif -+} -+ -+ -+int QXIMInputContext::lookupString(XKeyEvent *event, QCString &chars, -+ KeySym *key, Status *status) const -+{ -+ int count = 0; -+ -+#if !defined(QT_NO_XIM) -+ if (qt_xim && ic) { -+ count = XmbLookupString((XIC) ic, event, chars.data(), -+ chars.size(), key, status); -+ -+ if ((*status) == XBufferOverflow ) { -+ chars.resize(count + 1); -+ count = XmbLookupString((XIC) ic, event, chars.data(), -+ chars.size(), key, status); -+ } -+ } -+ -+#endif // QT_NO_XIM -+ -+ return count; -+} -+ -+void QXIMInputContext::setFocus() -+{ -+#if !defined(QT_NO_XIM) -+ if ( qt_xim && ic ) -+ XSetICFocus((XIC) ic); -+#endif // !QT_NO_XIM -+} -+ -+void QXIMInputContext::unsetFocus() -+{ -+#if !defined(QT_NO_XIM) -+ if (qt_xim && ic) -+ XUnsetICFocus((XIC) ic); -+#endif // !QT_NO_XIM -+ -+ // Don't reset Japanese input context here. Japanese input context -+ // sometimes contains a whole paragraph and has minutes of -+ // lifetime different to ephemeral one in other languages. The -+ // input context should be survived until focused again. -+ if ( ! isPreeditPreservationEnabled() ) -+ reset(); -+} -+ -+ -+bool QXIMInputContext::isPreeditRelocationEnabled() -+{ -+ return ( language() == "ja" ); -+} -+ -+ -+bool QXIMInputContext::isPreeditPreservationEnabled() -+{ -+ return ( language() == "ja" ); -+} -+ -+ -+QCString QXIMInputContext::language() -+{ -+#if !defined(QT_NO_XIM) -+ if ( qt_xim ) { -+ QLocale locale = QLocale( XLocaleOfIM( qt_xim ) ); -+ -+ if ( locale.language() == QLocale::Chinese ) { -+ // Chinese language should be formed as "zh_CN", "zh_TW", "zh_HK" -+ _language = locale.name(); -+ } else { -+ // other languages should be two-letter ISO 639 language code -+ _language = locale.name().left( 2 ); -+ } -+ } -+#endif -+ return _language; -+} -+ -+#endif //QT_NO_IM -+ -diff -urN qt-x11-free-3.3.2/src/kernel/qapplication.cpp qt-x11-immodule-bc/src/kernel/qapplication.cpp ---- qt-x11-free-3.3.2/src/kernel/qapplication.cpp 2004-04-19 18:36:11.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qapplication.cpp 2004-06-23 01:10:27.065122616 +0900 -@@ -3498,6 +3498,7 @@ - #ifdef Q_WS_WIN - QInputContext::accept( tmp ); - #endif -+ tmp->unfocusInputContext(); - QApplication::sendSpontaneousEvent( tmp, &out ); - } else if ( active_window ) { - QWidget *w = active_window->focusWidget(); -diff -urN qt-x11-free-3.3.2/src/kernel/qapplication_x11.cpp qt-x11-immodule-bc/src/kernel/qapplication_x11.cpp ---- qt-x11-free-3.3.2/src/kernel/qapplication_x11.cpp 2004-04-19 18:36:02.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qapplication_x11.cpp 2004-06-23 01:10:27.069122008 +0900 -@@ -89,7 +89,10 @@ - #include "qfileinfo.h" - - // Input method stuff - UNFINISHED --#include "qinputcontext_p.h" -+#ifndef QT_NO_IM -+class QInputContext; -+#include "qinputcontext.h" -+#endif // QT_NO_IM - #include "qinternal_p.h" // shared double buffer cleanup - - #if defined(QT_THREAD_SUPPORT) -@@ -189,10 +192,9 @@ - static const char *mwGeometry = 0; // main widget geometry - static const char *mwTitle = 0; // main widget title - //Ming-Che 10/10 --static char *ximServer = 0; // XIM Server will connect to -+char *ximServer = 0; // XIM Server will connect to - static bool mwIconic = FALSE; // main widget iconified - //Ming-Che 10/10 --static bool noxim = FALSE; // connect to xim or not - static Display *appDpy = 0; // X11 application display - static char *appDpyName = 0; // X11 display name - static bool appForeignDpy = FALSE; // we didn't create display -@@ -386,15 +388,18 @@ - - - -+#if !defined(QT_NO_IM) -+QString defaultIM = "XIM"; // default input method's name -+#endif - #if !defined(QT_NO_XIM) --XIM qt_xim = 0; -+//XIM qt_xim = 0; - XIMStyle qt_xim_style = 0; -+XIMStyle xim_preferred_style = 0; - static XIMStyle xim_default_style = XIMPreeditCallbacks | XIMStatusNothing; --static XIMStyle xim_preferred_style = 0; - #endif - --static int composingKeycode=0; --static QTextCodec * input_mapper = 0; -+int composingKeycode=0; -+QTextCodec * input_mapper = 0; - - Q_EXPORT Time qt_x_time = CurrentTime; - Q_EXPORT Time qt_x_user_time = CurrentTime; -@@ -503,8 +508,7 @@ - void setWFlags( WFlags f ) { QWidget::setWFlags(f); } - void clearWFlags( WFlags f ) { QWidget::clearWFlags(f); } - bool translateMouseEvent( const XEvent * ); -- bool translateKeyEventInternal( const XEvent *, int& count, QString& text, int& state, char& ascii, int &code, -- QEvent::Type &type, bool willRepeat=FALSE ); -+ bool translateKeyEventInternal( const XEvent *, int& count, QString& text, int& state, char& ascii, int &code, QEvent::Type &type, bool willRepeat=FALSE, bool statefulTranslation=TRUE ); - bool translateKeyEvent( const XEvent *, bool grab ); - bool translatePaintEvent( const XEvent * ); - bool translateConfigEvent( const XEvent * ); -@@ -521,115 +525,27 @@ - - - // ************************************************************************ --// X Input Method support -+// Input Method support - // ************************************************************************ - --#if !defined(QT_NO_XIM) -- --#if defined(Q_C_CALLBACKS) --extern "C" { --#endif // Q_C_CALLBACKS -- --#ifdef USE_X11R6_XIM -- static void xim_create_callback(XIM /*im*/, -- XPointer /*client_data*/, -- XPointer /*call_data*/) -- { -- // qDebug("xim_create_callback"); -- QApplication::create_xim(); -- } -- -- static void xim_destroy_callback(XIM /*im*/, -- XPointer /*client_data*/, -- XPointer /*call_data*/) -- { -- // qDebug("xim_destroy_callback"); -- QApplication::close_xim(); -- XRegisterIMInstantiateCallback(appDpy, 0, 0, 0, -- (XIMProc) xim_create_callback, 0); -- } -- --#endif // USE_X11R6_XIM -- --#if defined(Q_C_CALLBACKS) --} --#endif // Q_C_CALLBACKS -- --#endif // QT_NO_XIM -- -- - /*! \internal -- Creates the application input method. -- */ -+ Creates the application input method. -+*/ - void QApplication::create_xim() - { - #ifndef QT_NO_XIM -- qt_xim = XOpenIM( appDpy, 0, 0, 0 ); -- if ( qt_xim ) { -- --#ifdef USE_X11R6_XIM -- XIMCallback destroy; -- destroy.callback = (XIMProc) xim_destroy_callback; -- destroy.client_data = 0; -- if ( XSetIMValues( qt_xim, XNDestroyCallback, &destroy, (char *) 0 ) != 0 ) -- qWarning( "Xlib dosn't support destroy callback"); --#endif // USE_X11R6_XIM -- -- XIMStyles *styles = 0; -- XGetIMValues(qt_xim, XNQueryInputStyle, &styles, (char *) 0, (char *) 0); -- if ( styles ) { -- int i; -- for ( i = 0; !qt_xim_style && i < styles->count_styles; i++ ) { -- if ( styles->supported_styles[i] == xim_preferred_style ) { -- qt_xim_style = xim_preferred_style; -- break; -- } -- } -- // if the preferred input style couldn't be found, look for -- // Nothing -- for ( i = 0; !qt_xim_style && i < styles->count_styles; i++ ) { -- if ( styles->supported_styles[i] == (XIMPreeditNothing | -- XIMStatusNothing) ) { -- qt_xim_style = XIMPreeditNothing | XIMStatusNothing; -- break; -- } -- } -- // ... and failing that, None. -- for ( i = 0; !qt_xim_style && i < styles->count_styles; i++ ) { -- if ( styles->supported_styles[i] == (XIMPreeditNone | -- XIMStatusNone) ) { -- qt_xim_style = XIMPreeditNone | XIMStatusNone; -- break; -- } -- } -- -- // qDebug("QApplication: using im style %lx", qt_xim_style); -- XFree( (char *)styles ); -- } -- -- if ( qt_xim_style ) { -+ if ( ! xim_preferred_style ) // no configured input style, use the default -+ xim_preferred_style = xim_default_style; -+#endif // QT_NO_XIM - --#ifdef USE_X11R6_XIM -- XUnregisterIMInstantiateCallback(appDpy, 0, 0, 0, -- (XIMProc) xim_create_callback, 0); --#endif // USE_X11R6_XIM -- -- QWidgetList *list= qApp->topLevelWidgets(); -- QWidgetListIt it(*list); -- QWidget * w; -- while( (w=it.current()) != 0 ) { -- ++it; -- w->createTLSysExtra(); -- } -- delete list; -- } else { -- // Give up -- qWarning( "No supported input style found." -- " See InputMethod documentation."); -- close_xim(); -- } -+ QWidgetList *list= qApp->topLevelWidgets(); -+ QWidgetListIt it(*list); -+ QWidget * w; -+ while( (w=it.current()) != 0 ) { -+ ++it; -+ w->createTLSysExtra(); - } --#endif // QT_NO_XIM -+ delete list; - } - - -@@ -643,7 +559,10 @@ - // XCloseIM( qt_xim ); - // We prefer a less serious memory leak - -- qt_xim = 0; -+ // if ( qt_xim ) -+ // qt_xim = 0; -+ -+#endif // QT_NO_XIM - QWidgetList *list = qApp->topLevelWidgets(); - QWidgetListIt it(*list); - while(it.current()) { -@@ -651,7 +570,6 @@ - ++it; - } - delete list; --#endif // QT_NO_XIM - } - - -@@ -1033,6 +951,13 @@ - xim_preferred_style = XIMPreeditArea | XIMStatusArea; - else if ( ximInputStyle == "root" ) - xim_preferred_style = XIMPreeditNothing | XIMStatusNothing; -+ -+ /* -+ The name of InputMethod set up as a default is acquired from -+ a configuration file. However, If not set up, "XIM" become -+ the name of default InputMethod. -+ */ -+ defaultIM = settings.readEntry( "/qt/DefaultInputMethod", QObject::trUtf8( "XIM" ) ); - #endif - - if (update_timestamp) { -@@ -1500,6 +1425,7 @@ - - #define XK_MISCELLANY - #define XK_LATIN1 -+#define XK_KOREAN - #include <X11/keysymdef.h> - - // ### This should be static but it isn't because of the friend declaration -@@ -1586,9 +1512,6 @@ - } else if ( arg == "-im" ) { - if ( ++i < argc ) - ximServer = argv[i]; -- } else if ( arg == "-noxim" ) { -- noxim=TRUE; -- // - } else if ( arg == "-iconic" ) { - mwIconic = !mwIconic; - } else if ( arg == "-ncols" ) { // xv and netscape use this name -@@ -2065,34 +1988,9 @@ - - qt_set_x11_resources( appFont, appFGCol, appBGCol, appBTNCol); - --#ifndef QT_NO_XIM -- if ( ! xim_preferred_style ) // no configured input style, use the default -- xim_preferred_style = xim_default_style; -- -- qt_xim = 0; -- QString ximServerName(ximServer); -- if (ximServer) -- ximServerName.prepend("@im="); -- else -- ximServerName = ""; -- -- if ( !XSupportsLocale() ) -- qWarning("Qt: Locales not supported on X server"); -- --#ifdef USE_X11R6_XIM -- else if ( XSetLocaleModifiers (ximServerName.ascii()) == 0 ) -- qWarning( "Qt: Cannot set locale modifiers: %s", -- ximServerName.ascii()); -- else if (! noxim) -- XRegisterIMInstantiateCallback(appDpy, 0, 0, 0, -- (XIMProc) xim_create_callback, 0); --#else // !USE_X11R6_XIM -- else if ( XSetLocaleModifiers ("") == 0 ) -- qWarning("Qt: Cannot set locale modifiers"); -- else if (! noxim) -- QApplication::create_xim(); --#endif // USE_X11R6_XIM --#endif // QT_NO_XIM -+#if !defined(QT_NO_IM) -+ QApplication::create_xim(); -+#endif - - #if defined (QT_TABLET_SUPPORT) - int ndev, -@@ -2341,9 +2239,8 @@ - XCloseDevice( appDpy, devEraser ); - #endif - --#if !defined(QT_NO_XIM) -- if ( qt_xim ) -- QApplication::close_xim(); -+#if !defined(QT_NO_IM) -+ QApplication::close_xim(); - #endif - - if ( qt_is_gui_used ) { -@@ -3198,77 +3095,45 @@ - } - } - -- int xkey_keycode = event->xkey.keycode; -- if ( XFilterEvent( event, -- keywidget ? keywidget->topLevelWidget()->winId() : None ) ) { -- if ( keywidget ) -- composingKeycode = xkey_keycode; // ### not documented in xlib -- --#ifndef QT_NO_XIM -- if ( event->type != XKeyPress || ! (qt_xim_style & XIMPreeditCallbacks) ) -- return 1; -- -- /* -- * The Solaris htt input method will transform a ClientMessage -- * event into a filtered KeyPress event, in which case our -- * keywidget is still zero. -- */ -- if ( ! keywidget ) { -- keywidget = (QETWidget*)QWidget::keyboardGrabber(); -- if ( keywidget ) { -- grabbed = TRUE; -- } else { -- if ( focus_widget ) -- keywidget = (QETWidget*)focus_widget; -- if ( !keywidget ) { -- if ( inPopupMode() ) // no focus widget, see if we have a popup -- keywidget = (QETWidget*) activePopupWidget(); -- else if ( widget ) -- keywidget = (QETWidget*)widget->topLevelWidget(); -- } -- } -- } -+#ifndef QT_NO_IM -+ if( keywidget && keywidget->isEnabled() && keywidget->isInputMethodEnabled() ) { -+ if( ( event->type==XKeyPress || event->type==XKeyRelease ) && -+ sm_blockUserInput ) // block user interaction during session management -+ return TRUE; - -- /* -- if the composition string has been emptied, we need to send -- an IMEnd event. however, we have no way to tell if the user -- has cancelled input, or if the user has accepted the -- composition. -- -- so, we have to look for the next keypress and see if it is -- the 'commit' key press (keycode == 0). if it is, we deliver -- an IMEnd event with the final text, otherwise we deliver an -- IMEnd with empty text (meaning the user has cancelled the -- input). -- */ - QInputContext *qic = -- (QInputContext *) keywidget->topLevelWidget()->topData()->xic; -- extern bool qt_compose_emptied; // qinputcontext_x11.cpp -- if ( qic && qic->composing && qic->focusWidget && qt_compose_emptied ) { -- XEvent event2; -- bool found = FALSE; -- if ( XCheckTypedEvent( QPaintDevice::x11AppDisplay(), -- XKeyPress, &event2 ) ) { -- if ( event2.xkey.keycode == 0 ) { -- // found a key event with the 'commit' string -- found = TRUE; -- XPutBackEvent( QPaintDevice::x11AppDisplay(), &event2 ); -- } -- } -+ (QInputContext *) keywidget->topLevelWidget()->topData()->xic; -+ if( qic && qic->x11FilterEvent( keywidget, event ) ) -+ return TRUE; - -- if ( !found ) { -- // no key event, so the user must have cancelled the composition -- QIMEvent endevent( QEvent::IMEnd, QString::null, -1 ); -- QApplication::sendEvent( qic->focusWidget, &endevent ); -+ // filterEvent() accepts QEvent *event rather than preexpanded -+ // key event values. This is intended to pass other IM-related -+ // events in future. The IM-related events are supposed as -+ // QWheelEvent, QTabletEvent and so on. Other non IM-related -+ // events should not be forwarded to input contexts to prevent -+ // weird event handling. -+ if ( ( event->type == XKeyPress || event->type == XKeyRelease ) ) { -+ int code = -1; -+ int count = 0; -+ int state; -+ char ascii = 0; -+ QEvent::Type type; -+ QString text; -+ -+ keywidget->translateKeyEventInternal( event, count, text, -+ state, ascii, code, type, -+ FALSE, FALSE ); - -- qic->focusWidget = 0; -- } -+ QKeyEvent keyevent( type, code, ascii, state, text, FALSE, count ); - -- qt_compose_emptied = FALSE; -+ if( qic && qic->filterEvent( &keyevent ) ) -+ return TRUE; - } --#endif // QT_NO_XIM -- -- return 1; -+ } else -+#endif // QT_NO_IM -+ { -+ if ( XFilterEvent( event, None ) ) -+ return TRUE; - } - - if ( qt_x11EventFilter(event) ) // send through app filter -@@ -3419,34 +3284,8 @@ - case XKeyRelease: - { - if ( keywidget && keywidget->isEnabled() ) { // should always exist --#ifndef QT_NO_XIM -- QInputContext *qic = -- (QInputContext *) keywidget->topLevelWidget()->topData()->xic; -- -- if ((qt_xim_style & XIMPreeditCallbacks) && event->xkey.keycode == 0 && -- qic && qic->composing && qic->focusWidget) { -- // input method has sent us a commit string -- QCString data(513); -- KeySym sym; // unused -- Status status; // unused -- QString text; -- int count = qic->lookupString( &(event->xkey), data, -- &sym, &status ); -- if ( count > 0 ) -- text = input_mapper->toUnicode( data, count ); -- -- // qDebug( "sending IMEnd with %d chars", text.length() ); -- QIMEvent endevent( QEvent::IMEnd, text, -1 ); -- QApplication::sendEvent( qic->focusWidget, &endevent ); -- -- qic->focusWidget = 0; -- qic->text = QString::null; -- } else --#endif // !QT_NO_XIM -- { -- // qDebug( "sending key event" ); -- keywidget->translateKeyEvent( event, grabbed ); -- } -+ // qDebug( "sending key event" ); -+ keywidget->translateKeyEvent( event, grabbed ); - } - break; - } -@@ -4733,6 +4572,61 @@ - XK_Help, Qt::Key_Help, - 0x1000FF74, Qt::Key_BackTab, // hardcoded HP backtab - -+ // International input method support keys -+ -+ // International & multi-key character composition -+ XK_Multi_key, Qt::Key_Multi_key, -+ XK_Codeinput, Qt::Key_Codeinput, -+ XK_SingleCandidate, Qt::Key_SingleCandidate, -+ XK_MultipleCandidate, Qt::Key_MultipleCandidate, -+ XK_PreviousCandidate, Qt::Key_PreviousCandidate, -+ -+ // Misc Functions -+ XK_Mode_switch, Qt::Key_Mode_switch, -+ //XK_script_switch, Qt::Key_script_switch, -+ -+ // Japanese keyboard support -+ XK_Kanji, Qt::Key_Kanji, -+ XK_Muhenkan, Qt::Key_Muhenkan, -+ //XK_Henkan_Mode, Qt::Key_Henkan_Mode, -+ XK_Henkan, Qt::Key_Henkan, -+ XK_Romaji, Qt::Key_Romaji, -+ XK_Hiragana, Qt::Key_Hiragana, -+ XK_Katakana, Qt::Key_Katakana, -+ XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana, -+ XK_Zenkaku, Qt::Key_Zenkaku, -+ XK_Hankaku, Qt::Key_Hankaku, -+ XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku, -+ XK_Touroku, Qt::Key_Touroku, -+ XK_Massyo, Qt::Key_Massyo, -+ XK_Kana_Lock, Qt::Key_Kana_Lock, -+ XK_Kana_Shift, Qt::Key_Kana_Shift, -+ XK_Eisu_Shift, Qt::Key_Eisu_Shift, -+ XK_Eisu_toggle, Qt::Key_Eisu_toggle, -+ //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou, -+ //XK_Zen_Koho, Qt::Key_Zen_Koho, -+ //XK_Mae_Koho, Qt::Key_Mae_Koho, -+ -+#ifdef XK_KOREAN -+ // Korean support -+ XK_Hangul, Qt::Key_Hangul, -+ XK_Hangul_Start, Qt::Key_Hangul_Start, -+ XK_Hangul_End, Qt::Key_Hangul_End, -+ XK_Hangul_Hanja, Qt::Key_Hangul_Hanja, -+ XK_Hangul_Jamo, Qt::Key_Hangul_Jamo, -+ XK_Hangul_Romaja, Qt::Key_Hangul_Romaja, -+ XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput, -+ XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja, -+ XK_Hangul_Banja, Qt::Key_Hangul_Banja, -+ XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja, -+ XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja, -+ XK_Hangul_SingleCandidate, Qt::Key_Hangul_SingleCandidate, -+ XK_Hangul_MultipleCandidate, Qt::Key_Hangul_MultipleCandidate, -+ XK_Hangul_PreviousCandidate, Qt::Key_Hangul_PreviousCandidate, -+ XK_Hangul_Special, Qt::Key_Hangul_Special, -+ //XK_Hangul_switch, Qt::Key_Hangul_switch, -+#endif // XK_KOREAN -+ - // Special multimedia keys - // currently only tested with MS internet keyboard - -@@ -4950,7 +4844,7 @@ - bool QETWidget::translateKeyEventInternal( const XEvent *event, int& count, - QString& text, - int& state, -- char& ascii, int& code, QEvent::Type &type, bool willRepeat ) -+ char& ascii, int& code, QEvent::Type &type, bool willRepeat, bool statefulTranslation ) - { - QTextCodec *mapper = input_mapper; - // some XmbLookupString implementations don't return buffer overflow correctly, -@@ -4999,6 +4893,11 @@ - - if ( type == QEvent::KeyPress ) { - bool mb=FALSE; -+ // commit string handling is done by -+ // QXIMInputContext::x11FilterEvent() and are passed to -+ // widgets via QIMEvent regardless of XIM style, so the -+ // following code is commented out. -+#if 0 - if ( qt_xim ) { - QTLWExtra* xd = tlw->topData(); - QInputContext *qic = (QInputContext *) xd->xic; -@@ -5007,6 +4906,7 @@ - count = qic->lookupString(&xkeyevent, chars, &key, &status); - } - } -+#endif - if ( !mb ) { - count = XLookupString( &xkeyevent, - chars.data(), chars.size(), &key, 0 ); -@@ -5090,7 +4990,7 @@ - state = translateButtonState( keystate ); - - static int directionKeyEvent = 0; -- if ( qt_use_rtl_extensions && type == QEvent::KeyRelease ) { -+ if ( qt_use_rtl_extensions && type == QEvent::KeyRelease && statefulTranslation ) { - if (directionKeyEvent == Key_Direction_R || directionKeyEvent == Key_Direction_L ) { - type = QEvent::KeyPress; - code = directionKeyEvent; -@@ -5108,7 +5008,7 @@ - // (to figure out whether the Ctrl modifier is held while Shift is pressed, - // or Shift is held while Ctrl is pressed) since the 'state' doesn't tell - // us whether the modifier held is Left or Right. -- if (qt_use_rtl_extensions && type == QEvent::KeyPress) -+ if ( qt_use_rtl_extensions && type == QEvent::KeyPress && statefulTranslation ) - if (key == XK_Control_L || key == XK_Control_R || key == XK_Shift_L || key == XK_Shift_R) { - if (!directionKeyEvent) - directionKeyEvent = key; -@@ -5176,7 +5076,7 @@ - chars[0] = 0; - } - -- if ( qt_use_rtl_extensions && type == QEvent::KeyPress ) { -+ if ( qt_use_rtl_extensions && type == QEvent::KeyPress && statefulTranslation ) { - if ( directionKeyEvent ) { - if ( key == XK_Shift_L && directionKeyEvent == XK_Control_L || - key == XK_Control_L && directionKeyEvent == XK_Shift_L ) { -@@ -5330,8 +5230,18 @@ - translateKeyEventInternal( event, count, text, state, ascii, code, type ); - } - -+#ifndef QT_NO_IM -+ QInputContext *qic = -+ (QInputContext *) topLevelWidget()->topData()->xic; -+#endif -+ - // compress keys - if ( !text.isEmpty() && testWState(WState_CompressKeys) && -+#ifndef QT_NO_IM -+ // input methods need discrete key events -+ // TODO: describe design decision -+ ! qic && -+#endif // QT_NO_IM - // do not compress keys if the key event we just got above matches - // one of the key ranges used to compute stopCompression - ! ( ( code >= Key_Escape && code <= Key_SysReq ) || -@@ -5419,7 +5329,13 @@ - - // autorepeat compression makes sense for all widgets (Windows - // does it automatically .... ) -- if ( event->type == XKeyPress && text.length() <= 1 ) { -+ if ( event->type == XKeyPress && text.length() <= 1 -+#ifndef QT_NO_IM -+ // input methods need discrete key events -+ // TODO: describe design decision -+ && ! qic -+#endif// QT_NO_IM -+ ) { - XEvent dummy; - - for (;;) { -diff -urN qt-x11-free-3.3.2/src/kernel/qinputcontext.cpp qt-x11-immodule-bc/src/kernel/qinputcontext.cpp ---- qt-x11-free-3.3.2/src/kernel/qinputcontext.cpp 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qinputcontext.cpp 2004-06-23 03:00:46.715782752 +0900 -@@ -0,0 +1,382 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** Implementation of QInputContext class -+** -+** Copyright (C) 2000-2003 Trolltech AS. All rights reserved. -+** -+** This file is part of the kernel module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition -+** licenses for Unix/X11 may use this file in accordance with the Qt Commercial -+** License Agreement provided with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+//#define QT_NO_IM_PREEDIT_RELOCATION -+ -+#include "qinputcontext.h" -+ -+#ifndef QT_NO_IM -+ -+#include "qplatformdefs.h" -+ -+#include "qapplication.h" -+#include "qwidget.h" -+ -+#include <stdlib.h> -+#include <limits.h> -+ -+class QInputContextPrivate -+{ -+public: -+ QInputContextPrivate() -+ : holderWidget( 0 ), composingWidget( 0 ), hasFocus( FALSE ), -+ isComposing( FALSE ) -+#if !defined(QT_NO_IM_PREEDIT_RELOCATION) -+ , preeditString( QString::null ), -+ cursorPosition( -1 ), selLength ( 0 ) -+#endif -+ {} -+ -+ QWidget *holderWidget; // widget to which QInputContext instance belongs. -+ QWidget *composingWidget; -+ bool hasFocus; -+ bool isComposing; -+ -+ void updateComposingState( const QString &text, -+ int newCursorPosition, int newSelLength ) { -+#if !defined(QT_NO_IM_PREEDIT_RELOCATION) -+ preeditString = text; -+ cursorPosition = newCursorPosition; -+ selLength = newSelLength; -+#endif -+ } -+ -+ void resetComposingState() { -+ isComposing = FALSE; -+#if !defined(QT_NO_IM_PREEDIT_RELOCATION) -+ preeditString = QString::null; -+ cursorPosition = -1; -+ selLength = 0; -+#endif -+ } -+ -+#if !defined(QT_NO_IM_PREEDIT_RELOCATION) -+ QString preeditString; -+ int cursorPosition; -+ int selLength; -+#endif -+}; -+ -+ -+/*! -+ This constructor sets widget of the first argument to the -+ holderWidget, state of the second argument to the imState, -+ respectively. holderWidget is widget holding QInputContext -+ (itself). imState is state of InputMethod. -+*/ -+QInputContext::QInputContext() -+{ -+ d = new QInputContextPrivate; -+} -+ -+ -+QInputContext::~QInputContext() -+{ -+ delete d; -+} -+ -+QWidget* QInputContext::holderWidget() const -+{ -+ return d->holderWidget; -+} -+ -+void QInputContext::setHolderWidget( QWidget *w ) -+{ -+ d->holderWidget = w; -+} -+ -+QWidget* QInputContext::focusWidget() const -+{ -+ return d->hasFocus ? d->composingWidget : 0; -+} -+ -+ -+void QInputContext::setFocusWidget( QWidget *w ) -+{ -+ if ( w ) { -+ bool isFocusingBack = ( w == d->composingWidget ); -+ bool isPreeditRelocation = ( ! isFocusingBack && isComposing() && -+ d->composingWidget ); -+ // invoke sendIMEventInternal() rather than sendIMEvent() to -+ // avoid altering the composing state -+ if ( isPreeditRelocation == TRUE ) { -+ // clear preedit of previously focused text -+ // widget. preserved preedit may be exist even if -+ // isPreeditRelocationEnabled() == FALSE. -+ sendIMEventInternal( QEvent::IMEnd ); -+ } -+ d->composingWidget = w; // changes recipient of QIMEvent -+ if ( isPreeditRelocation == TRUE ) { -+#if !defined(QT_NO_IM_PREEDIT_RELOCATION) -+ if ( isPreeditRelocationEnabled() ) { -+ // copy preedit state to the widget that gaining focus -+ sendIMEventInternal( QEvent::IMStart ); -+ sendIMEventInternal( QEvent::IMCompose, d->preeditString, -+ d->cursorPosition, d->selLength ); -+ } else -+#endif -+ { -+ // reset input context when the shared context has -+ // focused on another text widget -+ reset(); -+ } -+ } -+ } -+ d->hasFocus = w ? TRUE : FALSE; -+} -+ -+ -+void QInputContext::releaseComposingWidget( QWidget *w ) -+{ -+ if ( d->composingWidget == w ) { -+ d->composingWidget = 0; -+ d->hasFocus = FALSE; -+ } -+} -+ -+bool QInputContext::isPreeditRelocationEnabled() -+{ -+ return FALSE; -+} -+ -+bool QInputContext::isComposing() const -+{ -+ return d->isComposing; -+} -+ -+ -+/*! -+ This function must be implemented in subclasses to handle key -+ input (except for input method used only on a specific -+ platform). If an event is filtered, it must return TRUE. -+ -+ keywidget is client widget into which a text is inputted. type -+ shows whether inputted event is KeyPress or KeyRelease. code show -+ inputted key code. state show keyboard modifiers (OR-ed together). -+ -+ In principle, only when composition is finished, the input is -+ committed by QIMEvent (IMEnd). Otherwise, the input set to -+ arguments, such as text, ascii, count, etc. The purpose of this -+ specification is to take adjustment with key compression. -+*/ -+bool QInputContext::filterEvent( QEvent *event ) -+{ -+ return FALSE; -+} -+ -+ -+void QInputContext::sendIMEventInternal( QEvent::Type type, -+ const QString &text, -+ int cursorPosition, int selLength ) -+{ -+#if defined(Q_WS_X11) -+ if ( ! d->composingWidget ) -+ return; -+#endif -+ -+ if ( type == QEvent::IMStart ) { -+ qDebug( "sending IMStart with %d chars to %p", -+ text.length(), d->composingWidget ); -+#if defined(Q_WS_X11) -+ QIMEvent event( type, text, cursorPosition ); -+ QApplication::sendEvent( d->composingWidget, &event ); -+#elif defined(Q_WS_QWS) -+ // just a placeholder for now -+ //qwsServer->sendIMEvent( QWSServer::IMCompose, -+ // text, cursorPosition, selLength ); -+#endif -+ } else if ( type == QEvent::IMEnd ) { -+ qDebug( "sending IMEnd with %d chars to %p, text=%s", -+ text.length(), d->composingWidget, -+ (const char*)text.local8Bit() ); -+#if defined(Q_WS_X11) -+ QIMEvent event( type, text, cursorPosition ); -+ QApplication::sendEvent( d->composingWidget, &event ); -+#elif defined(Q_WS_QWS) -+ //qwsServer->sendIMEvent( QWSServer::IMEnd, -+ // text, cursorPosition, selLength ); -+#endif -+ } else if ( type == QEvent::IMCompose ) { -+ qDebug( "sending IMCompose to %p with %d chars, cpos=%d, sellen=%d, text=%s", -+ d->composingWidget, -+ text.length(), cursorPosition, selLength, -+ (const char*)text.local8Bit() ); -+#if defined(Q_WS_X11) -+ QIMComposeEvent event( type, text, cursorPosition, selLength ); -+ QApplication::sendEvent( d->composingWidget, &event ); -+#elif defined(Q_WS_QWS) -+ //qwsServer->sendIMEvent( QWSServer::IMCompose, -+ // text, cursorPosition, selLength ); -+#endif -+ } -+} -+ -+ -+void QInputContext::sendIMEvent( QEvent::Type type, const QString &text, -+ int cursorPosition, int selLength ) -+{ -+#if defined(Q_WS_X11) -+ if ( !focusWidget() ) -+ return; -+#endif -+ -+ if ( type == QEvent::IMStart ) { -+ sendIMEventInternal( type, text, cursorPosition, selLength ); -+ d->isComposing = TRUE; -+ } else if ( type == QEvent::IMEnd ) { -+ d->resetComposingState(); -+ sendIMEventInternal( type, text, cursorPosition, selLength ); -+ } else if ( type == QEvent::IMCompose ) { -+ d->updateComposingState( text, cursorPosition, selLength ); -+ sendIMEventInternal( type, text, cursorPosition, selLength ); -+ } -+} -+ -+ -+ -+/*! -+ \fn void QInputContext::setFocus() -+ -+ This function must be implemented in subclasses to set focus. -+ -+ \sa unsetFocus() -+*/ -+void QInputContext::setFocus() -+{ -+ // focusWidget is already set by QWidget::focusInputContext() -+} -+ -+ -+/*! -+ \fn void QInputContext::unsetFocus() -+ -+ This function must be implemented in subclasses to unset focus. -+ -+ \sa setFocus() -+*/ -+void QInputContext::unsetFocus() -+{ -+ reset(); -+ // focusWidget is set to 0 after return by QWidget::unfocusInputContext() -+} -+ -+ -+/*! -+ \fn void QInputContext::setMicroFocus( int x, int y, int w, int h, QFont *f ) -+ -+ This function must be implemented in subclasses to handle -+ focusHint changes. -+ -+ x and y are cursor's positions. w is cursor's width, and h is -+ cursor's height. widget is client widget. f is a font on the -+ cursor's position. -+*/ -+void QInputContext::setMicroFocus( int x, int y, int w, int h, QFont *f ) -+{ -+} -+ -+ -+/*! -+ \fn void QWSInputMethod::mouseHandler( int x, int state ) -+ -+ Implemented in subclasses to handle mouse -+ presses/releases/doubleclicks/moves within the on-the-spot text. The -+ parameter \a x is the offset within the string that was sent with -+ the IMCompose event. \a state is either \c QEvent::MouseButtonPress -+ or \c QEvent::MouseButtonRelease or \c QEvent::MouseButtonDblClick -+ or \c QEvent::MouseButtonMove. The method interface is imported from -+ QWSInputMethod::mouseHandler() of Qt/Embedded 2.3.7 and extended for -+ desktop system. -+ */ -+void QInputContext::mouseHandler( int x, QEvent::Type type, -+ Qt::ButtonState button, -+ Qt::ButtonState state ) -+{ -+ // Default behavior for simple ephemeral input contexts. Some -+ // complex input contexts should not be reset here. -+ if ( type == QEvent::MouseButtonPress || -+ type == QEvent::MouseButtonDblClick ) -+ reset(); -+} -+ -+ -+/*! -+ Returns the font of the current input widget -+ */ -+QFont QInputContext::font() const -+{ -+ if ( !focusWidget() ) -+ return QApplication::font(); //### absolutely last resort -+ -+ return focusWidget()->font(); -+} -+ -+ -+/*! -+ \fn void QInputContext::reset() -+ -+ This function must be implemented in subclasses to reset the state -+ of the input method. -+*/ -+void QInputContext::reset() -+{ -+ if ( isComposing() ) -+ sendIMEvent( QEvent::IMEnd ); -+} -+ -+ -+/*! -+ \fn QString QInputContext::name() -+ -+ This function must be implemented in subclasses to return the name -+ of the input method. -+*/ -+QString QInputContext::name() -+{ -+} -+ -+ -+/*! -+ \fn QCString QInputContext::language() -+ -+ This function must be implemented in subclasses to return a -+ language code (e.g. "zh_CN", "zh_TW", "zh_HK", "ja", "ko", ...) of -+ the input method. -+*/ -+QCString QInputContext::language() -+{ -+} -+ -+#endif //Q_NO_IM -diff -urN qt-x11-free-3.3.2/src/kernel/qinputcontext.h qt-x11-immodule-bc/src/kernel/qinputcontext.h ---- qt-x11-free-3.3.2/src/kernel/qinputcontext.h 1970-01-01 09:00:00.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qinputcontext.h 2004-06-23 03:07:02.936588496 +0900 -@@ -0,0 +1,116 @@ -+/**************************************************************************** -+** $Id: qt-x11-immodule-bc-qt3.3.2-20040623.diff,v 1.1 2004/08/04 16:15:05 usata Exp $ -+** -+** Definition of QInputContext -+** -+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. -+** -+** This file is part of the kernel module of the Qt GUI Toolkit. -+** -+** This file may be distributed under the terms of the Q Public License -+** as defined by Trolltech AS of Norway and appearing in the file -+** LICENSE.QPL included in the packaging of this file. -+** -+** This file may be distributed and/or modified under the terms of the -+** GNU General Public License version 2 as published by the Free Software -+** Foundation and appearing in the file LICENSE.GPL included in the -+** packaging of this file. -+** -+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition -+** licenses may use this file in accordance with the Qt Commercial License -+** Agreement provided with the Software. -+** -+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -+** -+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for -+** information about Qt Commercial License Agreements. -+** See http://www.trolltech.com/qpl/ for QPL licensing information. -+** See http://www.trolltech.com/gpl/ for GPL licensing information. -+** -+** Contact info@trolltech.com if any conditions of this licensing are -+** not clear to you. -+** -+**********************************************************************/ -+ -+#ifndef QINPUTCONTEXT_H -+#define QINPUTCONTEXT_H -+ -+#ifndef QT_NO_IM -+ -+#ifndef QT_H -+#include "qglobal.h" -+#include "qevent.h" -+#endif -+ -+class QWidget; -+class QFont; -+class QString; -+class QInputContextPrivate; -+ -+ -+/* -+ QInputContext holds the data which input method uses and offers -+ the function which input method has. And, in order to enable -+ useing each input method, it is necessary to inherit QInputContext -+ and to implement InputContext corresponding to it. -+*/ -+class QInputContext -+{ -+public: -+ QInputContext(); -+ virtual ~QInputContext(); -+ -+ virtual QString name(); -+ virtual QCString language(); -+ -+#if defined(Q_WS_X11) -+ virtual bool x11FilterEvent( QWidget *keywidget, XEvent *event ); -+#endif // Q_WS_X11 -+ virtual bool filterEvent( QEvent *event ); -+ virtual void reset(); -+ -+ virtual void setFocus(); -+ virtual void unsetFocus(); -+ virtual void setMicroFocus( int x, int y, int w, int h, QFont *f = 0 ); -+ virtual void mouseHandler( int x, QEvent::Type type, -+ Qt::ButtonState button, Qt::ButtonState state ); -+ virtual QFont font() const; -+ -+protected: -+#if defined(Q_WS_X11) -+ // not recommended to use these functions -+ QWidget *focusWidget() const; -+ QWidget *holderWidget() const; -+#endif -+ -+ bool isComposing() const; -+ virtual bool isPreeditRelocationEnabled(); -+ virtual void sendIMEvent( QEvent::Type type, -+ const QString &text = QString::null, -+ int cursorPosition = -1, int selLength = 0 ); -+ -+private: -+ void sendIMEventInternal( QEvent::Type type, -+ const QString &text = QString::null, -+ int cursorPosition = -1, int selLength = 0 ); -+#if defined(Q_WS_X11) -+ void setFocusWidget( QWidget *w ); -+ void setHolderWidget( QWidget *w ); -+ void releaseComposingWidget( QWidget *w ); -+#endif -+ -+ QInputContextPrivate *d; -+ -+ friend class QWidget; -+ friend class QInputContextFactory; -+ -+private: // Disabled copy constructor and operator= -+ QInputContext( const QInputContext & ); -+ QInputContext &operator=( const QInputContext & ); -+ -+}; -+ -+#endif //Q_NO_IM -+ -+#endif // QINPUTCONTEXT_H -diff -urN qt-x11-free-3.3.2/src/kernel/qinputcontext_x11.cpp qt-x11-immodule-bc/src/kernel/qinputcontext_x11.cpp ---- qt-x11-free-3.3.2/src/kernel/qinputcontext_x11.cpp 2004-04-19 18:36:08.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qinputcontext_x11.cpp 2004-06-23 01:10:27.072121552 +0900 -@@ -33,500 +33,37 @@ - ** - **********************************************************************/ - -+#include "qinputcontext.h" -+ -+#ifndef QT_NO_IM -+ - #include "qplatformdefs.h" - - #include "qapplication.h" - #include "qwidget.h" --#include "qinputcontext_p.h" -- --#include <stdlib.h> --#include <limits.h> - -+#include "qt_x11_p.h" - --bool qt_compose_emptied = FALSE; -+/*! -+ This function, only if input method is depending on X11, must be overridden -+ in subclasses. Otherwise, this function must not. - --#if !defined(QT_NO_XIM) -+ By default, this function translates key code and keyboard modifiers from -+ the event which is the 2nd argument, and pass the value to QInputContext::filterEvent(). - --#define XK_MISCELLANY --#define XK_LATIN1 --#include <X11/keysymdef.h> -+ keywidget is client widget into which a text is inputted. event is inputted XEvent. - --// #define QT_XIM_DEBUG -+ In principle, only when composition is finished, the input is committed -+ by QIMEvent (IMEnd). Otherwise, the input set to arguments, such as code, -+ state, text, ascii, count, etc. The purpose of this specification is to -+ take adjustment with key compression. - --// from qapplication_x11.cpp --extern XIM qt_xim; --extern XIMStyle qt_xim_style; -- --/* The cache here is needed, as X11 leaks a few kb for every -- XFreeFontSet call, so we avoid creating and deletion of fontsets as -- much as possible -+ type shows whether inputted event is KeyPress or KeyRelease. code show -+ inputted key code. state show keyboard modifiers (OR-ed together). - */ --static XFontSet fontsetCache[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; --static int fontsetRefCount = 0; -- --static const char * const fontsetnames[] = { -- "-*-fixed-medium-r-*-*-16-*,-*-*-medium-r-*-*-16-*", -- "-*-fixed-medium-i-*-*-16-*,-*-*-medium-i-*-*-16-*", -- "-*-fixed-bold-r-*-*-16-*,-*-*-bold-r-*-*-16-*", -- "-*-fixed-bold-i-*-*-16-*,-*-*-bold-i-*-*-16-*", -- "-*-fixed-medium-r-*-*-24-*,-*-*-medium-r-*-*-24-*", -- "-*-fixed-medium-i-*-*-24-*,-*-*-medium-i-*-*-24-*", -- "-*-fixed-bold-r-*-*-24-*,-*-*-bold-r-*-*-24-*", -- "-*-fixed-bold-i-*-*-24-*,-*-*-bold-i-*-*-24-*" --}; -- --static XFontSet getFontSet( const QFont &f ) --{ -- int i = 0; -- if (f.italic()) -- i |= 1; -- if (f.bold()) -- i |= 2; -- -- if ( f.pointSize() > 20 ) -- i += 4; -- -- if ( !fontsetCache[i] ) { -- Display* dpy = QPaintDevice::x11AppDisplay(); -- int missCount; -- char** missList; -- fontsetCache[i] = XCreateFontSet(dpy, fontsetnames[i], &missList, &missCount, 0); -- if(missCount > 0) -- XFreeStringList(missList); -- if ( !fontsetCache[i] ) { -- fontsetCache[i] = XCreateFontSet(dpy, "-*-fixed-*-*-*-*-16-*", &missList, &missCount, 0); -- if(missCount > 0) -- XFreeStringList(missList); -- if ( !fontsetCache[i] ) -- fontsetCache[i] = (XFontSet)-1; -- } -- } -- return (fontsetCache[i] == (XFontSet)-1) ? 0 : fontsetCache[i]; --} -- -- --#ifdef Q_C_CALLBACKS --extern "C" { --#endif // Q_C_CALLBACKS -- -- static int xic_start_callback(XIC, XPointer client_data, XPointer) { -- QInputContext *qic = (QInputContext *) client_data; -- if (! qic) { --#ifdef QT_XIM_DEBUG -- qDebug("compose start: no qic"); --#endif // QT_XIM_DEBUG -- -- return 0; -- } -- -- qic->composing = TRUE; -- qic->text = QString::null; -- qic->focusWidget = 0; -- -- if ( qic->selectedChars.size() < 128 ) -- qic->selectedChars.resize( 128 ); -- qic->selectedChars.fill( 0 ); -- --#ifdef QT_XIM_DEBUG -- qDebug("compose start"); --#endif // QT_XIM_DEBUG -- -- return 0; -- } -- -- static int xic_draw_callback(XIC, XPointer client_data, XPointer call_data) { -- QInputContext *qic = (QInputContext *) client_data; -- if (! qic) { --#ifdef QT_XIM_DEBUG -- qDebug("compose event: invalid compose event %p", qic); --#endif // QT_XIM_DEBUG -- -- return 0; -- } -- -- bool send_imstart = FALSE; -- if (qApp->focusWidget() != qic->focusWidget && qic->text.isEmpty()) { -- if (qic->focusWidget) { --#ifdef QT_XIM_DEBUG -- qDebug( "sending IMEnd (empty) to %p", qic->focusWidget ); --#endif // QT_XIM_DEBUG -- -- QIMEvent endevent(QEvent::IMEnd, QString::null, -1); -- QApplication::sendEvent(qic->focusWidget, &endevent); -- } -- -- qic->text = QString::null; -- qic->focusWidget = qApp->focusWidget(); -- qic->composing = FALSE; -- -- if ( qic->selectedChars.size() < 128 ) -- qic->selectedChars.resize( 128 ); -- qic->selectedChars.fill( 0 ); -- -- if (qic->focusWidget) { -- qic->composing = TRUE; -- send_imstart = TRUE; -- } -- } -- -- if (! qic->composing || ! qic->focusWidget) { --#ifdef QT_XIM_DEBUG -- qDebug("compose event: invalid compose event %d %p", -- qic->composing, qic->focusWidget); --#endif // QT_XIM_DEBUG -- -- return 0; -- } -- -- if ( send_imstart ) { --#ifdef QT_XIM_DEBUG -- qDebug( "sending IMStart to %p", qic->focusWidget ); --#endif // QT_XIM_DEBUG -- -- qt_compose_emptied = FALSE; -- QIMEvent startevent(QEvent::IMStart, QString::null, -1); -- QApplication::sendEvent(qic->focusWidget, &startevent); -- } -- -- XIMPreeditDrawCallbackStruct *drawstruct = -- (XIMPreeditDrawCallbackStruct *) call_data; -- XIMText *text = (XIMText *) drawstruct->text; -- int cursor = drawstruct->caret, sellen = 0; -- -- if ( ! drawstruct->caret && ! drawstruct->chg_first && -- ! drawstruct->chg_length && ! text ) { -- // nothing to do -- return 0; -- } -- -- if (text) { -- char *str = 0; -- if (text->encoding_is_wchar) { -- int l = wcstombs(NULL, text->string.wide_char, text->length); -- if (l != -1) { -- str = new char[l + 1]; -- wcstombs(str, text->string.wide_char, l); -- str[l] = 0; -- } -- } else -- str = text->string.multi_byte; -- -- if (! str) -- return 0; -- -- QString s = QString::fromLocal8Bit(str); -- -- if (text->encoding_is_wchar) -- delete [] str; -- -- if (drawstruct->chg_length < 0) -- qic->text.replace(drawstruct->chg_first, UINT_MAX, s); -- else -- qic->text.replace(drawstruct->chg_first, drawstruct->chg_length, s); -- -- if ( qic->selectedChars.size() < qic->text.length() ) { -- // expand the selectedChars array if the compose string is longer -- uint from = qic->selectedChars.size(); -- qic->selectedChars.resize( qic->text.length() ); -- for ( uint x = from; from < qic->selectedChars.size(); ++x ) -- qic->selectedChars[x] = 0; -- } -- -- uint x; -- bool *p = qic->selectedChars.data() + drawstruct->chg_first; -- // determine if the changed chars are selected based on text->feedback -- for ( x = 0; x < s.length(); ++x ) -- *p++ = ( text->feedback ? ( text->feedback[x] & XIMReverse ) : 0 ); -- -- // figure out where the selection starts, and how long it is -- p = qic->selectedChars.data(); -- bool started = FALSE; -- for ( x = 0; x < qic->selectedChars.size(); ++x ) { -- if ( started ) { -- if ( *p ) ++sellen; -- else break; -- } else { -- if ( *p ) { -- cursor = x; -- started = TRUE; -- sellen = 1; -- } -- } -- ++p; -- } -- } else { -- if (drawstruct->chg_length == 0) -- drawstruct->chg_length = -1; -- -- qic->text.remove(drawstruct->chg_first, drawstruct->chg_length); -- qt_compose_emptied = qic->text.isEmpty(); -- if ( qt_compose_emptied ) { --#ifdef QT_XIM_DEBUG -- qDebug( "compose emptied" ); --#endif // QT_XIM_DEBUG -- -- // don't send an empty compose, since we will send an IMEnd with -- // either the correct compose text (or null text if the user has -- // cancelled the compose or deleted all chars). -- return 0; -- } -- } -- --#ifdef QT_XIM_DEBUG -- qDebug( "sending IMCompose to %p with %d chars", -- qic->focusWidget, qic->text.length() ); --#endif // QT_XIM_DEBUG -- -- QIMComposeEvent event( QEvent::IMCompose, qic->text, cursor, sellen ); -- QApplication::sendEvent(qic->focusWidget, &event); -- return 0; -- } -- -- static int xic_done_callback(XIC, XPointer client_data, XPointer) { -- QInputContext *qic = (QInputContext *) client_data; -- if (! qic) -- return 0; -- -- if (qic->composing && qic->focusWidget) { --#ifdef QT_XIM_DEBUG -- qDebug( "sending IMEnd (empty) to %p", qic->focusWidget ); --#endif // QT_XIM_DEBUG -- -- QIMEvent event(QEvent::IMEnd, QString::null, -1); -- QApplication::sendEvent(qic->focusWidget, &event); -- } -- -- qic->composing = FALSE; -- qic->focusWidget = 0; -- -- if ( qic->selectedChars.size() < 128 ) -- qic->selectedChars.resize( 128 ); -- qic->selectedChars.fill( 0 ); -- -- return 0; -- } -- --#ifdef Q_C_CALLBACKS --} --#endif // Q_C_CALLBACKS -- --#endif // !QT_NO_XIM -- -- -- --QInputContext::QInputContext(QWidget *widget) -- : ic(0), focusWidget(0), composing(FALSE), fontset(0) --{ --#if !defined(QT_NO_XIM) -- fontsetRefCount++; -- if (! qt_xim) { -- qWarning("QInputContext: no input method context available"); -- return; -- } -- -- if (! widget->isTopLevel()) { -- qWarning("QInputContext: cannot create input context for non-toplevel widgets"); -- return; -- } -- -- XPoint spot; -- XRectangle rect; -- XVaNestedList preedit_attr = 0; -- XIMCallback startcallback, drawcallback, donecallback; -- -- font = widget->font(); -- fontset = getFontSet( font ); -- -- if (qt_xim_style & XIMPreeditArea) { -- rect.x = 0; -- rect.y = 0; -- rect.width = widget->width(); -- rect.height = widget->height(); -- -- preedit_attr = XVaCreateNestedList(0, -- XNArea, &rect, -- XNFontSet, fontset, -- (char *) 0); -- } else if (qt_xim_style & XIMPreeditPosition) { -- spot.x = 1; -- spot.y = 1; -- -- preedit_attr = XVaCreateNestedList(0, -- XNSpotLocation, &spot, -- XNFontSet, fontset, -- (char *) 0); -- } else if (qt_xim_style & XIMPreeditCallbacks) { -- startcallback.client_data = (XPointer) this; -- startcallback.callback = (XIMProc) xic_start_callback; -- drawcallback.client_data = (XPointer) this; -- drawcallback.callback = (XIMProc)xic_draw_callback; -- donecallback.client_data = (XPointer) this; -- donecallback.callback = (XIMProc) xic_done_callback; -- -- preedit_attr = XVaCreateNestedList(0, -- XNPreeditStartCallback, &startcallback, -- XNPreeditDrawCallback, &drawcallback, -- XNPreeditDoneCallback, &donecallback, -- (char *) 0); -- } -- -- if (preedit_attr) { -- ic = XCreateIC(qt_xim, -- XNInputStyle, qt_xim_style, -- XNClientWindow, widget->winId(), -- XNPreeditAttributes, preedit_attr, -- (char *) 0); -- XFree(preedit_attr); -- } else -- ic = XCreateIC(qt_xim, -- XNInputStyle, qt_xim_style, -- XNClientWindow, widget->winId(), -- (char *) 0); -- -- if (! ic) -- qFatal("Failed to create XIM input context!"); -- -- // when resetting the input context, preserve the input state -- (void) XSetICValues((XIC) ic, XNResetState, XIMPreserveState, (char *) 0); --#endif // !QT_NO_XIM --} -- -- --QInputContext::~QInputContext() --{ -- --#if !defined(QT_NO_XIM) -- if (ic) -- XDestroyIC((XIC) ic); -- -- if ( --fontsetRefCount == 0 ) { -- Display *dpy = QPaintDevice::x11AppDisplay(); -- for ( int i = 0; i < 8; i++ ) { -- if ( fontsetCache[i] && fontsetCache[i] != (XFontSet)-1 ) { -- XFreeFontSet(dpy, fontsetCache[i]); -- fontsetCache[i] = 0; -- } -- } -- } -- --#endif // !QT_NO_XIM -- -- ic = 0; -- focusWidget = 0; -- composing = FALSE; --} -- -- --void QInputContext::reset() --{ --#if !defined(QT_NO_XIM) -- if (focusWidget && composing && ! text.isNull()) { --#ifdef QT_XIM_DEBUG -- qDebug("QInputContext::reset: composing - sending IMEnd (empty) to %p", -- focusWidget); --#endif // QT_XIM_DEBUG -- -- QIMEvent endevent(QEvent::IMEnd, QString::null, -1); -- QApplication::sendEvent(focusWidget, &endevent); -- focusWidget = 0; -- text = QString::null; -- if ( selectedChars.size() < 128 ) -- selectedChars.resize( 128 ); -- selectedChars.fill( 0 ); -- -- char *mb = XmbResetIC((XIC) ic); -- if (mb) -- XFree(mb); -- } --#endif // !QT_NO_XIM --} -- -- --void QInputContext::setComposePosition(int x, int y) --{ --#if !defined(QT_NO_XIM) -- if (qt_xim && ic) { -- XPoint point; -- point.x = x; -- point.y = y; -- -- XVaNestedList preedit_attr = -- XVaCreateNestedList(0, -- XNSpotLocation, &point, -- -- (char *) 0); -- XSetICValues((XIC) ic, XNPreeditAttributes, preedit_attr, (char *) 0); -- XFree(preedit_attr); -- } --#endif // !QT_NO_XIM --} -- -- --void QInputContext::setComposeArea(int x, int y, int w, int h) -+bool QInputContext::x11FilterEvent( QWidget *keywidget, XEvent *event ) - { --#if !defined(QT_NO_XIM) -- if (qt_xim && ic) { -- XRectangle rect; -- rect.x = x; -- rect.y = y; -- rect.width = w; -- rect.height = h; -- -- XVaNestedList preedit_attr = XVaCreateNestedList(0, -- XNArea, &rect, -- -- (char *) 0); -- XSetICValues((XIC) ic, XNPreeditAttributes, preedit_attr, (char *) 0); -- XFree(preedit_attr); -- } --#endif -+ return FALSE; - } - -- --int QInputContext::lookupString(XKeyEvent *event, QCString &chars, -- KeySym *key, Status *status) const --{ -- int count = 0; -- --#if !defined(QT_NO_XIM) -- if (qt_xim && ic) { -- count = XmbLookupString((XIC) ic, event, chars.data(), -- chars.size(), key, status); -- -- if ((*status) == XBufferOverflow ) { -- chars.resize(count + 1); -- count = XmbLookupString((XIC) ic, event, chars.data(), -- chars.size(), key, status); -- } -- } -- --#endif // QT_NO_XIM -- -- return count; --} -- --void QInputContext::setFocus() --{ --#if !defined(QT_NO_XIM) -- if (qt_xim && ic) -- XSetICFocus((XIC) ic); --#endif // !QT_NO_XIM --} -- --void QInputContext::setXFontSet(const QFont &f) --{ --#if !defined(QT_NO_XIM) -- if (font == f) return; // nothing to do -- font = f; -- -- XFontSet fs = getFontSet(font); -- if (fontset == fs) return; // nothing to do -- fontset = fs; -- -- XVaNestedList preedit_attr = XVaCreateNestedList(0, XNFontSet, fontset, (char *) 0); -- XSetICValues((XIC) ic, XNPreeditAttributes, preedit_attr, (char *) 0); -- XFree(preedit_attr); --#else -- Q_UNUSED( f ); --#endif --} -+#endif //Q_NO_IM -diff -urN qt-x11-free-3.3.2/src/kernel/qnamespace.h qt-x11-immodule-bc/src/kernel/qnamespace.h ---- qt-x11-free-3.3.2/src/kernel/qnamespace.h 2004-04-19 18:36:09.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qnamespace.h 2004-06-23 01:10:27.073121400 +0900 -@@ -397,6 +397,61 @@ - Key_Help = 0x1058, - Key_Direction_L = 0x1059, - Key_Direction_R = 0x1060, -+ -+ // International input method support (X keycode - 0xEE00) -+ // Only interesting if you are writing your own input method -+ -+ // International & multi-key character composition -+ Key_Multi_key = 0x1120, // Multi-key character compose -+ Key_Codeinput = 0x1137, -+ Key_SingleCandidate = 0x113c, -+ Key_MultipleCandidate = 0x113d, -+ Key_PreviousCandidate = 0x113e, -+ -+ // Misc Functions -+ Key_Mode_switch = 0x117e, // Character set switch -+ //Key_script_switch = 0x117e, // Alias for mode_switch -+ -+ // Japanese keyboard support -+ Key_Kanji = 0x1121, // Kanji, Kanji convert -+ Key_Muhenkan = 0x1122, // Cancel Conversion -+ //Key_Henkan_Mode = 0x1123, // Start/Stop Conversion -+ Key_Henkan = 0x1123, // Alias for Henkan_Mode -+ Key_Romaji = 0x1124, // to Romaji -+ Key_Hiragana = 0x1125, // to Hiragana -+ Key_Katakana = 0x1126, // to Katakana -+ Key_Hiragana_Katakana = 0x1127, // Hiragana/Katakana toggle -+ Key_Zenkaku = 0x1128, // to Zenkaku -+ Key_Hankaku = 0x1129, // to Hankaku -+ Key_Zenkaku_Hankaku = 0x112a, // Zenkaku/Hankaku toggle -+ Key_Touroku = 0x112b, // Add to Dictionary -+ Key_Massyo = 0x112c, // Delete from Dictionary -+ Key_Kana_Lock = 0x112d, // Kana Lock -+ Key_Kana_Shift = 0x112e, // Kana Shift -+ Key_Eisu_Shift = 0x112f, // Alphanumeric Shift -+ Key_Eisu_toggle = 0x1130, // Alphanumeric toggle -+ //Key_Kanji_Bangou = 0x1137, // Codeinput -+ //Key_Zen_Koho = 0x113d, // Multiple/All Candidate(s) -+ //Key_Mae_Koho = 0x113e, // Previous Candidate -+ -+ // Korean support -+ Key_Hangul = 0x1131, // Hangul start/stop(toggle) -+ Key_Hangul_Start = 0x1132, // Hangul start -+ Key_Hangul_End = 0x1133, // Hangul end, English start -+ Key_Hangul_Hanja = 0x1134, // Start Hangul->Hanja Conversion -+ Key_Hangul_Jamo = 0x1135, // Hangul Jamo mode -+ Key_Hangul_Romaja = 0x1136, // Hangul Romaja mode -+ Key_Hangul_Codeinput = 0x1137, // Hangul code input mode -+ Key_Hangul_Jeonja = 0x1138, // Jeonja mode -+ Key_Hangul_Banja = 0x1139, // Banja mode -+ Key_Hangul_PreHanja = 0x113a, // Pre Hanja conversion -+ Key_Hangul_PostHanja = 0x113b, // Post Hanja conversion -+ Key_Hangul_SingleCandidate = 0x113c, // Single candidate -+ Key_Hangul_MultipleCandidate = 0x113d, // Multiple candidate -+ Key_Hangul_PreviousCandidate = 0x113e, // Previous candidate -+ Key_Hangul_Special = 0x113f, // Special symbols -+ //Key_Hangul_switch = 0x117e, // Alias for mode_switch -+ - Key_Space = 0x20, // 7 bit printable ASCII - Key_Any = Key_Space, - Key_Exclam = 0x21, -diff -urN qt-x11-free-3.3.2/src/kernel/qrichtext.cpp qt-x11-immodule-bc/src/kernel/qrichtext.cpp ---- qt-x11-free-3.3.2/src/kernel/qrichtext.cpp 2004-04-19 18:36:05.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qrichtext.cpp 2004-06-23 01:10:27.077120792 +0900 -@@ -657,7 +657,7 @@ - pop(); - } - --bool QTextCursor::place( const QPoint &p, QTextParagraph *s, bool link ) -+bool QTextCursor::place( const QPoint &p, QTextParagraph *s, bool link, bool loosePlacing, bool matchBetweenCharacters ) - { - QPoint pos( p ); - QRect r; -@@ -675,7 +675,7 @@ - str = s; - if ( pos.y() >= r.y() && pos.y() <= r.y() + r.height() ) - break; -- if ( !s->next() ) { -+ if ( loosePlacing == TRUE && !s->next() ) { - #ifdef Q_WS_MACX - pos.setX( s->rect().x() + s->rect().width() ); - #endif -@@ -716,7 +716,7 @@ - if ( pos.x() < x ) - pos.setX( x + 1 ); - int cw; -- int curpos = s->length()-1; -+ int curpos = -1; - int dist = 10000000; - bool inCustom = FALSE; - while ( i < nextLine ) { -@@ -738,14 +738,21 @@ - cpos += cw; - int d = cpos - pos.x(); - bool dm = d < 0 ? !chr->rightToLeft : chr->rightToLeft; -- if ( (QABS( d ) < dist || (dist == d && dm == TRUE )) && para->string()->validCursorPosition( i ) ) { -+ if ( ( matchBetweenCharacters == TRUE && (QABS( d ) < dist || (dist == d && dm == TRUE )) && para->string()->validCursorPosition( i ) ) || -+ ( matchBetweenCharacters == FALSE && ( d == 0 || dm == TRUE ) ) ) { - dist = QABS( d ); -- if ( !link || pos.x() >= x + chr->x ) -+ if ( !link || ( pos.x() >= x + chr->x && ( loosePlacing == TRUE || pos.x() < cpos ) ) ) - curpos = i; - } - } - i++; - } -+ if ( curpos == -1 ) { -+ if ( loosePlacing == TRUE ) -+ curpos = s->length()-1; -+ else -+ return FALSE; -+ } - setIndex( curpos ); - - #ifndef QT_NO_TEXTCUSTOMITEM -@@ -4828,6 +4835,9 @@ - tmpw = fullSelectionWidth - xleft; - painter.fillRect( xleft, y, tmpw, h, color ); - painter.drawText( xstart, y + baseLine, str, start, len, dir ); -+ // draw preedit's underline -+ if (selection == QTextDocument::IMCompositionText) -+ painter.drawLine(xstart, y + baseLine + 1, xstart + w, y + baseLine + 1); - if (selStart != start || selEnd != start + len || selWrap) - painter.restore(); - } -diff -urN qt-x11-free-3.3.2/src/kernel/qrichtext_p.h qt-x11-immodule-bc/src/kernel/qrichtext_p.h ---- qt-x11-free-3.3.2/src/kernel/qrichtext_p.h 2004-04-19 18:36:05.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qrichtext_p.h 2004-06-23 01:10:27.078120640 +0900 -@@ -358,7 +358,8 @@ - int totalOffsetY() const; // total document offset - - bool place( const QPoint &pos, QTextParagraph *s ) { return place( pos, s, FALSE ); } -- bool place( const QPoint &pos, QTextParagraph *s, bool link ); -+ bool place( const QPoint &pos, QTextParagraph *s, bool link ) { return place( pos, s, link, TRUE, TRUE ); } -+ bool place( const QPoint &pos, QTextParagraph *s, bool link, bool loosePlacing, bool matchBetweenCharacters ); - void restoreState(); - - -diff -urN qt-x11-free-3.3.2/src/kernel/qt_kernel.pri qt-x11-immodule-bc/src/kernel/qt_kernel.pri ---- qt-x11-free-3.3.2/src/kernel/qt_kernel.pri 2003-12-08 23:44:24.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qt_kernel.pri 2004-06-23 01:10:27.079120488 +0900 -@@ -34,7 +34,6 @@ - $$KERNEL_H/qimage.h \ - $$KERNEL_P/qimageformatinterface_p.h \ - $$KERNEL_H/qimageformatplugin.h \ -- $$KERNEL_P/qinputcontext_p.h \ - $$KERNEL_H/qkeycode.h \ - $$KERNEL_H/qkeysequence.h \ - $$KERNEL_H/qlayout.h \ -@@ -99,6 +98,12 @@ - $$KERNEL_CPP/qfontengine_p.h \ - $$KERNEL_CPP/qtextlayout_p.h - -+ unix:x11 { -+ HEADERS += $$KERNEL_H/qinputcontext.h -+ } else { -+ HEADERS += $$KERNEL_P/qinputcontext_p.h -+ } -+ - win32:SOURCES += $$KERNEL_CPP/qapplication_win.cpp \ - $$KERNEL_CPP/qclipboard_win.cpp \ - $$KERNEL_CPP/qcolor_win.cpp \ -@@ -130,6 +135,7 @@ - $$KERNEL_CPP/qdesktopwidget_x11.cpp \ - $$KERNEL_CPP/qeventloop_x11.cpp \ - $$KERNEL_CPP/qfont_x11.cpp \ -+ $$KERNEL_CPP/qinputcontext.cpp \ - $$KERNEL_CPP/qinputcontext_x11.cpp \ - $$KERNEL_CPP/qmotifdnd_x11.cpp \ - $$KERNEL_CPP/qpixmap_x11.cpp \ -diff -urN qt-x11-free-3.3.2/src/kernel/qwidget.cpp qt-x11-immodule-bc/src/kernel/qwidget.cpp ---- qt-x11-free-3.3.2/src/kernel/qwidget.cpp 2004-04-19 18:36:08.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qwidget.cpp 2004-06-23 01:10:27.081120184 +0900 -@@ -3282,8 +3282,24 @@ - if ( isActiveWindow() ) { - QWidget * prev = qApp->focus_widget; - if ( prev ) { -- if ( prev != this ) -+ // This part is never executed when Q_WS_X11? Preceding XFocusOut -+ // had already reset focus_widget when received XFocusIn -+ -+ // Don't reset input context explicitly here. Whether reset or not -+ // when focusing out is a responsibility of input methods. For -+ // example, Japanese input context should not be reset here. The -+ // context sometimes contains a whole paragraph and has minutes of -+ // lifetime different to ephemeral one in other languages. The -+ // input context should be survived until focused again. So we -+ // delegate the responsibility to input context via -+ // unfocusInputContext(). -+ if ( prev != this ) { -+#if 0 - prev->resetInputContext(); -+#else -+ prev->unfocusInputContext(); -+#endif -+ } - } - #if defined(Q_WS_WIN) - else { -@@ -3291,9 +3307,7 @@ - } - #endif - qApp->focus_widget = this; --#if defined(Q_WS_X11) - focusInputContext(); --#endif - - #if defined(Q_WS_WIN) - if ( !topLevelWidget()->isPopup() ) -@@ -3341,6 +3355,7 @@ - focusProxy()->clearFocus(); - return; - } else if ( hasFocus() ) { -+ unfocusInputContext(); - QWidget* w = qApp->focusWidget(); - // clear active focus - qApp->focus_widget = 0; -@@ -4661,7 +4676,13 @@ - break; - - case QEvent::MouseButtonPress: -+ // Don't reset input context here. Whether reset or not is -+ // a responsibility of input method. reset() will be -+ // called by mouseHandler() of input method if necessary -+ // via mousePressEvent() of text widgets. -+#if 0 - resetInputContext(); -+#endif - mousePressEvent( (QMouseEvent*)e ); - if ( ! ((QMouseEvent*)e)->isAccepted() ) - return FALSE; -diff -urN qt-x11-free-3.3.2/src/kernel/qwidget.h qt-x11-immodule-bc/src/kernel/qwidget.h ---- qt-x11-free-3.3.2/src/kernel/qwidget.h 2004-04-19 18:36:06.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qwidget.h 2004-06-23 01:10:27.082120032 +0900 -@@ -536,6 +536,9 @@ - int metric( int ) const; - - void resetInputContext(); -+ void sendMouseEventToInputContext( int x, QEvent::Type type, -+ Qt::ButtonState button, -+ Qt::ButtonState state ); - - virtual void create( WId = 0, bool initializeWindow = TRUE, - bool destroyOldWindow = TRUE ); -@@ -573,6 +576,7 @@ - void createInputContext(); - void destroyInputContext(); - void focusInputContext(); -+ void unfocusInputContext(); - void checkChildrenDnd(); - #elif defined(Q_WS_MAC) - uint own_id : 1, macDropEnabled : 1; -diff -urN qt-x11-free-3.3.2/src/kernel/qwidget_x11.cpp qt-x11-immodule-bc/src/kernel/qwidget_x11.cpp ---- qt-x11-free-3.3.2/src/kernel/qwidget_x11.cpp 2004-04-19 18:36:07.000000000 +0900 -+++ qt-x11-immodule-bc/src/kernel/qwidget_x11.cpp 2004-06-23 01:10:27.084119728 +0900 -@@ -61,11 +61,11 @@ - bool qt_wstate_iconified( WId ); - void qt_updated_rootinfo(); - --#ifndef QT_NO_XIM --#include "qinputcontext_p.h" -+#ifndef QT_NO_IM -+#include "qinputcontext.h" -+#include "qinputcontextfactory.h" - --extern XIM qt_xim; --extern XIMStyle qt_xim_style; -+extern QString defaultIM; - #endif - - // Paint event clipping magic -@@ -940,22 +940,18 @@ - void QWidget::setMicroFocusHint(int x, int y, int width, int height, - bool text, QFont *f ) - { --#ifndef QT_NO_XIM -+#ifndef QT_NO_IM - if ( text ) { - QWidget* tlw = topLevelWidget(); - QTLWExtra *topdata = tlw->topData(); - - // trigger input context creation if it hasn't happened already - createInputContext(); -- QInputContext *qic = (QInputContext *) topdata->xic; - -- if ( qt_xim && qic ) { -- QPoint p( x, y ); -- QPoint p2 = mapTo( topLevelWidget(), QPoint( 0, 0 ) ); -- p = mapTo( topLevelWidget(), p); -- qic->setXFontSet( f ? *f : fnt ); -- qic->setComposePosition(p.x(), p.y() + height); -- qic->setComposeArea(p2.x(), p2.y(), this->width(), this->height()); -+ QInputContext *qic = (QInputContext *) topdata->xic; -+ if(qic) { -+ QPoint gp = mapToGlobal( QPoint( x, y ) ); -+ qic->setMicroFocus(gp.x(), gp.y(), width, height, f); - } - } - #endif -@@ -1424,16 +1420,8 @@ - QWidget *tlw = topLevelWidget(); - if ( tlw->isVisible() && !tlw->topData()->embedded && !qt_deferred_map_contains(tlw) ) { - XSetInputFocus( x11Display(), tlw->winId(), RevertToNone, qt_x_time); -- --#ifndef QT_NO_XIM -- // trigger input context creation if it hasn't happened already -- createInputContext(); -- -- if (tlw->topData()->xic) { -- QInputContext *qic = (QInputContext *) tlw->topData()->xic; -- qic->setFocus(); -- } --#endif -+ // tlw->focusInputContext(); -+ focusInputContext(); - } - } - -@@ -2625,62 +2613,81 @@ - } - - -+/*! -+ \internal -+ This is an internal function, you should never call this. -+ -+ This function is called when generating InputContext -+ according to a configuration of default InputMethod. -+ (e.g. when setMicroFocusHint() and so on is executed.) -+ -+ InputContext is generated only when isInputMethodEnabled() -+ return TRUE. -+*/ - void QWidget::createInputContext() - { -+ if( !isInputMethodEnabled() ) -+ return; -+ - QWidget *tlw = topLevelWidget(); - QTLWExtra *topdata = tlw->topData(); - --#ifndef QT_NO_XIM -- if (qt_xim) { -- if (! topdata->xic) { -- QInputContext *qic = new QInputContext(tlw); -- topdata->xic = (void *) qic; -- } -- } else --#endif // QT_NO_XIM -- { -- // qDebug("QWidget::createInputContext: no xim"); -- topdata->xic = 0; -- } -+#ifndef QT_NO_IM -+ if (! topdata->xic) { -+ // InputContext corresponding to the name of default -+ // InputMethod of the Application in present is generated. -+ QInputContext *qic = QInputContextFactory::create(defaultIM, tlw); -+ -+ topdata->xic = (void *) qic; -+ } -+#endif // QT_NO_IM - } - - - void QWidget::destroyInputContext() - { --#ifndef QT_NO_XIM -+#ifndef QT_NO_IM - QInputContext *qic = (QInputContext *) extra->topextra->xic; -- delete qic; --#endif // QT_NO_XIM -+ if(qic) -+ delete qic; -+ -+#endif // QT_NO_IM - extra->topextra->xic = 0; - } - - - /*! -- This function is called when the user finishes input composition, -- e.g. changes focus to another widget, moves the cursor, etc. -+ This function is called when text widgets need to be neutral state to -+ execute text operations properly. See qlineedit.cpp and qtextedit.cpp as -+ example. Ordinary reset such as along with changes focus to another -+ widget, moves the cursor, etc, is implicitly handled via -+ unfocusInputContext() because whether reset or not when such situation is -+ a responsibility of input methods. For example, Japanese input context -+ should not be reset when focus out. The context sometimes contains a whole -+ paragraph and has minutes of lifetime different to ephemeral one in other -+ languages. The input context should be survived until focused again. So we -+ delegate the responsibility to the input context via unfocusInputContext(). - */ - void QWidget::resetInputContext() - { --#ifndef QT_NO_XIM -- if (qt_xim_style & XIMPreeditCallbacks) { -- QWidget *tlw = topLevelWidget(); -- QTLWExtra *topdata = tlw->topData(); -+#ifndef QT_NO_IM -+ QWidget *tlw = topLevelWidget(); -+ QTLWExtra *topdata = tlw->topData(); - -- // trigger input context creation if it hasn't happened already -- createInputContext(); -+ // trigger input context creation if it hasn't happened already -+ createInputContext(); - -- if (topdata->xic) { -- QInputContext *qic = (QInputContext *) topdata->xic; -- qic->reset(); -- } -+ if (topdata->xic) { -+ QInputContext *qic = (QInputContext *) topdata->xic; -+ qic->reset(); - } --#endif // QT_NO_XIM -+#endif // QT_NO_IM - } - - - void QWidget::focusInputContext() - { --#ifndef QT_NO_XIM -+#ifndef QT_NO_IM - QWidget *tlw = topLevelWidget(); - QTLWExtra *topdata = tlw->topData(); - -@@ -2689,11 +2696,56 @@ - - if (topdata->xic) { - QInputContext *qic = (QInputContext *) topdata->xic; -+ -+ if( qic->focusWidget() != this) -+ qic->setFocusWidget( this ); - qic->setFocus(); - } --#endif // QT_NO_XIM -+#endif // QT_NO_IM - } - -+ -+void QWidget::unfocusInputContext() -+{ -+#ifndef QT_NO_IM -+ QWidget *tlw = topLevelWidget(); -+ QTLWExtra *topdata = tlw->topData(); -+ -+ // trigger input context creation if it hasn't happened already -+ createInputContext(); -+ -+ if (topdata->xic) { -+ QInputContext *qic = (QInputContext *) topdata->xic; -+ -+ // may be caused reset() in some input methods -+ qic->unsetFocus(); -+ qic->setFocusWidget( 0 ); -+ } -+#endif // QT_NO_IM -+} -+ -+ -+void QWidget::sendMouseEventToInputContext( int x, QEvent::Type type, -+ Qt::ButtonState button, -+ Qt::ButtonState state ) -+{ -+#ifndef QT_NO_IM -+ QWidget *tlw = topLevelWidget(); -+ QTLWExtra *topdata = tlw->topData(); -+ -+ // trigger input context creation if it hasn't happened already -+ createInputContext(); -+ -+ if (topdata->xic) { -+ QInputContext *qic = (QInputContext *) topdata->xic; -+ -+ // may be causing reset() in some input methods -+ qic->mouseHandler( x, type, button, state ); -+ } -+#endif // QT_NO_IM -+} -+ -+ - void QWidget::setWindowOpacity(double) - { - } -diff -urN qt-x11-free-3.3.2/src/qt.pro qt-x11-immodule-bc/src/qt.pro ---- qt-x11-free-3.3.2/src/qt.pro 2004-03-01 19:20:58.000000000 +0900 -+++ qt-x11-immodule-bc/src/qt.pro 2004-06-23 01:10:27.085119576 +0900 -@@ -37,6 +37,7 @@ - TOOLS_CPP = tools - CODECS_CPP = codecs - WORKSPACE_CPP = workspace -+INPUT_CPP = input - XML_CPP = xml - STYLES_CPP = styles - EMBEDDED_CPP = embedded -@@ -54,6 +55,7 @@ - TOOLS_H = $$TOOLS_CPP - CODECS_H = $$CODECS_CPP - WORKSPACE_H = $$WORKSPACE_CPP -+ #INPUT_H = $$INPUT_CPP - XML_H = $$XML_CPP - CANVAS_H = $$CANVAS_CPP - STYLES_H = $$STYLES_CPP -@@ -70,6 +72,7 @@ - TOOLS_H = $$WIN_ALL_H - CODECS_H = $$WIN_ALL_H - WORKSPACE_H = $$WIN_ALL_H -+ #INPUT_H = $$WIN_ALL_H - XML_H = $$WIN_ALL_H - CANVAS_H = $$WIN_ALL_H - STYLES_H = $$WIN_ALL_H -@@ -98,6 +101,7 @@ - TOOLS_H = $$TOOLS_CPP - CODECS_H = $$CODECS_CPP - WORKSPACE_H = $$WORKSPACE_CPP -+ INPUT_H = $$INPUT_CPP - XML_H = $$XML_CPP - STYLES_H = $$STYLES_CPP - !embedded:!mac:CONFIG += x11 x11inc -@@ -112,7 +116,7 @@ - EMBEDDED_H = $$EMBEDDED_CPP - } - --DEPENDPATH += ;$$NETWORK_H;$$KERNEL_H;$$WIDGETS_H;$$SQL_H;$$TABLE_H;$$DIALOGS_H; -+DEPENDPATH += ;$$NETWORK_H;$$KERNEL_H;$$WIDGETS_H;$$INPUT_H;$$SQL_H;$$TABLE_H;$$DIALOGS_H; - DEPENDPATH += $$ICONVIEW_H;$$OPENGL_H;$$TOOLS_H;$$CODECS_H;$$WORKSPACE_H;$$XML_H; - DEPENDPATH += $$CANVAS_H;$$STYLES_H - embedded:DEPENDPATH += ;$$EMBEDDED_H -@@ -147,6 +151,7 @@ - include($$DIALOGS_CPP/qt_dialogs.pri) - include($$ICONVIEW_CPP/qt_iconview.pri) - include($$WORKSPACE_CPP/qt_workspace.pri) -+include($$INPUT_CPP/qt_input.pri) - include($$NETWORK_CPP/qt_network.pri) - include($$CANVAS_CPP/qt_canvas.pri) - include($$TABLE_CPP/qt_table.pri) -diff -urN qt-x11-free-3.3.2/src/widgets/qlineedit.cpp qt-x11-immodule-bc/src/widgets/qlineedit.cpp ---- qt-x11-free-3.3.2/src/widgets/qlineedit.cpp 2004-04-19 18:36:19.000000000 +0900 -+++ qt-x11-immodule-bc/src/widgets/qlineedit.cpp 2004-06-23 01:10:27.087119272 +0900 -@@ -245,12 +245,17 @@ - - // input methods - int imstart, imend, imselstart, imselend; -+ bool composeMode() const { return preeditLength(); } -+ bool hasIMSelection() const { return imSelectionLength(); } -+ int preeditLength() const { return ( imend - imstart ); } -+ int imSelectionLength() const { return ( imselend - imselstart ); } - - // complex text layout - QTextLayout textLayout; - void updateTextLayout(); - void moveCursor( int pos, bool mark = FALSE ); - void setText( const QString& txt ); -+ int xToPosInternal( int x, QTextItem::CursorPosition ) const; - int xToPos( int x, QTextItem::CursorPosition = QTextItem::BetweenCharacters ) const; - inline int visualAlignment() const { return alignment ? alignment : int( isRightToLeft() ? AlignRight : AlignLeft ); } - QRect cursorRect() const; -@@ -1411,6 +1416,8 @@ - */ - void QLineEdit::mousePressEvent( QMouseEvent* e ) - { -+ if ( sendMouseEventToInputContext( e ) ) -+ return; - if ( e->button() == RightButton ) - return; - if ( d->tripleClickTimer && ( e->pos() - d->tripleClick ).manhattanLength() < -@@ -1440,7 +1447,8 @@ - */ - void QLineEdit::mouseMoveEvent( QMouseEvent * e ) - { -- -+ if ( sendMouseEventToInputContext( e ) ) -+ return; - #ifndef QT_NO_CURSOR - if ( ( e->state() & MouseButtonMask ) == 0 ) { - if ( !d->readOnly && d->dragEnabled -@@ -1469,6 +1477,8 @@ - */ - void QLineEdit::mouseReleaseEvent( QMouseEvent* e ) - { -+ if ( sendMouseEventToInputContext( e ) ) -+ return; - #ifndef QT_NO_DRAGANDDROP - if ( e->button() == LeftButton ) { - if ( d->dndTimer ) { -@@ -1495,6 +1505,8 @@ - */ - void QLineEdit::mouseDoubleClickEvent( QMouseEvent* e ) - { -+ if ( sendMouseEventToInputContext( e ) ) -+ return; - if ( e->button() == Qt::LeftButton ) { - deselect(); - d->cursor = d->xToPos( e->pos().x() ); -@@ -1763,6 +1775,33 @@ - e->ignore(); - } - -+ -+/*! -+ This function is not intended as polymorphic usage. Just a shared code -+ fragment that calls QWidget::sendMouseEventToInputContext() as easy for this -+ class. -+ */ -+bool QLineEdit::sendMouseEventToInputContext( QMouseEvent *e ) -+{ -+#ifndef QT_NO_IM -+ if ( d->composeMode() ) { -+ int cursor = d->xToPosInternal( e->pos().x(), QTextItem::OnCharacters ); -+ int mousePos = cursor - d->imstart; -+ if ( mousePos >= 0 && mousePos < d->preeditLength() ) { -+ QWidget::sendMouseEventToInputContext( mousePos, e->type(), -+ e->button(), e->state() ); -+ } else if ( e->type() != QEvent::MouseMove ) { -+ // send button events on out of preedit -+ QWidget::sendMouseEventToInputContext( -1, e->type(), -+ e->button(), e->state() ); -+ } -+ return TRUE; -+ } -+#endif -+ return FALSE; -+} -+ -+ - /*! \reimp - */ - void QLineEdit::imStartEvent( QIMEvent *e ) -@@ -1788,7 +1827,16 @@ - d->imend = d->imstart + e->text().length(); - d->imselstart = d->imstart + e->cursorPos(); - d->imselend = d->imselstart + e->selectionLength(); -+#if 0 - d->cursor = e->selectionLength() ? d->imend : d->imselend; -+#else -+ // Cursor placement code is changed for Asian input method that -+ // shows candidate window. This behavior is same as Qt/E 2.3.7 -+ // which supports Asian input methods. Asian input methods need -+ // start point of IM selection text to place candidate window as -+ // adjacent to the selection text. -+ d->cursor = d->imselstart; -+#endif - d->updateTextLayout(); - update(); - } -@@ -1822,6 +1870,8 @@ - } - if( !hasSelectedText() || style().styleHint( QStyle::SH_BlinkCursorWhenTextSelected ) ) - d->setCursorVisible( TRUE ); -+ if ( d->hasIMSelection() ) -+ d->cursor = d->imselstart; - d->updateMicroFocusHint(); - } - -@@ -1898,6 +1948,14 @@ - } else if ( widthUsed - d->hscroll < lineRect.width() ) { - d->hscroll = widthUsed - lineRect.width() + 1; - } -+ // This updateMicroFocusHint() is corresponding to update() at -+ // IMCompose event. Although the function is invoked from various -+ // other points, some situations such as "candidate selection on -+ // AlignHCenter'ed text" need this invocation because -+ // updateMicroFocusHint() requires updated contentsRect(), and -+ // there are no other chances in such situation that invoke the -+ // function. -+ d->updateMicroFocusHint(); - // the y offset is there to keep the baseline constant in case we have script changes in the text. - QPoint topLeft = lineRect.topLeft() - QPoint(d->hscroll, d->ascent-fm.ascent()); - -@@ -1938,7 +1996,7 @@ - } - - // input method edit area -- if ( d->imstart < d->imend && (last >= d->imstart && first < d->imend ) ) { -+ if ( d->composeMode() && (last >= d->imstart && first < d->imend ) ) { - QRect highlight = QRect( QPoint( tix + ti.cursorToX( QMAX( d->imstart - first, 0 ) ), lineRect.top() ), - QPoint( tix + ti.cursorToX( QMIN( d->imend - first, last - first + 1 ) )-1, lineRect.bottom() ) ).normalize(); - p->save(); -@@ -1951,11 +2009,16 @@ - imCol.setHsv( h1, s1, ( v1 + v2 ) / 2 ); - p->fillRect( highlight, imCol ); - p->drawTextItem( topLeft, ti, textflags ); -+ // draw preedit's underline -+ if (d->imend - d->imstart > 0) { -+ p->setPen( cg.text() ); -+ p->drawLine( highlight.bottomLeft(), highlight.bottomRight() ); -+ } - p->restore(); - } - - // input method selection -- if ( d->imselstart < d->imselend && (last >= d->imselstart && first < d->imselend ) ) { -+ if ( d->hasIMSelection() && (last >= d->imselstart && first < d->imselend ) ) { - QRect highlight = QRect( QPoint( tix + ti.cursorToX( QMAX( d->imselstart - first, 0 ) ), lineRect.top() ), - QPoint( tix + ti.cursorToX( QMIN( d->imselend - first, last - first + 1 ) )-1, lineRect.bottom() ) ).normalize(); - p->save(); -@@ -1982,7 +2045,11 @@ - } - - // draw cursor -- if ( d->cursorVisible && !supressCursor ) { -+ // -+ // Asian users regard IM selection text as cursor on candidate -+ // selection phase of input method, so ordinary cursor should be -+ // invisible if IM selection text exists. -+ if ( d->cursorVisible && !supressCursor && !d->hasIMSelection() ) { - QPoint from( topLeft.x() + cix, lineRect.top() ); - QPoint to = from + QPoint( 0, lineRect.height() ); - p->drawLine( from, to ); -@@ -2090,6 +2157,10 @@ - void QLineEdit::contextMenuEvent( QContextMenuEvent * e ) - { - #ifndef QT_NO_POPUPMENU -+#ifndef QT_NO_IM -+ if ( d->composeMode() ) -+ return; -+#endif - d->separate(); - - QGuardedPtr<QPopupMenu> popup = createPopupMenu(); -@@ -2274,7 +2345,7 @@ - textLayout.endLine(0, 0, Qt::AlignLeft|Qt::SingleLine, &ascent); - } - --int QLineEditPrivate::xToPos( int x, QTextItem::CursorPosition betweenOrOn ) const -+int QLineEditPrivate::xToPosInternal( int x, QTextItem::CursorPosition betweenOrOn ) const - { - x-= q->contentsRect().x() - hscroll + innerMargin; - for ( int i = 0; i < textLayout.numItems(); ++i ) { -@@ -2283,7 +2354,13 @@ - if ( x >= tir.left() && x <= tir.right() ) - return ti.xToCursor( x - tir.x(), betweenOrOn ) + ti.from(); - } -- return x < 0 ? 0 : text.length(); -+ return x < 0 ? -1 : text.length(); -+} -+ -+int QLineEditPrivate::xToPos( int x, QTextItem::CursorPosition betweenOrOn ) const -+{ -+ int pos = xToPosInternal( x, betweenOrOn ); -+ return ( pos < 0 ) ? 0 : pos; - } - - -diff -urN qt-x11-free-3.3.2/src/widgets/qlineedit.h qt-x11-immodule-bc/src/widgets/qlineedit.h ---- qt-x11-free-3.3.2/src/widgets/qlineedit.h 2004-04-19 18:36:18.000000000 +0900 -+++ qt-x11-immodule-bc/src/widgets/qlineedit.h 2004-06-23 01:10:27.087119272 +0900 -@@ -196,6 +196,7 @@ - void dropEvent( QDropEvent * ); - #endif - void contextMenuEvent( QContextMenuEvent * ); -+ bool sendMouseEventToInputContext( QMouseEvent *e ); - virtual QPopupMenu *createPopupMenu(); - void windowActivationChange( bool ); - #ifndef QT_NO_COMPAT -diff -urN qt-x11-free-3.3.2/src/widgets/qtextedit.cpp qt-x11-immodule-bc/src/widgets/qtextedit.cpp ---- qt-x11-free-3.3.2/src/widgets/qtextedit.cpp 2004-04-19 18:36:18.000000000 +0900 -+++ qt-x11-immodule-bc/src/widgets/qtextedit.cpp 2004-06-23 01:10:27.091118664 +0900 -@@ -107,6 +107,8 @@ - int id[ 7 ]; - int preeditStart; - int preeditLength; -+ bool composeMode() const { return ( preeditLength > 0 ); } -+ - uint ensureCursorVisibleInShowEvent : 1; - uint tabChangesFocus : 1; - QString scrollToAnchor; // used to deferr scrollToAnchor() until the show event when we are resized -@@ -1080,6 +1082,10 @@ - l += v; - } - } -+ -+ // This invocation is required to follow dragging of active window -+ // by the showed candidate window. -+ updateMicroFocusHint(); - } - - /*! -@@ -1554,6 +1560,35 @@ - } - - /*! -+ This function is not intended as polymorphic usage. Just a shared code -+ fragment that calls QWidget::sendMouseEventToInputContext() as easy for this -+ class. -+ */ -+bool QTextEdit::sendMouseEventToInputContext( QMouseEvent *e ) -+{ -+#ifndef QT_NO_IM -+ if ( d->composeMode() ) { -+ QTextCursor c( doc ); -+ if ( c.place( e->pos(), doc->firstParagraph(), FALSE, FALSE, FALSE ) ) { -+ int mousePos = c.index() - d->preeditStart; -+ if ( cursor->globalY() == c.globalY() && -+ mousePos >= 0 && mousePos < d->preeditLength ) { -+ QWidget::sendMouseEventToInputContext( mousePos, e->type(), -+ e->button(), e->state() ); -+ } -+ } else if ( e->type() != QEvent::MouseMove ) { -+ // send button events on out of preedit -+ QWidget::sendMouseEventToInputContext( -1, e->type(), -+ e->button(), e->state() ); -+ } -+ return TRUE; -+ } -+#endif -+ return FALSE; -+} -+ -+ -+/*! - \reimp - */ - void QTextEdit::imStartEvent( QIMEvent *e ) -@@ -1581,10 +1616,16 @@ - doc->removeSelection( QTextDocument::IMCompositionText ); - doc->removeSelection( QTextDocument::IMSelectionText ); - -- if ( d->preeditLength > 0 && cursor->paragraph() ) -+ if ( d->composeMode() && cursor->paragraph() ) - cursor->paragraph()->remove( d->preeditStart, d->preeditLength ); - cursor->setIndex( d->preeditStart ); -- insert( e->text() ); -+ -+ int sellen = e->selectionLength(); -+ uint insertionFlags = CheckNewLines | RemoveSelected | AsIMCompositionText; -+ if ( sellen > 0 ) { -+ insertionFlags |= WithIMSelection; -+ } -+ insert( e->text(), insertionFlags ); - d->preeditLength = e->text().length(); - - cursor->setIndex( d->preeditStart + d->preeditLength ); -@@ -1595,17 +1636,28 @@ - - cursor->setIndex( d->preeditStart + e->cursorPos() ); - -- int sellen = e->selectionLength(); - if ( sellen > 0 ) { - cursor->setIndex( d->preeditStart + e->cursorPos() + sellen ); - c = *cursor; - cursor->setIndex( d->preeditStart + e->cursorPos() ); - doc->setSelectionStart( QTextDocument::IMSelectionText, *cursor ); - doc->setSelectionEnd( QTextDocument::IMSelectionText, c ); -+#if 0 -+ // Disabled for Asian input method that shows candidate -+ // window. This behavior is same as Qt/E 2.3.7 which supports -+ // Asian input methods. Asian input methods need start point -+ // of IM selection text to place candidate window as adjacent -+ // to the selection text. - cursor->setIndex( d->preeditStart + d->preeditLength ); -+#endif - } - - repaintChanged(); -+ -+ // microFocusHint is required to place candidate window for Asian -+ // input methods. Cursor position and IM selection text are -+ // updated by the event. -+ updateMicroFocusHint(); - } - - /*! -@@ -1618,10 +1670,12 @@ - return; - } - -+ qWarning( "receiving IMEnd with %d chars", e->text().length() ); -+ - doc->removeSelection( QTextDocument::IMCompositionText ); - doc->removeSelection( QTextDocument::IMSelectionText ); - -- if ( d->preeditLength > 0 && cursor->paragraph() ) -+ if ( d->composeMode() && cursor->paragraph() ) - cursor->paragraph()->remove( d->preeditStart, d->preeditLength ); - if ( d->preeditStart >= 0 ) { - cursor->setIndex( d->preeditStart ); -@@ -2113,6 +2167,13 @@ - isReadOnly() ) - return; - -+ // Asian users regard selection text as cursor on candidate -+ // selection phase of input method, so ordinary cursor should be -+ // invisible if IM selection text exists. -+ if ( doc->hasSelection( QTextDocument::IMSelectionText ) ) { -+ visible = FALSE; -+ } -+ - QPainter p( viewport() ); - QRect r( cursor->topParagraph()->rect() ); - cursor->paragraph()->setChanged( TRUE ); -@@ -2187,6 +2248,9 @@ - } - #endif - -+ if ( sendMouseEventToInputContext( e ) ) -+ return; -+ - if ( d->trippleClickTimer->isActive() && - ( e->globalPos() - d->trippleClickPoint ).manhattanLength() < - QApplication::startDragDistance() ) { -@@ -2292,7 +2356,9 @@ - return; - } - #endif -- if ( mousePressed ) { -+ if ( sendMouseEventToInputContext( e ) ) { -+ // running through intended to avoid cursor vanishing -+ } else if ( mousePressed ) { - #ifndef QT_NO_DRAGANDDROP - if ( mightStartDrag ) { - dragStartTimer->stop(); -@@ -2345,7 +2411,7 @@ - - void QTextEdit::contentsMouseReleaseEvent( QMouseEvent * e ) - { -- if ( !inDoubleClick ) { // could be the release of a dblclick -+ if ( !inDoubleClick && !d->composeMode() ) { // could be the release of a dblclick - int para = 0; - int index = charAt( e->pos(), ¶ ); - emit clicked( para, index ); -@@ -2356,6 +2422,8 @@ - return; - } - #endif -+ if ( sendMouseEventToInputContext( e ) ) -+ return; - QTextCursor oldCursor = *cursor; - if ( scrollTimer->isActive() ) - scrollTimer->stop(); -@@ -2448,7 +2516,7 @@ - - void QTextEdit::contentsMouseDoubleClickEvent( QMouseEvent * e ) - { -- if ( e->button() != Qt::LeftButton ) { -+ if ( e->button() != Qt::LeftButton && !d->composeMode() ) { - e->ignore(); - return; - } -@@ -2479,6 +2547,9 @@ - } else - #endif - { -+ if ( sendMouseEventToInputContext( e ) ) -+ return; -+ - QTextCursor c1 = *cursor; - QTextCursor c2 = *cursor; - #if defined(Q_OS_MAC) -@@ -2653,10 +2724,15 @@ - */ - void QTextEdit::contentsContextMenuEvent( QContextMenuEvent *e ) - { -+ e->accept(); -+#ifndef QT_NO_IM -+ if ( d->composeMode() ) -+ return; -+#endif -+ - clearUndoRedo(); - mousePressed = FALSE; - -- e->accept(); - #ifndef QT_NO_POPUPMENU - QPopupMenu *popup = createPopupMenu( e->pos() ); - if ( !popup ) -@@ -2802,8 +2878,15 @@ - void QTextEdit::updateMicroFocusHint() - { - QTextCursor c( *cursor ); -+#if 0 -+ // Disabled for Asian input method that shows candidate -+ // window. This behavior is same as Qt/E 2.3.7 which supports -+ // Asian input methods. Asian input methods need start point of IM -+ // selection text to place candidate window as adjacent to the -+ // selection text. - if ( d->preeditStart != -1 ) - c.setIndex( d->preeditStart ); -+#endif - - if ( hasFocus() || viewport()->hasFocus() ) { - int h = c.paragraph()->lineHeightOfChar( cursor->index() ); -@@ -2968,6 +3051,8 @@ - bool indent = insertionFlags & RedoIndentation; - bool checkNewLine = insertionFlags & CheckNewLines; - bool removeSelected = insertionFlags & RemoveSelected; -+ bool imComposition = insertionFlags & AsIMCompositionText; -+ bool imSelection = insertionFlags & WithIMSelection; - QString txt( text ); - drawCursor( FALSE ); - if ( !isReadOnly() && doc->hasSelection( QTextDocument::Standard ) && removeSelected ) -@@ -3001,7 +3086,10 @@ - formatMore(); - repaintChanged(); - ensureCursorVisible(); -- drawCursor( TRUE ); -+ // Asian users regard selection text as cursor on candidate -+ // selection phase of input method, so ordinary cursor should be -+ // invisible if IM selection text exists. -+ drawCursor( !imSelection ); - - if ( undoEnabled && !isReadOnly() ) { - undoRedoInfo.d->text += txt; -@@ -3023,7 +3111,13 @@ - doc->setSelectionEnd( QTextDocument::Standard, *cursor ); - repaintChanged(); - } -- updateMicroFocusHint(); -+ // updateMicroFocusHint() should not be invoked here when this -+ // function is invoked from imComposeEvent() because cursor -+ // postion is incorrect yet. imComposeEvent() invokes -+ // updateMicroFocusHint() later. -+ if ( !imComposition ) { -+ updateMicroFocusHint(); -+ } - setModified(); - emit textChanged(); - } -diff -urN qt-x11-free-3.3.2/src/widgets/qtextedit.h qt-x11-immodule-bc/src/widgets/qtextedit.h ---- qt-x11-free-3.3.2/src/widgets/qtextedit.h 2004-04-19 18:36:18.000000000 +0900 -+++ qt-x11-immodule-bc/src/widgets/qtextedit.h 2004-06-23 01:10:27.092118512 +0900 -@@ -211,7 +211,9 @@ - enum TextInsertionFlags { - RedoIndentation = 0x0001, - CheckNewLines = 0x0002, -- RemoveSelected = 0x0004 -+ RemoveSelected = 0x0004, -+ AsIMCompositionText = 0x0008, // internal use -+ WithIMSelection = 0x0010 // internal use - }; - - QTextEdit( const QString& text, const QString& context = QString::null, -@@ -439,6 +441,7 @@ - void contentsDropEvent( QDropEvent *e ); - #endif - void contentsContextMenuEvent( QContextMenuEvent *e ); -+ bool sendMouseEventToInputContext( QMouseEvent *e ); - bool focusNextPrevChild( bool next ); - QTextDocument *document() const; - QTextCursor *textCursor() const; -diff -urN qt-x11-free-3.3.2/tools/qtconfig/mainwindow.cpp qt-x11-immodule-bc/tools/qtconfig/mainwindow.cpp ---- qt-x11-free-3.3.2/tools/qtconfig/mainwindow.cpp 2003-12-08 18:49:15.000000000 +0900 -+++ qt-x11-immodule-bc/tools/qtconfig/mainwindow.cpp 2004-06-23 01:10:27.093118360 +0900 -@@ -27,6 +27,7 @@ - #include <qapplication.h> - #include <qcombobox.h> - #include <qstylefactory.h> -+#include <qinputcontextfactory.h> - #include <qobjectlist.h> - #include <qfontdatabase.h> - #include <qlineedit.h> -@@ -362,9 +363,50 @@ - - #ifdef Q_WS_X11 - inputStyle->setCurrentText( settings.readEntry( "/qt/XIMInputStyle", trUtf8( "On The Spot" ) ) ); -+ -+ -+ /* -+ This code makes it possible to set up default InputMethod. -+ -+ The list of names of InputMethod which can be used is acquired -+ using QInputContextFactory::keys(). And it is set to inputMethodCombo -+ which displays the list of InputMethod. -+ */ -+ QStringList inputmethods = QInputContextFactory::keys(); -+ inputmethods.sort(); -+ inputMethodCombo->insertStringList(inputmethods); -+ -+ /* -+ InputMethod set up as a default in the past is chosen. -+ If nothing is set up, default InputMethod in the platform is chosen. -+ */ -+ QString currentIM = settings.readEntry("/qt/DefaultInputMethod"); -+ if (currentIM.isNull()) -+ currentIM = "XIM"; // default InputMethod is XIM in X11. -+ { -+ int s = 0; -+ QStringList::Iterator imIt = inputmethods.begin(); -+ while (imIt != inputmethods.end()) { -+ if (*imIt == currentIM) -+ break; -+ s++; -+ imIt++; -+ } -+ -+ // set up Selected InputMethod. -+ if (s < inputMethodCombo->count()) { -+ inputMethodCombo->setCurrentItem(s); -+ } else { -+ // we give up. But, probably this code is not executed. -+ inputMethodCombo->insertItem("Unknown"); -+ inputMethodCombo->setCurrentItem(inputMethodCombo->count() - 1); -+ } -+ } - #else - inputStyle->hide(); - inputStyleLabel->hide(); -+ inputMethodCombo->hide(); -+ inputMethodLabel->hide(); - #endif - - fontembeddingcheckbox->setChecked( settings.readBoolEntry("/qt/embedFonts", TRUE) ); -@@ -443,6 +485,8 @@ - else if ( style == trUtf8( "Root" ) ) - str = "Root"; - settings.writeEntry( "/qt/XIMInputStyle", inputStyle->currentText() ); -+ -+ settings.writeEntry("/qt/DefaultInputMethod", inputMethodCombo->currentText()); - #endif - - QStringList effects; -diff -urN qt-x11-free-3.3.2/tools/qtconfig/mainwindowbase.ui qt-x11-immodule-bc/tools/qtconfig/mainwindowbase.ui ---- qt-x11-free-3.3.2/tools/qtconfig/mainwindowbase.ui 2003-11-12 05:01:02.000000000 +0900 -+++ qt-x11-immodule-bc/tools/qtconfig/mainwindowbase.ui 2004-06-23 01:10:27.094118208 +0900 -@@ -1016,6 +1016,19 @@ - <number>0</number> - </property> - </widget> -+ <widget class="QLabel"> -+ <property name="name"> -+ <cstring>inputMethodLabel</cstring> -+ </property> -+ <property name="text"> -+ <string>Default Input Method:</string> -+ </property> -+ </widget> -+ <widget class="QComboBox"> -+ <property name="name"> -+ <cstring>inputMethodCombo</cstring> -+ </property> -+ </widget> - <spacer> - <property name="name"> - <cstring>spacer5</cstring> -@@ -1029,7 +1042,7 @@ - <property name="sizeHint"> - <size> - <width>20</width> -- <height>40</height> -+ <height>30</height> - </size> - </property> - </spacer> -@@ -1705,6 +1718,12 @@ - <slot>somethingModified()</slot> - </connection> - <connection> -+ <sender>inputMethodCombo</sender> -+ <signal>activated(int)</signal> -+ <receiver>MainWindowBase</receiver> -+ <slot>somethingModified()</slot> -+ </connection> -+ <connection> - <sender>gstylecombo</sender> - <signal>activated(const QString&)</signal> - <receiver>MainWindowBase</receiver> diff --git a/x11-libs/qt/qt-3.3.2.ebuild b/x11-libs/qt/qt-3.3.2.ebuild index 4a7b55e3f645..55e781cfc603 100644 --- a/x11-libs/qt/qt-3.3.2.ebuild +++ b/x11-libs/qt/qt-3.3.2.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/x11-libs/qt/qt-3.3.2.ebuild,v 1.14 2004/08/06 00:34:08 arj Exp $ +# $Header: /var/cvsroot/gentoo-x86/x11-libs/qt/qt-3.3.2.ebuild,v 1.15 2004/08/16 13:52:54 usata Exp $ inherit eutils @@ -8,7 +8,12 @@ SRCTYPE="free" DESCRIPTION="QT version ${PV}" HOMEPAGE="http://www.trolltech.com/" -SRC_URI="ftp://ftp.trolltech.com/qt/source/qt-x11-${SRCTYPE}-${PV}.tar.bz2" +IMMQT_P="qt-x11-immodule-unified-qt3.3.2-20040814" +# If you want to build qt-immodule against Qt 3.3.3, you will also need +# qt-x11-free-3.3.3-complemental-patch-for-immodule-20040814.diff + +SRC_URI="ftp://ftp.trolltech.com/qt/source/qt-x11-${SRCTYPE}-${PV}.tar.bz2 + cjk? ( http://freedesktop.org/Software/ImmoduleQtDownload/${IMMQT_P}.diff.gz )" LICENSE="QPL-1.0 | GPL-2" SLOT="3" @@ -50,15 +55,8 @@ src_unpack() { epatch ${FILESDIR}/qt-no-rpath-uic.patch if use cjk ; then - epatch ${FILESDIR}/qt-x11-immodule-bc-qt3.3.2-20040623.diff - pushd include/ - ln -s ../src/kernel/qinputcontext.h . - ln -s ../src/input/qinputcontextfactory.h . - ln -s ../src/input/qinputcontextplugin.h . - cd private/ - ln -s ../../src/input/qinputcontextinterface_p.h . - ln -s ../../src/input/qximinputcontext_p.h . - popd + epatch ../${IMMQT_P}.diff + sh make-symlinks.sh || die "make symlinks failed" fi # mips requires this patch to pass a CFLAG to gcc/g++ (which passes it to the assembler). @@ -91,6 +89,7 @@ src_compile() { use xinerama && myconf="${myconf} -xinerama" || myconf="${myconf} -no-xinerama" use zlib && myconf="${myconf} -system-zlib" || myconf="${myconf} -qt-zlib" use ipv6 && myconf="${myconf} -ipv6" || myconf="${myconf} -no-ipv6" + use cjk && myconf="${myconf} -im" export YACC='byacc -d' |