camerauis/cameraxui/cxui/src/cxuicapturekeyhandler_symbian_p.cpp
author hgs
Fri, 06 Aug 2010 10:03:37 +0300
changeset 46 c826656d6714
child 52 7e18d488ac5f
permissions -rw-r--r--
201031
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*   Private implementation for CxuiCaptureKeyHandler
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QVariant>
hgs
parents:
diff changeset
    19
#include <QKeyEvent>
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include "cxuicapturekeyhandler_symbian_p.h"
hgs
parents:
diff changeset
    22
#include "cxuicapturekeyhandler.h"
hgs
parents:
diff changeset
    23
#include "cxutils.h"
hgs
parents:
diff changeset
    24
#include "cxeengine.h"
hgs
parents:
diff changeset
    25
#include "cxenamespace.h"
hgs
parents:
diff changeset
    26
#include "cxefeaturemanager.h"
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#include <w32std.h>
hgs
parents:
diff changeset
    29
#include <eikon.hrh>
hgs
parents:
diff changeset
    30
#include <coemain.h>
hgs
parents:
diff changeset
    31
#include <e32keys.h> // for EKeyCamera
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
namespace {
hgs
parents:
diff changeset
    34
    const int CXUI_KEY_PRIORITY = 100;
hgs
parents:
diff changeset
    35
    const int CXUI_CAPTURE_KEY_CODE1 = 0xab;
hgs
parents:
diff changeset
    36
    const int CXUI_CAPTURE_KEY_CODE2 = 0xf849;
hgs
parents:
diff changeset
    37
    const int CXUI_AUTOFOCUS_KEY_CODE1 = 0xe2;
hgs
parents:
diff changeset
    38
    const int CXUI_AUTOFOCUS_KEY_CODE2 = 0xf880;
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
}
hgs
parents:
diff changeset
    41
CxuiCaptureKeyHandlerPrivate::CxuiCaptureKeyHandlerPrivate(CxeEngine &aEngine, CxuiCaptureKeyHandler *parent) :
hgs
parents:
diff changeset
    42
    q_ptr(parent),
hgs
parents:
diff changeset
    43
    mEngine(aEngine),
hgs
parents:
diff changeset
    44
    mAutofocusKeyPressed(false),
hgs
parents:
diff changeset
    45
    mCaptureKeyPressed(false),
hgs
parents:
diff changeset
    46
    mWsSession(CCoeEnv::Static()->WsSession()),
hgs
parents:
diff changeset
    47
    mWindowGroup(CCoeEnv::Static()->RootWin())
hgs
parents:
diff changeset
    48
{
hgs
parents:
diff changeset
    49
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
    // key codes hardcoded for now
hgs
parents:
diff changeset
    52
    // Autofocus key
hgs
parents:
diff changeset
    53
    mPrimaryCameraAutofocusKeys.append(CXUI_AUTOFOCUS_KEY_CODE1);
hgs
parents:
diff changeset
    54
    mPrimaryCameraAutofocusKeys.append(CXUI_AUTOFOCUS_KEY_CODE2);
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
    // Capture keys for primary camera
hgs
parents:
diff changeset
    57
    mPrimaryCameraCaptureKeys.append(CXUI_CAPTURE_KEY_CODE1);
hgs
parents:
diff changeset
    58
    mPrimaryCameraCaptureKeys.append(CXUI_CAPTURE_KEY_CODE2);
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
    listenKeys(true);
hgs
parents:
diff changeset
    61
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    62
}
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
CxuiCaptureKeyHandlerPrivate::~CxuiCaptureKeyHandlerPrivate()
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    67
    listenKeys(false);
hgs
parents:
diff changeset
    68
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
/*!
hgs
parents:
diff changeset
    72
* Start or stop listening key events.
hgs
parents:
diff changeset
    73
* @param listen Should we start (true) or stop (false) listening key events.
hgs
parents:
diff changeset
    74
*/
hgs
parents:
diff changeset
    75
