您的位置:首页 > 编程语言 > Qt开发

qtopia-core-4.3.3 qmouselinuxtp_qws.cpp文件注释

2009-06-30 10:16 471 查看
qtopia-core-4.3.3 qmouselinuxtp_qws.cpp文件注释

/****************************************************************************

**

** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.

**

** This file is part of the QtGui module of the Qt Toolkit.

**

** This file may be used under the terms of the GNU General Public

** License version 2.0 as published by the Free Software Foundation

** and appearing in the file LICENSE.GPL included in the packaging of

** this file.  Please review the following information to ensure GNU

** General Public Licensing requirements will be met:

** http://trolltech.com/products/qt/licenses/licensing/opensource/ 
**

** If you are unsure which license is appropriate for your use, please

** review the following information:

** http://trolltech.com/products/qt/licenses/licensing/licensingoverview 
** or contact the sales department at sales@trolltech.com.

**

** In addition, as a special exception, Trolltech gives you certain

** additional rights. These rights are described in the Trolltech GPL

** Exception version 1.0, which can be found at

** http://www.trolltech.com/products/qt/gplexception/ and in the file

** GPL_EXCEPTION.txt in this package.

**

** In addition, as a special exception, Trolltech, as the sole copyright

** holder for Qt Designer, grants users of the Qt/Eclipse Integration

** plug-in the right for the Qt/Eclipse Integration to link to

** functionality provided by Qt Designer and its related libraries.

**

** Trolltech reserves all rights not expressly granted herein.

**

** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE

** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

**

****************************************************************************/

#
include
"qmouselinuxtp_qws.h"

#
ifndef
QT_NO_QWS_MOUSE_LINUXTP

#
include
"qwindowsystem_qws.h"

#
include
"qsocketnotifier.h"

#
include
"qtimer.h"

#
include
"qapplication.h"

#
include
"qscreen_qws.h"

#
include
<
unistd.
h>

#
include
<
stdlib.
h>

#
include
<
stdio.
h>

#
include
<
sys/
ioctl.
h>

#
include
<
sys/
types.
h>

#
include
<
sys/
stat.
h>

#
include
<
fcntl.
h>

#
include
<
errno
.
h>

#
include
<
termios.
h>

#
if
defined(
QT_QWS_IPAQ)

#
ifndef
QT_QWS_IPAQ_RAW

#
define
QT_QWS_IPAQ_RAW

#
endif

#
define
QT_QWS_SCREEN_COORDINATES

typedef
struct
{

unsigned
short
pressure;

unsigned
short
x;

unsigned
short
y;

unsigned
short
pad;

}
TS_EVENT;

#
elif
defined(
QT_QWS_EBX)

#
define
QT_QWS_EBX_RAW

#
define
QT_QWS_SCREEN_COORDINATES

#
ifndef
QT_QWS_SHARP

typedef
struct
{

unsigned
short
pressure;

unsigned
short
x;

unsigned
short
y;

unsigned
short
pad;

}
TS_EVENT;

#
else

typedef
struct
{

long
y;

long
x;

long
pressure;

long
long
millisecs;

}
TS_EVENT;

#
define
QT_QWS_TP_SAMPLE_SIZE 10

#
define
QT_QWS_TP_MINIMUM_SAMPLES 4

#
define
QT_QWS_TP_PRESSURE_THRESHOLD 500

#
define
QT_QWS_TP_MOVE_LIMIT 50

#
define
QT_QWS_TP_JITTER_LIMIT 2

#
endif

#
else
// not IPAQ, not SHARP

typedef
struct
{

unsigned
short
pressure;

unsigned
short
x;

unsigned
short
y;

unsigned
short
pad;

}
TS_EVENT;

#
endif

#
ifndef
QT_QWS_TP_SAMPLE_SIZE

#
define
QT_QWS_TP_SAMPLE_SIZE 5

#
endif

#
ifndef
QT_QWS_TP_MINIMUM_SAMPLES    //确定每个点的有效样本数

#
define
QT_QWS_TP_MINIMUM_SAMPLES 5

#
endif

#
ifndef
QT_QWS_TP_PRESSURE_THRESHOLD    //压力筏值

#
define
QT_QWS_TP_PRESSURE_THRESHOLD 1

#
endif

#
ifndef
QT_QWS_TP_MOVE_LIMIT    //鼠标移动位置的上限(这里用词不是太准)

#
define
QT_QWS_TP_MOVE_LIMIT 100

#
endif

#
ifndef
QT_QWS_TP_JITTER_LIMIT    //鼠标移动位置的下限(这里用词不是太准)

#
define
QT_QWS_TP_JITTER_LIMIT 2

#
endif

class
QWSLinuxTPMouseHandlerPrivate :
public
QObject

