summaryrefslogtreecommitdiffstats
path: root/tqtinterface/qt4/plugins/src/inputmethods/xim/tqximinputcontext_x11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqtinterface/qt4/plugins/src/inputmethods/xim/tqximinputcontext_x11.cpp')
-rw-r--r--tqtinterface/qt4/plugins/src/inputmethods/xim/tqximinputcontext_x11.cpp930
1 files changed, 0 insertions, 930 deletions
diff --git a/tqtinterface/qt4/plugins/src/inputmethods/xim/tqximinputcontext_x11.cpp b/tqtinterface/qt4/plugins/src/inputmethods/xim/tqximinputcontext_x11.cpp
deleted file mode 100644
index 66e4597..0000000
--- a/tqtinterface/qt4/plugins/src/inputmethods/xim/tqximinputcontext_x11.cpp
+++ /dev/null
@@ -1,930 +0,0 @@
-/****************************************************************************
-** $Id: qximinputcontext_x11.cpp,v 1.10 2004/06/22 06:47:27 daisuke Exp $
-**
-** Implementation of TQXIMInputContext class
-**
-** Copyright (C) 2000-2003 Trolltech AS. All rights reserved.
-**
-** This file is part of the input method module of the TQt 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.TQPL 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 TQt Enterprise Edition or TQt Professional Edition
-** licenses for Unix/X11 may use this file in accordance with the TQt 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 TQt Commercial License Agreements.
-** See http://www.trolltech.com/qpl/ for TQPL 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 "tqximinputcontext.h"
-
-const int XKeyPress = KeyPress;
-const int XKeyRelease = KeyRelease;
-#undef KeyPress
-#undef KeyRelease
-
-#if !defined(TQT_NO_IM)
-
-#include "tqplatformdefs.h"
-
-#include "tqapplication.h"
-#include "tqwidget.h"
-#include "tqstring.h"
-#include "tqptrlist.h"
-#include "tqintdict.h"
-#include "tqtextcodec.h"
-
-#include <stdlib.h>
-#include <limits.h>
-
-#if !defined(TQT_NO_XIM)
-
-#define XK_MISCELLANY
-#define XK_LATIN1
-#include <X11/keysymdef.h>
-
-// #define TQT_XIM_DEBUG
-
-// from qapplication_x11.cpp
-static XIM qt_xim = 0;
-extern XIMStyle qt_xim_style;
-extern XIMStyle qt_xim_preferred_style;
-extern char *qt_ximServer;
-static bool isInitXIM = FALSE;
-static TQPtrList<TQXIMInputContext> *ximContextList = 0;
-#endif
-extern int qt_ximComposingKeycode;
-extern TQTextCodec * qt_input_mapper;
-
-
-#if !defined(TQT_NO_XIM)
-
-#if defined(TQ_C_CALLBACKS)
-extern "C" {
-#endif // TQ_C_CALLBACKS
-
-#ifdef USE_X11R6_XIM
- static void xim_create_callback(XIM /*im*/,
- XPointer /*client_data*/,
- XPointer /*call_data*/)
- {
- // qDebug("xim_create_callback");
- TQXIMInputContext::create_xim();
- }
-
- static void xim_destroy_callback(XIM /*im*/,
- XPointer /*client_data*/,
- XPointer /*call_data*/)
- {
- // qDebug("xim_destroy_callback");
- TQXIMInputContext::close_xim();
- Display *dpy = TQPaintDevice::x11AppDisplay();
- XRegisterIMInstantiateCallback(dpy, 0, 0, 0,
- (XIMProc) xim_create_callback, 0);
- }
-
-#endif // USE_X11R6_XIM
-
-#if defined(TQ_C_CALLBACKS)
-}
-#endif // TQ_C_CALLBACKS
-
-#endif // TQT_NO_XIM
-
-#ifndef TQT_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 TQFont &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 = TQPaintDevice::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 TQ_C_CALLBACKS
-extern "C" {
-#endif // TQ_C_CALLBACKS
-
- // These static functions should be rewritten as member of
- // TQXIMInputContext
-
- static int xic_start_callback(XIC, XPointer client_data, XPointer) {
- TQXIMInputContext *qic = (TQXIMInputContext *) client_data;
- if (! qic) {
-#ifdef TQT_XIM_DEBUG
- qDebug("compose start: no qic");
-#endif // TQT_XIM_DEBUG
-
- return 0;
- }
-
- qic->resetClientState();
- qic->sendIMEvent( TQEvent::IMStart );
-
-#ifdef TQT_XIM_DEBUG
- qDebug("compose start");
-#endif // TQT_XIM_DEBUG
-
- return 0;
- }
-
- static int xic_draw_callback(XIC, XPointer client_data, XPointer call_data) {
- TQXIMInputContext *qic = (TQXIMInputContext *) client_data;
- if (! qic) {
-#ifdef TQT_XIM_DEBUG
- qDebug("compose event: invalid compose event %p", qic);
-#endif // TQT_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 TQT_XIM_DEBUG
- qDebug( "compose event: invalid compose event composing=%d hasFocus=%d",
- qic->isComposing(), qic->hasFocus() );
-#endif // TQT_XIM_DEBUG
-
- return 0;
- }
-
- if ( send_imstart )
- qic->sendIMEvent( TQEvent::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 TQT_XIM_DEBUG
- qDebug( "compose emptied" );
-#endif // TQT_XIM_DEBUG
- // if the composition string has been emptied, we need
- // to send an IMEnd event
- qic->sendIMEvent( TQEvent::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;
-
- TQString s = TQString::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 < TQMIN(qic->composingText.length(), 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 TQT_XIM_DEBUG
- qDebug( "compose emptied" );
-#endif // TQT_XIM_DEBUG
- // if the composition string has been emptied, we need
- // to send an IMEnd event
- qic->sendIMEvent( TQEvent::IMEnd );
- qic->resetClientState();
- // if the commit string has coming after here, IMStart
- // will be sent dynamically
- return 0;
- }
- }
-
- qic->sendIMEvent( TQEvent::IMCompose,
- qic->composingText, cursor, sellen );
-
- return 0;
- }
-
- static int xic_done_callback(XIC, XPointer client_data, XPointer) {
- TQXIMInputContext *qic = (TQXIMInputContext *) client_data;
- if (! qic)
- return 0;
-
- // Don't send IMEnd here. TQXIMInputContext::x11FilterEvent()
- // handles IMEnd with commit string.
-#if 0
- if ( qic->isComposing() )
- qic->sendIMEvent( TQEvent::IMEnd );
- qic->resetClientState();
-#endif
-
- return 0;
- }
-
-#ifdef TQ_C_CALLBACKS
-}
-#endif // TQ_C_CALLBACKS
-
-#endif // !TQT_NO_XIM
-
-
-
-TQXIMInputContext::TQXIMInputContext()
- : TQInputContext(), ic(0), fontset(0)
-{
- if(!isInitXIM)
- TQXIMInputContext::init_xim();
-}
-
-
-void TQXIMInputContext::setHolderWidget( TQWidget *widget )
-{
- if ( ! widget )
- return;
-
- TQInputContext::setHolderWidget( widget );
-
-#if !defined(TQT_NO_XIM)
- fontsetRefCount++;
- if (! qt_xim) {
- qWarning("TQInputContext: no input method context available");
- return;
- }
-
- if (! widget->isTopLevel()) {
- // qWarning("TQInputContext: 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 TQPtrList<TQXIMInputContext>;
- ximContextList->append( this );
-#endif // !TQT_NO_XIM
-}
-
-
-TQXIMInputContext::~TQXIMInputContext()
-{
-
-#if !defined(TQT_NO_XIM)
- if (ic)
- XDestroyIC((XIC) ic);
-
- if ( --fontsetRefCount == 0 ) {
- Display *dpy = TQPaintDevice::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 // !TQT_NO_XIM
-
- ic = 0;
-}
-
-void TQXIMInputContext::init_xim()
-{
-#ifndef TQT_NO_XIM
- if(!isInitXIM)
- isInitXIM = TRUE;
-
- qt_xim = 0;
- TQString ximServerName(qt_ximServer);
- if (qt_ximServer)
- ximServerName.prepend("@im=");
- else
- ximServerName = "";
-
- if ( !XSupportsLocale() )
- qWarning("TQt: Locales not supported on X server");
-
-#ifdef USE_X11R6_XIM
- else if ( XSetLocaleModifiers (ximServerName.ascii()) == 0 )
- qWarning( "TQt: Cannot set locale modifiers: %s",
- ximServerName.ascii());
- else {
- Display *dpy = TQPaintDevice::x11AppDisplay();
- XWindowAttributes attr; // XIM unselects all events on the root window
- XGetWindowAttributes( dpy, TQPaintDevice::x11AppRootWindow(),&attr );
- XRegisterIMInstantiateCallback(dpy, 0, 0, 0,
- (XIMProc) xim_create_callback, 0);
- XSelectInput( dpy, TQPaintDevice::x11AppRootWindow(), attr.your_event_mask );
- }
-#else // !USE_X11R6_XIM
- else if ( XSetLocaleModifiers ("") == 0 )
- qWarning("TQt: Cannot set locale modifiers");
- else
- TQXIMInputContext::create_xim();
-#endif // USE_X11R6_XIM
-#endif // TQT_NO_XIM
-}
-
-
-/*! \internal
- Creates the application input method.
- */
-void TQXIMInputContext::create_xim()
-{
-#ifndef TQT_NO_XIM
- Display *appDpy = TQPaintDevice::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] == qt_xim_preferred_style ) {
- qt_xim_style = qt_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("TQApplication: 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.");
- TQXIMInputContext::close_xim();
- }
- }
-#endif // TQT_NO_XIM
-}
-
-
-/*! \internal
- Closes the application input method.
-*/
-void TQXIMInputContext::close_xim()
-{
-#ifndef TQT_NO_XIM
- TQString errMsg( "TQXIMInputContext::close_xim() has been called" );
-
- // Calling XCloseIM gives a Purify FMR error
- // XCloseIM( qt_xim );
- // We prefer a less serious memory leak
-
- qt_xim = 0;
- if( ximContextList ) {
- TQPtrList<TQXIMInputContext> contexts( *ximContextList );
- TQPtrList<TQXIMInputContext>::Iterator it = contexts.begin();
- while( it != contexts.end() ) {
- (*it)->close( errMsg );
- ++it;
- }
- // ximContextList will be deleted in ~TQXIMInputContext
- }
-#endif // TQT_NO_XIM
-}
-
-
-bool TQXIMInputContext::x11FilterEvent( TQWidget *keywidget, XEvent *event )
-{
-#ifndef TQT_NO_XIM
- int xkey_keycode = event->xkey.keycode;
- if ( XFilterEvent( event, keywidget->tqtopLevelWidget()->winId() ) ) {
- qt_ximComposingKeycode = 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.
- */
- TQETWidget *widget = (TQETWidget*)TQWidget::find( (WId)event->xany.window );
- if ( ! keywidget ) {
- keywidget = (TQETWidget*)TQWidget::keyboardGrabber();
- if ( keywidget ) {
- grabbed = TRUE;
- } else {
- if ( focus_widget )
- keywidget = (TQETWidget*)focus_widget;
- if ( !keywidget ) {
- if ( tqApp->inPopupMode() ) // no focus widget, see if we have a popup
- keywidget = (TQETWidget*) tqApp->activePopupWidget();
- else if ( widget )
- keywidget = (TQETWidget*)widget->tqtopLevelWidget();
- }
- }
- }
-
- /*
- 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 && tqfocusWidget && qt_compose_emptied ) {
- XEvent event2;
- bool found = FALSE;
- if ( XCheckTypedEvent( TQPaintDevice::x11AppDisplay(),
- XKeyPress, &event2 ) ) {
- if ( event2.xkey.keycode == 0 ) {
- // found a key event with the 'commit' string
- found = TRUE;
- XPutBackEvent( TQPaintDevice::x11AppDisplay(), &event2 );
- }
- }
-
- if ( !found ) {
- // no key event, so the user must have cancelled the composition
- TQIMEvent endevent( TQEvent::IMEnd, TQString(), -1 );
- TQApplication::sendEvent( tqfocusWidget, &endevent );
-
- tqfocusWidget = 0;
- }
-
- qt_compose_emptied = FALSE;
- }
-#endif
- return TRUE;
- } else if ( tqfocusWidget() ) {
- if ( event->type == XKeyPress && event->xkey.keycode == 0 ) {
- // input method has sent us a commit string
- TQCString data(513);
- KeySym sym; // unused
- tqStatus status; // unused
- TQString inputText;
- int count = lookupString( &(event->xkey), data, &sym, &status );
- if ( count > 0 )
- inputText = qt_input_mapper->toUnicode( data, count );
-
- if ( ! ( qt_xim_style & XIMPreeditCallbacks ) || ! isComposing() ) {
- // there is no composing state
- sendIMEvent( TQEvent::IMStart );
- }
-
- sendIMEvent( TQEvent::IMEnd, inputText );
- resetClientState();
-
- return TRUE;
- }
- }
-#endif // !TQT_NO_XIM
-
- return FALSE;
-}
-
-
-void TQXIMInputContext::sendIMEvent( TQEvent::Type type, const TQString &text,
- int cursorPosition, int selLength )
-{
- TQInputContext::sendIMEvent( type, text, cursorPosition, selLength );
- if ( type == TQEvent::IMCompose )
- composingText = text;
-}
-
-
-void TQXIMInputContext::reset()
-{
-#if !defined(TQT_NO_XIM)
- if ( tqfocusWidget() && isComposing() && ! composingText.isNull() ) {
-#ifdef TQT_XIM_DEBUG
- qDebug("TQXIMInputContext::reset: composing - sending IMEnd (empty) to %p",
- tqfocusWidget() );
-#endif // TQT_XIM_DEBUG
-
- TQInputContext::reset();
- resetClientState();
-
- char *mb = XmbResetIC((XIC) ic);
- if (mb)
- XFree(mb);
- }
-#endif // !TQT_NO_XIM
-}
-
-
-void TQXIMInputContext::resetClientState()
-{
-#if !defined(TQT_NO_XIM)
- composingText = TQString();
- if ( selectedChars.size() < 128 )
- selectedChars.resize( 128 );
- selectedChars.fill( 0 );
-#endif // !TQT_NO_XIM
-}
-
-
-void TQXIMInputContext::close( const TQString &errMsg )
-{
- qDebug( errMsg );
- emit deletionRequested();
-}
-
-
-bool TQXIMInputContext::hasFocus() const
-{
- return ( tqfocusWidget() != 0 );
-}
-
-
-void TQXIMInputContext::setMicroFocus(int x, int y, int, int h, TQFont *f)
-{
- TQWidget *widget = tqfocusWidget();
- if ( qt_xim && widget ) {
- TQPoint p( x, y );
- TQPoint p2 = widget->mapTo( widget->tqtopLevelWidget(), TQPoint( 0, 0 ) );
- p = widget->tqtopLevelWidget()->mapFromGlobal( p );
- setXFontSet( f ? *f : widget->font() );
- setComposePosition(p.x(), p.y() + h);
- setComposeArea(p2.x(), p2.y(), widget->width(), widget->height());
- }
-
-}
-
-void TQXIMInputContext::mouseHandler( int , TQEvent::Type type,
- TQt::ButtonState button,
- TQt::ButtonState)
-{
- if ( type == TQEvent::MouseButtonPress ||
- type == TQEvent::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 TQXIMInputContext::setComposePosition(int x, int y)
-{
-#if !defined(TQT_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 // !TQT_NO_XIM
-}
-
-
-void TQXIMInputContext::setComposeArea(int x, int y, int w, int h)
-{
-#if !defined(TQT_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 TQXIMInputContext::setXFontSet(const TQFont &f)
-{
-#if !defined(TQT_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 TQXIMInputContext::lookupString(XKeyEvent *event, TQCString &chars,
- KeySym *key, tqStatus *status) const
-{
- int count = 0;
-
-#if !defined(TQT_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 // TQT_NO_XIM
-
- return count;
-}
-
-void TQXIMInputContext::setFocus()
-{
-#if !defined(TQT_NO_XIM)
- if ( qt_xim && ic )
- XSetICFocus((XIC) ic);
-#endif // !TQT_NO_XIM
-}
-
-void TQXIMInputContext::unsetFocus()
-{
-#if !defined(TQT_NO_XIM)
- if (qt_xim && ic)
- XUnsetICFocus((XIC) ic);
-#endif // !TQT_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 TQXIMInputContext::isPreeditRelocationEnabled()
-{
- return ( language() == "ja" );
-}
-
-
-bool TQXIMInputContext::isPreeditPreservationEnabled()
-{
- return ( language() == "ja" );
-}
-
-
-TQString TQXIMInputContext::identifierName()
-{
- // the name should be "xim" rather than "XIM" to be consistent
- // with corresponding immodule of GTK+
- return "xim";
-}
-
-
-TQString TQXIMInputContext::language()
-{
-#if !defined(TQT_NO_XIM)
- if ( qt_xim ) {
- TQString locale( XLocaleOfIM( qt_xim ) );
-
- if ( locale.startsWith( "zh" ) ) {
- // Chinese language should be formed as "zh_CN", "zh_TW", "zh_HK"
- _language = locale.left( 5 );
- } else {
- // other languages should be two-letter ISO 639 language code
- _language = locale.left( 2 );
- }
- }
-#endif
- return _language;
-}
-
-#endif //TQT_NO_IM