9 * Initial Contributors: |
9 * Initial Contributors: |
10 * Nokia Corporation - initial contribution. |
10 * Nokia Corporation - initial contribution. |
11 * |
11 * |
12 * Contributors: |
12 * Contributors: |
13 * |
13 * |
14 * Description: Gesture helper implementation |
14 * Description: Gesture event sender implementation |
15 * |
15 * |
16 */ |
16 */ |
17 |
17 |
18 #include "gesturehelpereventsender.h" |
18 #include "gesturehelpereventsender.h" |
19 |
|
20 const TInt KEventsQueueGranularity = 4; |
|
21 |
19 |
22 CGestureEventSender* CGestureEventSender::NewL( MStmGestureListener& aObserver ) |
20 CGestureEventSender* CGestureEventSender::NewL( MStmGestureListener& aObserver ) |
23 { |
21 { |
24 CGestureEventSender* self = new (ELeave) CGestureEventSender(aObserver); |
22 CGestureEventSender* self = new (ELeave) CGestureEventSender(aObserver); |
25 |
23 |
26 return self; |
24 return self; |
27 } |
25 } |
28 |
26 |
29 CGestureEventSender::CGestureEventSender( MStmGestureListener& aObserver ) : |
27 CGestureEventSender::CGestureEventSender( MStmGestureListener& aObserver ) |
30 CActive(EPriorityUserInput - 1), |
28 :iObserver(aObserver) |
31 iObserver(aObserver), iEvents(KEventsQueueGranularity) |
|
32 { |
29 { |
33 CActiveScheduler::Add(this); |
|
34 } |
30 } |
35 |
31 |
36 CGestureEventSender::~CGestureEventSender() |
32 CGestureEventSender::~CGestureEventSender() |
37 { |
33 { |
38 if (IsActive()) |
|
39 { |
|
40 Cancel(); |
|
41 } |
|
42 |
|
43 iEvents.Close(); |
|
44 } |
34 } |
45 |
35 |
46 TInt CGestureEventSender::AddEvent(TStmGestureUid aUid, const MStmGesture* aGestureEvent) |
36 void CGestureEventSender::AddEvent(TStmGestureUid aUid, const MStmGesture* aGestureEvent) |
47 { |
37 { |
48 TStmGestureEvent event; |
38 TStmGestureEvent event; |
49 if (aGestureEvent) { |
39 if (aGestureEvent) { |
50 event.SetCode(aGestureEvent->gestureUid()); |
40 event.SetCode(aGestureEvent->gestureUid()); |
51 event.SetCurrentPos(aGestureEvent->getLocation()); |
41 event.SetCurrentPos(aGestureEvent->getLocation()); |
52 event.SetSpeed(TRealPoint(aGestureEvent->getSpeedX()*1000,aGestureEvent->getSpeedY()*1000));//App needs the speed in pixels/sec |
42 event.SetSpeed(TRealPoint(aGestureEvent->getSpeedX()*1000,aGestureEvent->getSpeedY()*1000));//App needs the speed in pixels/sec |
56 event.SetPinchEndPos(aGestureEvent->getPinchEndPos()); |
46 event.SetPinchEndPos(aGestureEvent->getPinchEndPos()); |
57 event.SetGestureState(EGestureEnter); |
47 event.SetGestureState(EGestureEnter); |
58 } |
48 } |
59 else { |
49 else { |
60 if (aUid != stmGesture::EGestureUidPinch) { |
50 if (aUid != stmGesture::EGestureUidPinch) { |
61 return iEvents.Count(); |
51 return; |
62 } |
52 } |
63 event.SetCode(aUid); |
53 event.SetCode(aUid); |
64 event.SetGestureState(EGestureExit); |
54 event.SetGestureState(EGestureExit); |
65 } |
55 } |
66 |
56 |
67 iEvents.Append(event); |
57 EmitEventL(event); |
68 |
|
69 if (event.Code() == stmGesture::EGestureUidTap) { |
58 if (event.Code() == stmGesture::EGestureUidTap) { |
70 event.SetCode(stmGesture::EGestureUidRelease); |
59 event.SetCode(stmGesture::EGestureUidRelease); |
71 iEvents.Append(event); |
60 EmitEventL(event); |
72 } |
61 } |
73 |
62 } |
74 if (iState != EBusy) |
|
75 { |
|
76 iState = EEventsReady; |
|
77 } |
|
78 |
|
79 if (!IsActive()) |
|
80 { |
|
81 Complete(); |
|
82 } |
|
83 return iEvents.Count(); |
|
84 } |
|
85 |
|
86 void CGestureEventSender::Complete() |
|
87 { |
|
88 TRequestStatus* status = &iStatus; |
|
89 User::RequestComplete(status, KErrNone); |
|
90 SetActive(); |
|
91 } |
|
92 |
|
93 void CGestureEventSender::RunL() |
|
94 { |
|
95 switch (iState) |
|
96 { |
|
97 case EEventsReady: |
|
98 { |
|
99 if (iEvents.Count() > 0) |
|
100 { |
|
101 TInt count = iEvents.Count(); |
|
102 for (int i = 0; i < count; i++) |
|
103 { |
|
104 TStmGestureEvent& gst = iEvents[i]; |
|
105 EmitEventL(gst); |
|
106 } |
|
107 } |
|
108 iEvents.Reset(); |
|
109 iState = ENoEvents; |
|
110 break; |
|
111 } |
|
112 } |
|
113 } |
|
114 |
63 |
115 void CGestureEventSender::EmitEventL( const TStmGestureEvent& aGesture ) |
64 void CGestureEventSender::EmitEventL( const TStmGestureEvent& aGesture ) |
116 { |
65 { |
117 iState = EBusy; |
|
118 iObserver.HandleGestureEventL(aGesture); |
66 iObserver.HandleGestureEventL(aGesture); |
119 iState = EEventsReady; |
67 } |
120 } |
|
121 |
|
122 TInt CGestureEventSender::RunError(TInt aError) |
|
123 { |
|
124 iEvents.Reset(); |
|
125 return aError; |
|
126 } |
|
127 |
|
128 void CGestureEventSender::DoCancel() |
|
129 { |
|
130 iEvents.Reset(); |
|
131 iState = ENoEvents; |
|
132 } |
|