void CxuiCaptureKeyHandlerPrivate::listenKeys(bool listen)
hgs
parents:
diff changeset
    76
{
hgs
parents:
diff changeset
    77
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    if (listen) {
hgs
parents:
diff changeset
    80
        // Protect from multiple calls
hgs
parents:
diff changeset
    81
        if (mCapturedKeyUpDownHandles.empty() && mCapturedKeyHandles.empty()) {
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
            int key(0);
hgs
parents:
diff changeset
    84
            foreach (key, mPrimaryCameraAutofocusKeys) {
hgs
parents:
diff changeset
    85
                CX_DEBUG(("CxuiCaptureKeyHandlerPrivate - hooking autofocus key with scan / key code: %d", key));
hgs
parents:
diff changeset
    86
                listenKey(key);
hgs
parents:
diff changeset
    87
            }
hgs
parents:
diff changeset
    88
            foreach (key, mPrimaryCameraCaptureKeys) {
hgs
parents:
diff changeset
    89
                CX_DEBUG(("CxuiCaptureKeyHandlerPrivate - hooking capture key with scan / key code: %d", key));
hgs
parents:
diff changeset
    90
                listenKey(key);
hgs
parents:
diff changeset
    91
            }
hgs
parents:
diff changeset
    92
        }
hgs
parents:
diff changeset
    93
    } else {
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
        int handle(0);
hgs
parents:
diff changeset
    96
        foreach (handle, mCapturedKeyUpDownHandles) {
hgs
parents:
diff changeset
    97
            mWindowGroup.CancelCaptureKeyUpAndDowns(handle);
hgs
parents:
diff changeset
    98
        }
hgs
parents:
diff changeset
    99
        mCapturedKeyUpDownHandles.clear();
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
        foreach (handle, mCapturedKeyHandles) {
hgs
parents:
diff changeset
   102
            mWindowGroup.CancelCaptureKey(handle);
hgs
parents:
diff changeset
   103
        }
hgs
parents:
diff changeset
   104
        mCapturedKeyHandles.clear();
hgs
parents:
diff changeset
   105
    }
hgs
parents:
diff changeset
   106
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   107
}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
bool CxuiCaptureKeyHandlerPrivate::isAutofocusKeyPressed()
hgs
parents:
diff changeset
   110
{
hgs
parents:
diff changeset
   111
    return mAutofocusKeyPressed;
hgs
parents:
diff changeset
   112
}
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
bool CxuiCaptureKeyHandlerPrivate::isCaptureKeyPressed()
hgs
parents:
diff changeset
   115
{
hgs
parents:
diff changeset
   116
    return mCaptureKeyPressed;
hgs
parents:
diff changeset
   117
}
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
bool CxuiCaptureKeyHandlerPrivate::handleKeyEvent(QEvent *event)
hgs
parents:
diff changeset
   120
{
hgs
parents:
diff changeset
   121
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   122
    Q_Q(CxuiCaptureKeyHandler);
hgs
parents:
diff changeset
   123
    bool eventWasConsumed = false;
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
    if (event->type() == QEvent::KeyPress) {
hgs
parents:
diff changeset
   126
        QKeyEvent *keyEvent = static_cast<QKeyEvent*> (event);
hgs
parents:
diff changeset
   127
        if ( mPrimaryCameraAutofocusKeys.contains(keyEvent->nativeScanCode())
hgs
parents:
diff changeset
   128
            && !mAutofocusKeyPressed ) {
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
            mAutofocusKeyPressed = true;
hgs
parents:
diff changeset
   131
            eventWasConsumed = true;
hgs
parents:
diff changeset
   132
            emit q->autofocusKeyPressed();
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
        } else if (mPrimaryCameraCaptureKeys.contains(keyEvent->nativeScanCode())
hgs
parents:
diff changeset
   135
            && !mCaptureKeyPressed) {
hgs
parents:
diff changeset
   136
            mCaptureKeyPressed = true;
hgs
parents:
diff changeset
   137
            eventWasConsumed = true;
hgs
parents:
diff changeset
   138
            emit q->captureKeyPressed();
hgs
parents:
diff changeset
   139
        }
hgs
parents:
diff changeset
   140
    } else if (event->type() == QEvent::KeyRelease) {
hgs
parents:
diff changeset
   141
        QKeyEvent *keyEvent = static_cast<QKeyEvent*> (event);
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
        if ( mPrimaryCameraAutofocusKeys.contains(keyEvent->nativeScanCode())
hgs
parents:
diff changeset
   144
            && mAutofocusKeyPressed ) {
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
            mAutofocusKeyPressed = false;
hgs
parents:
diff changeset
   147
            eventWasConsumed = true;
hgs
parents:
diff changeset
   148
            emit q->autofocusKeyReleased();
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
        } else if (mPrimaryCameraCaptureKeys.contains(keyEvent->nativeScanCode())
hgs
parents:
diff changeset
   151
            && mCaptureKeyPressed) {
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
            mCaptureKeyPressed = false;
hgs
parents:
diff changeset
   154
            eventWasConsumed = true;
hgs
parents:
diff changeset
   155
            emit q->captureKeyReleased();
hgs
parents:
diff changeset
   156
        }
hgs
parents:
diff changeset
   157
    }
hgs
parents:
diff changeset
   158
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   159
    return eventWasConsumed;
hgs
parents:
diff changeset
   160
}
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
/*!
hgs
parents:
diff changeset
   163
* Helper method to listen to given key (key code or scan code).
hgs
parents:
diff changeset
   164
* We need to listen to both "key up", "key down" and "key pressed" events to
hgs
parents:
diff changeset
   165
* get all the necessary events to handleKeyEvent(). If we e.g. just listen
hgs
parents:
diff changeset
   166
* to up/down events, the way native events are translated to QKeyEvents,
hgs
parents:
diff changeset
   167
* we only get QEvent::KeyRelease event when partially in background.
hgs
parents:
diff changeset
   168
* @param key Keycode or scancode for the key to listen. Both should be listened.
hgs
parents:
diff changeset
   169
*/
hgs
parents:
diff changeset
   170
void CxuiCaptureKeyHandlerPrivate::listenKey(int key)
hgs
parents:
diff changeset
   171
{
hgs
parents:
diff changeset
   172
    // Capture key down and up events
hgs
parents:
diff changeset
   173
    int handle = mWindowGroup.CaptureKeyUpAndDowns(key, 0, 0, CXUI_KEY_PRIORITY);
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
    // Handle < 0 means error.
hgs
parents:
diff changeset
   176
    if (handle >= 0) {
hgs
parents:
diff changeset
   177
        mCapturedKeyUpDownHandles.append(handle);
hgs
parents:
diff changeset
   178
    } else {
hgs
parents:
diff changeset
   179
        CX_DEBUG(("[WARNING] CxuiCaptureKeyHandlerPrivate - Problem hooking to key-up/key-down with code: %d", key));
hgs
parents:
diff changeset
   180
    }
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
    // Capture key press events
hgs
parents:
diff changeset
   183
    handle = mWindowGroup.CaptureKey(key, 0, 0, CXUI_KEY_PRIORITY);
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
    if (handle >= 0) {
hgs
parents:
diff changeset
   186
        mCapturedKeyHandles.append(handle);
hgs
parents:
diff changeset
   187
    } else {
hgs
parents:
diff changeset
   188
        CX_DEBUG(("[WARNING] CxuiCaptureKeyHandlerPrivate - Problem hooking to key-press with code: %d", key));
hgs
parents:
diff changeset
   189
    }
hgs
parents:
diff changeset
   190
}
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
// end of file