e5fcad3 by Lars Knoll at 2009-03-23 1
/****************************************************************************
2
**
89c08c0 by Jason McDonald at 2012-01-11 3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
04e3b30 by Jason McDonald at 2009-09-09 4
** All rights reserved.
858c70f by Jason McDonald at 2009-06-16 5
** Contact: Nokia Corporation (qt-info@nokia.com)
e5fcad3 by Lars Knoll at 2009-03-23 6
**
7
** This file is part of the QtCore module of the Qt Toolkit.
8
**
9
** $QT_BEGIN_LICENSE:LGPL$
10
** GNU Lesser General Public License Usage
1eea52e by Jyri Tahtela at 2011-05-13 11
** This file may be used under the terms of the GNU Lesser General Public
12
** License version 2.1 as published by the Free Software Foundation and
13
** appearing in the file LICENSE.LGPL included in the packaging of this
14
** file. Please review the following information to ensure the GNU Lesser
15
** General Public License version 2.1 requirements will be met:
16
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
e5fcad3 by Lars Knoll at 2009-03-23 17
**
04e3b30 by Jason McDonald at 2009-09-09 18
** In addition, as a special exception, Nokia gives you certain additional
1eea52e by Jyri Tahtela at 2011-05-13 19
** rights. These rights are described in the Nokia Qt LGPL Exception
04e3b30 by Jason McDonald at 2009-09-09 20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
e5fcad3 by Lars Knoll at 2009-03-23 21
**
1eea52e by Jyri Tahtela at 2011-05-13 22
** GNU General Public License Usage
23
** Alternatively, this file may be used under the terms of the GNU General
24
** Public License version 3.0 as published by the Free Software Foundation
25
** and appearing in the file LICENSE.GPL included in the packaging of this
26
** file. Please review the following information to ensure the GNU General
27
** Public License version 3.0 requirements will be met:
28
** http://www.gnu.org/copyleft/gpl.html.
29
**
30
** Other Usage
31
** Alternatively, this file may be used in accordance with the terms and
32
** conditions contained in a signed written agreement between you and Nokia.
309db73 by Jason McDonald at 2009-08-31 33
**
34
**
35
**
36
**
e5fcad3 by Lars Knoll at 2009-03-23 37
**
38
** $QT_END_LICENSE$
39
**
40
****************************************************************************/
41
42
#include "qwineventnotifier_p.h"
43
44
#include "qeventdispatcher_win_p.h"
45
#include "qcoreapplication.h"
46
47
#include <private/qthread_p.h>
48
49
QT_BEGIN_NAMESPACE
50
51
/*
52
    \class QWinEventNotifier
53
    \brief The QWinEventNotifier class provides support for the Windows Wait functions.
54
55
    The QWinEventNotifier class makes it possible to use the wait
56
    functions on windows in a asynchronous manner. With this class
57
    you can register a HANDLE to an event and get notification when
58
    that event becomes signalled. The state of the event is not modified
59
    in the process so if it is a manual reset event you will need to
60
    reset it after the notification.
61
*/
62
63
64
QWinEventNotifier::QWinEventNotifier(QObject *parent)
65
  : QObject(parent), handleToEvent(0), enabled(false)
66
{}
67
68
QWinEventNotifier::QWinEventNotifier(HANDLE hEvent, QObject *parent)
69
 : QObject(parent), handleToEvent(hEvent), enabled(false)
70
{
71
    Q_D(QObject);
72
    QEventDispatcherWin32 *eventDispatcher = qobject_cast<QEventDispatcherWin32 *>(d->threadData->eventDispatcher);
73
    Q_ASSERT_X(eventDispatcher, "QWinEventNotifier::QWinEventNotifier()",
74
               "Cannot create a win event notifier without a QEventDispatcherWin32");
75
    eventDispatcher->registerEventNotifier(this);
76
    enabled = true;
77
}
78
79
QWinEventNotifier::~QWinEventNotifier()
80
{
81
    setEnabled(false);
82
}
83
84
void QWinEventNotifier::setHandle(HANDLE hEvent)
85
{
86
    setEnabled(false);
87
    handleToEvent = hEvent;
88
}
89
90
HANDLE  QWinEventNotifier::handle() const
91
{
92
    return handleToEvent;
93
}
94
95
bool QWinEventNotifier::isEnabled() const
96
{
97
    return enabled;
98
}
99
100
void QWinEventNotifier::setEnabled(bool enable)
101
{
102
    if (enabled == enable)                        // no change
103
        return;
104
    enabled = enable;
105
106
    Q_D(QObject);
107
    QEventDispatcherWin32 *eventDispatcher = qobject_cast<QEventDispatcherWin32 *>(d->threadData->eventDispatcher);
108
    if (!eventDispatcher) // perhaps application is shutting down
109
        return;
110
111
    if (enabled)
112
        eventDispatcher->registerEventNotifier(this);
113
    else
114
        eventDispatcher->unregisterEventNotifier(this);
115
}
116
117
bool QWinEventNotifier::event(QEvent * e)
118
{
119
    if (e->type() == QEvent::ThreadChange) {
120
        if (enabled) {
121
            QMetaObject::invokeMethod(this, "setEnabled", Qt::QueuedConnection,
122
                                      Q_ARG(bool, enabled));
123
            setEnabled(false);
124
        }
125
    }
126
    QObject::event(e);                        // will activate filters
127
    if (e->type() == QEvent::WinEventAct) {
128
        emit activated(handleToEvent);
129
        return true;
130
    }
131
    return false;
132
}
133
134
QT_END_NAMESPACE