summaryrefslogtreecommitdiffstats
path: root/src/gui/inputmethod/qmacinputcontext_mac.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/inputmethod/qmacinputcontext_mac.cpp')
-rw-r--r--src/gui/inputmethod/qmacinputcontext_mac.cpp378
1 files changed, 0 insertions, 378 deletions
diff --git a/src/gui/inputmethod/qmacinputcontext_mac.cpp b/src/gui/inputmethod/qmacinputcontext_mac.cpp
deleted file mode 100644
index a1ba39c1d6..0000000000
--- a/src/gui/inputmethod/qmacinputcontext_mac.cpp
+++ /dev/null
@@ -1,378 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qvarlengtharray.h>
-#include <qwidget.h>
-#include <private/qmacinputcontext_p.h>
-#include "qtextformat.h"
-#include <qdebug.h>
-#include <private/qapplication_p.h>
-#include <private/qkeymapper_p.h>
-
-QT_BEGIN_NAMESPACE
-
-extern bool qt_sendSpontaneousEvent(QObject*, QEvent*);
-
-#if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5)
-# define typeRefCon typeSInt32
-# define typeByteCount typeSInt32
-#endif
-
-QMacInputContext::QMacInputContext(QObject *parent)
- : QInputContext(parent), composing(false), recursionGuard(false), textDocument(0),
- keydownEvent(0)
-{
-// createTextDocument();
-}
-
-QMacInputContext::~QMacInputContext()
-{
-#ifndef QT_MAC_USE_COCOA
- if(textDocument)
- DeleteTSMDocument(textDocument);
-#endif
-}
-
-void
-QMacInputContext::createTextDocument()
-{
-#ifndef QT_MAC_USE_COCOA
- if(!textDocument) {
- InterfaceTypeList itl = { kUnicodeDocument };
- NewTSMDocument(1, itl, &textDocument, SRefCon(this));
- }
-#endif
-}
-
-
-QString QMacInputContext::language()
-{
- return QString();
-}
-
-
-void QMacInputContext::mouseHandler(int pos, QMouseEvent *e)
-{
-#ifndef QT_MAC_USE_COCOA
- if(e->type() != QEvent::MouseButtonPress)
- return;
-
- if (!composing)
- return;
- if (pos < 0 || pos > currentText.length())
- reset();
- // ##### handle mouse position
-#else
- Q_UNUSED(pos);
- Q_UNUSED(e);
-#endif
-}
-
-#if !defined QT_MAC_USE_COCOA
-
-static QTextFormat qt_mac_compose_format()
-{
- QTextCharFormat ret;
- ret.setFontUnderline(true);
- return ret;
-}
-
-void QMacInputContext::reset()
-{
- if (recursionGuard)
- return;
- if (!currentText.isEmpty()){
- QInputMethodEvent e;
- e.setCommitString(currentText);
- qt_sendSpontaneousEvent(focusWidget(), &e);
- currentText = QString();
- }
- recursionGuard = true;
- createTextDocument();
- composing = false;
- ActivateTSMDocument(textDocument);
- FixTSMDocument(textDocument);
- recursionGuard = false;
-}
-
-bool QMacInputContext::isComposing() const
-{
- return composing;
-}
-#endif
-
-void QMacInputContext::setFocusWidget(QWidget *w)
-{
- createTextDocument();
-#ifndef QT_MAC_USE_COCOA
- if(w)
- ActivateTSMDocument(textDocument);
- else
- DeactivateTSMDocument(textDocument);
-#endif
- QInputContext::setFocusWidget(w);
-}
-
-
-#ifndef QT_MAC_USE_COCOA
-static EventTypeSpec input_events[] = {
- { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent },
- { kEventClassTextInput, kEventTextInputOffsetToPos },
- { kEventClassTextInput, kEventTextInputUpdateActiveInputArea }
-};
-static EventHandlerUPP input_proc_handlerUPP = 0;
-static EventHandlerRef input_proc_handler = 0;
-#endif
-
-void
-QMacInputContext::initialize()
-{
-#ifndef QT_MAC_USE_COCOA
- if(!input_proc_handler) {
- input_proc_handlerUPP = NewEventHandlerUPP(QMacInputContext::globalEventProcessor);
- InstallEventHandler(GetApplicationEventTarget(), input_proc_handlerUPP,
- GetEventTypeCount(input_events), input_events,
- 0, &input_proc_handler);
- }
-#endif
-}
-
-void
-QMacInputContext::cleanup()
-{
-#ifndef QT_MAC_USE_COCOA
- if(input_proc_handler) {
- RemoveEventHandler(input_proc_handler);
- input_proc_handler = 0;
- }
- if(input_proc_handlerUPP) {
- DisposeEventHandlerUPP(input_proc_handlerUPP);
- input_proc_handlerUPP = 0;
- }
-#endif
-}
-
-void QMacInputContext::setLastKeydownEvent(EventRef event)
-{
- EventRef tmpEvent = keydownEvent;
- keydownEvent = event;
- if (keydownEvent)
- RetainEvent(keydownEvent);
- if (tmpEvent)
- ReleaseEvent(tmpEvent);
-}
-
-OSStatus
-QMacInputContext::globalEventProcessor(EventHandlerCallRef, EventRef event, void *)
-{
-#ifndef QT_MAC_USE_COCOA
- QScopedLoopLevelCounter loopLevelCounter(QApplicationPrivate::instance()->threadData);
-
- SRefCon refcon = 0;
- GetEventParameter(event, kEventParamTextInputSendRefCon, typeRefCon, 0,
- sizeof(refcon), 0, &refcon);
- QMacInputContext *context = reinterpret_cast<QMacInputContext*>(refcon);
-
- bool handled_event=true;
- UInt32 ekind = GetEventKind(event), eclass = GetEventClass(event);
- switch(eclass) {
- case kEventClassTextInput: {
- handled_event = false;
- QWidget *widget = QApplicationPrivate::focus_widget;
- bool canCompose = widget && (!context || widget->inputContext() == context)
- && !(widget->inputMethodHints() & Qt::ImhDigitsOnly
- || widget->inputMethodHints() & Qt::ImhFormattedNumbersOnly
- || widget->inputMethodHints() & Qt::ImhHiddenText);
- if(!canCompose) {
- handled_event = false;
- } else if(ekind == kEventTextInputOffsetToPos) {
- if(!widget->testAttribute(Qt::WA_InputMethodEnabled)) {
- handled_event = false;
- break;
- }
-
- QRect mr(widget->inputMethodQuery(Qt::ImMicroFocus).toRect());
- QPoint mp(widget->mapToGlobal(QPoint(mr.topLeft())));
- Point pt;
- pt.h = mp.x();
- pt.v = mp.y() + mr.height();
- SetEventParameter(event, kEventParamTextInputReplyPoint, typeQDPoint,
- sizeof(pt), &pt);
- handled_event = true;
- } else if(ekind == kEventTextInputUpdateActiveInputArea) {
- if(!widget->testAttribute(Qt::WA_InputMethodEnabled)) {
- handled_event = false;
- break;
- }
-
- if (context->recursionGuard)
- break;
-
- ByteCount unilen = 0;
- GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText,
- 0, 0, &unilen, 0);
- UniChar *unicode = (UniChar*)NewPtr(unilen);
- GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText,
- 0, unilen, 0, unicode);
- QString text((QChar*)unicode, unilen / sizeof(UniChar));
- DisposePtr((char*)unicode);
-
- ByteCount fixed_length = 0;
- GetEventParameter(event, kEventParamTextInputSendFixLen, typeByteCount, 0,
- sizeof(fixed_length), 0, &fixed_length);
- if(fixed_length == ULONG_MAX || fixed_length == unilen) {
- QInputMethodEvent e;
- e.setCommitString(text);
- context->currentText = QString();
- qt_sendSpontaneousEvent(context->focusWidget(), &e);
- handled_event = true;
- context->reset();
- } else {
- ByteCount rngSize = 0;
- OSStatus err = GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray, 0,
- 0, &rngSize, 0);
- QVarLengthArray<TextRangeArray> highlight(rngSize);
- if (noErr == err) {
- err = GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray, 0,
- rngSize, &rngSize, highlight.data());
- }
- context->composing = true;
- if(fixed_length > 0) {
- const int qFixedLength = fixed_length / sizeof(UniChar);
- QList<QInputMethodEvent::Attribute> attrs;
- attrs << QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat,
- qFixedLength, text.length()-qFixedLength,
- qt_mac_compose_format());
- QInputMethodEvent e(text, attrs);
- context->currentText = text;
- e.setCommitString(text.left(qFixedLength), 0, qFixedLength);
- qt_sendSpontaneousEvent(widget, &e);
- handled_event = true;
- } else {
- /* Apple's enums that they have removed from Tiger :(
- enum {
- kCaretPosition = 1,
- kRawText = 2,
- kSelectedRawText = 3,
- kConvertedText = 4,
- kSelectedConvertedText = 5,
- kBlockFillText = 6,
- kOutlineText = 7,
- kSelectedText = 8
- };
- */
-#ifndef kConvertedText
-#define kConvertedText 4
-#endif
-#ifndef kCaretPosition
-#define kCaretPosition 1
-#endif
- QList<QInputMethodEvent::Attribute> attrs;
- if (!highlight.isEmpty()) {
- TextRangeArray *data = highlight.data();
- for (int i = 0; i < data->fNumOfRanges; ++i) {
- int start = data->fRange[i].fStart / sizeof(UniChar);
- int len = (data->fRange[i].fEnd - data->fRange[i].fStart) / sizeof(UniChar);
- if (data->fRange[i].fHiliteStyle == kCaretPosition) {
- attrs << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, start, 0, QVariant());
- continue;
- }
- QTextCharFormat format;
- format.setFontUnderline(true);
- if (data->fRange[i].fHiliteStyle == kConvertedText)
- format.setUnderlineColor(Qt::gray);
- else
- format.setUnderlineColor(Qt::black);
- attrs << QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, start, len, format);
- }
- } else {
- attrs << QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat,
- 0, text.length(), qt_mac_compose_format());
- }
- context->currentText = text;
- QInputMethodEvent e(text, attrs);
- qt_sendSpontaneousEvent(widget, &e);
- handled_event = true;
- }
- }
-#if 0
- if(!context->composing)
- handled_event = false;
-#endif
-
- extern bool qt_mac_eat_unicode_key; //qapplication_mac.cpp
- qt_mac_eat_unicode_key = handled_event;
- } else if(ekind == kEventTextInputUnicodeForKeyEvent) {
- EventRef key_ev = 0;
- GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, 0,
- sizeof(key_ev), 0, &key_ev);
- QString text;
- ByteCount unilen = 0;
- if(GetEventParameter(key_ev, kEventParamKeyUnicodes, typeUnicodeText, 0, 0, &unilen, 0) == noErr) {
- UniChar *unicode = (UniChar*)NewPtr(unilen);
- GetEventParameter(key_ev, kEventParamKeyUnicodes, typeUnicodeText, 0, unilen, 0, unicode);
- text = QString((QChar*)unicode, unilen / sizeof(UniChar));
- DisposePtr((char*)unicode);
- }
- unsigned char chr = 0;
- GetEventParameter(key_ev, kEventParamKeyMacCharCodes, typeChar, 0, sizeof(chr), 0, &chr);
- if(!chr || chr >= 128 || (text.length() > 0 && (text.length() > 1 || text.at(0) != QLatin1Char(chr))))
- handled_event = !widget->testAttribute(Qt::WA_InputMethodEnabled);
- QMacInputContext *context = qobject_cast<QMacInputContext*>(qApp->inputContext());
- if (context && context->lastKeydownEvent()) {
- qt_keymapper_private()->translateKeyEvent(widget, 0, context->lastKeydownEvent(),
- 0, false);
- context->setLastKeydownEvent(0);
- }
- }
- break; }
- default:
- break;
- }
- if(!handled_event) //let the event go through
- return eventNotHandledErr;
-#else
- Q_UNUSED(event);
-#endif
- return noErr; //we eat the event
-}
-
-QT_END_NAMESPACE