{

Q_OBJECT

public
:

QWSLinuxTPMouseHandlerPrivate(
QWSLinuxTPMouseHandler *
h,
const
QString &
)
;

~
QWSLinuxTPMouseHandlerPrivate(
)
;

void
suspend(
)
;

void
resume(
)
;

private
:

static
const
int
mouseBufSize =
2048;

int
mouseFD;
//打开触摸屏设备后的文件描述符

QPoint oldmouse;
//先前的鼠标位置

QPoint oldTotalMousePos;
//先前的鼠标位置累加和

bool
waspressed;
//先前是否有点击事件发生

QPolygon samples;

int
currSample;
//当前样本

int
lastSample;

int
numSamples;
//当前有效样本数

int
skipCount;
//没有处理的鼠标位置的次数

int
mouseIdx;
//索引

uchar mouseBuf[
mouseBufSize]
;
//用作从mouseFD中读到的数据的缓冲区

QWSLinuxTPMouseHandler *
handler;

QSocketNotifier *
mouseNotifier;

private
slots:

void
readMouseData(
)
;

}
;

QWSLinuxTPMouseHandler:
:
QWSLinuxTPMouseHandler(
const
QString &
driver,
const
QString &
device)

:
QWSCalibratedMouseHandler(
driver,
device)

{

d =
new
QWSLinuxTPMouseHandlerPrivate(
this
,
device)
;

}

QWSLinuxTPMouseHandler:
:
~
QWSLinuxTPMouseHandler(
)

{

delete
d;

}

void
QWSLinuxTPMouseHandler:
:
suspend(
)

{

d-
>
suspend(
)
;

}

void
QWSLinuxTPMouseHandler:
:
resume(
)

{

d-
>
resume(
)
;

}

QWSLinuxTPMouseHandlerPrivate:
:
QWSLinuxTPMouseHandlerPrivate(
QWSLinuxTPMouseHandler *
h,

const
QString &
device)

:
samples(
QT_QWS_TP_SAMPLE_SIZE)
,
currSample(
0)
,
lastSample(
0)
,

numSamples(
0)
,
skipCount(
0)
,
handler(
h)

{

QString mousedev;

//确定触摸屏的设备文件

if
(
device.
isEmpty(
)
)
{

#
if
defined(
QT_QWS_IPAQ)

#
ifdef
QT_QWS_IPAQ_RAW

mousedev =
QLatin1String(
"/dev/h3600_tsraw"
)
;

#
else

mousedev =
QLatin1String(
"/dev/h3600_ts"
)
;

#
endif

#
else

mousedev =
QLatin1String(
"/dev/ts"
)
;

#
endif

}
else
{

mousedev =
device;

}

if
(
(
mouseFD =
open
(
mousedev.
toLatin1(
)
.
constData(
)
,
O_RDONLY |
O_NDELAY)
)
<
0)
{

qWarning(
"Cannot open %s (%s)"
,
qPrintable(
mousedev)
,
strerror
(
errno
)
)
;

return
;

}

//创建一个QScketNotifier对象mouseNotifier, 其属性为QSocketNotifier::Read, 用来监听mouseFD,

//当mouseFD有新的数据可以读的时候,发射activated()信号给slot

mouseNotifier =
new
QSocketNotifier(
mouseFD,
QSocketNotifier:
:
Read
,

this
)
;

connect
(
mouseNotifier,
SIGNAL
(
activated(
int
)
)
,
this
,
SLOT(
readMouseData(
)
)
)
;

waspressed=
false
;

mouseIdx =
0;

}

QWSLinuxTPMouseHandlerPrivate:
:
~
QWSLinuxTPMouseHandlerPrivate(
)

{

if
(
mouseFD >
=
0)

close
(
mouseFD)
;

}

//notifier默认是使能的

//当notfier使能的时候,它会发射activated信号只要监听的相应事件发生.

void
QWSLinuxTPMouseHandlerPrivate:
:
suspend(
)

{

if
(
mouseNotifier)

mouseNotifier-
>
setEnabled(
false
)
;

}

void
QWSLinuxTPMouseHandlerPrivate:
:
resume(
)

{

mouseIdx=
0;

currSample=
0;

lastSample=
0;

numSamples=
0;

skipCount=
0;

if
(
mouseNotifier)

mouseNotifier-
>
setEnabled(
true
)
;

}

void
QWSLinuxTPMouseHandlerPrivate:
:
readMouseData(
)

{

if
(
!
qt_screen)

return
;

//从mouseFD读数据到mouseBuf中,一次采2048个样,每QT_QWS_TP_MINIMUM_SAMPLES个样本确定一次 鼠标位置

int
n;

do
{

n =
read
(
mouseFD,
mouseBuf+
mouseIdx,
mouseBufSize-
mouseIdx)
;

if
(
n >
0)

mouseIdx +
=
n;

}
while
(
n >
0 &
&
mouseIdx <
mouseBufSize)
;

//qDebug("readMouseData()");

TS_EVENT *
data;

int
idx =
0;

// perhaps we shouldn't be reading EVERY SAMPLE.

while
(
mouseIdx-
idx >
=
(
int
)
sizeof
(
TS_EVENT)
)
{

uchar *
mb =
mouseBuf+
idx;

data =
(
TS_EVENT *
)
mb;

//触摸屏点击压力不小于筏值,获取一个样本位置,表示一次有效点击

//如是小于筏值,将所有变量清零,表示没有点击,也可以理解为没有东西接触屏

if
(
data-
>
pressure >
=
QT_QWS_TP_PRESSURE_THRESHOLD)
{

#
ifdef
QT_QWS_SHARP

samples[
currSample]
=
QPoint(
1000 -
data-
>
x,
data-
>
y)
;

#
else

samples[
currSample]
=
QPoint(
data-
>
x,
data-
>
y)
;

#
endif

//增加样本计数

//样本数达到采样最小值时,求平均数计算出当前鼠标的位置

numSamples+
+
;

if
(
numSamples >
=
QT_QWS_TP_MINIMUM_SAMPLES)
{

int
sampleCount =
qMin(
numSamples +
1,
samples.
count
(
)
)
;

// average the rest

QPoint mousePos =
QPoint(
0,
0)
;

QPoint totalMousePos =
oldTotalMousePos;

totalMousePos +
=
samples[
currSample]
;

if
(
numSamples >
=
samples.
count
(
)
)

totalMousePos -
=
samples[
lastSample]
;

mousePos =
totalMousePos /
(
sampleCount -
1)
;

#
if
defined(
QT_QWS_SCREEN_COORDINATES)

mousePos =
handler-
>
transform
(
mousePos)
;

#
endif

if
(
!
waspressed)

oldmouse =
mousePos;

//如果当前鼠标位置与先前鼠标位置距离太远,则将此样本作无效处理

//如果当前鼠标位置与先前鼠标位置距离太近,则无需更新鼠标位置

//除此两种情况,或者因太近而有两次没有更新过鼠标位置了,则更新鼠标位置,以免误差累计

QPoint dp =
mousePos -
oldmouse;

int
dxSqr =
dp.
x(
)
*
dp.
x(
)
;

int
dySqr =
dp.
y(
)
*
dp.
y(
)
;

if
(
dxSqr +
dySqr <
(
QT_QWS_TP_MOVE_LIMIT *
QT_QWS_TP_MOVE_LIMIT)
)
{

if
(
waspressed)
{

if
(
(
dxSqr +
dySqr >
(
QT_QWS_TP_JITTER_LIMIT *
QT_QWS_TP_JITTER_LIMIT)
)
|
|
skipCount >
2)
{

handler-
>
mouseChanged(
mousePos,
Qt:
:
LeftButton)
;

oldmouse =
mousePos;

skipCount =
0;

}
else
{

skipCount+
+
;

}

}
else
{

handler-
>
mouseChanged(
mousePos,
Qt:
:
LeftButton)
;

oldmouse=
mousePos;

waspressed=
true
;

}

// save recuring information

currSample+
+
;

if
(
numSamples >
=
samples.
count
(
)
)

lastSample+
+
;

oldTotalMousePos =
totalMousePos;

}
else
{

numSamples-
-
;
// don't use this sample, it was bad.

}

}
else
{

// build up the average

oldTotalMousePos +
=
samples[
currSample]
;

currSample+
+
;

}

if
(
currSample >
=
samples.
count
(
)
)

currSample =
0;

if
(
lastSample >
=
samples.
count
(
)
)

lastSample =
0;

}
else
{

//检测到没有点击,则所有变量做清零处理

currSample =
0;

lastSample =
0;

numSamples =
0;

skipCount =
0;

oldTotalMousePos =
QPoint(
0,
0)
;

if
(
waspressed)
{

handler-
>
mouseChanged(
oldmouse,
0)
;

oldmouse =
QPoint(
-
100,
-
100)
;

waspressed=
false
;

}

}

idx +
=
sizeof
(
TS_EVENT)
;

}

int
surplus =
mouseIdx -
idx;

for
(
int
i =
0;
i <
surplus;
i+
+
)

mouseBuf[
i]
=
mouseBuf[
idx+
i]
;

mouseIdx =
surplus;

}

#
include
"qmouselinuxtp_qws.moc"

#
endif
//QT_NO_QWS_MOUSE_LINUXT


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: