summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/rohfeedback.cpp125
-rw-r--r--library/backend/rohfeedback.h62
-rw-r--r--library/qpeapplication.cpp32
3 files changed, 216 insertions, 3 deletions
diff --git a/library/backend/rohfeedback.cpp b/library/backend/rohfeedback.cpp
new file mode 100644
index 0000000..ff76a36
--- a/dev/null
+++ b/library/backend/rohfeedback.cpp
@@ -0,0 +1,125 @@
1#include <rohfeedback.h>
2
3
4#include <stdio.h>
5#include <qpeapplication.h>
6#include <qevent.h>
7#include <resource.h>
8#include <qpixmap.h>
9#include <qbitmap.h>
10
11#define SPEED 600
12#define DELAY 500
13
14namespace Opie {
15namespace Internal {
16/*
17
18 RightOnHold feedback
19
20*/
21
22QPixmap * RoHFeedback::Imgs[NOOFICONS] = { 0, 0, 0, 0, 0 };
23QBitmap * RoHFeedback::Masks[NOOFICONS];
24int RoHFeedback::IconWidth;
25int RoHFeedback::IconHeight;
26
27RoHFeedback::RoHFeedback() :
28 QLabel( 0, 0, Qt::WType_Popup ), Timer() {
29
30 Receiver = 0l;
31 connect( &Timer, SIGNAL( timeout() ), this, SLOT( iconShow() ) );
32
33 if( Imgs[0] == 0 ) {
34 QString S;
35
36
37 for( int i = 0; i < NOOFICONS ; i ++ ) {
38 Imgs[i] = new QPixmap( Resource::loadPixmap("RoH/star/"+
39 QString::number(i+1) +
40 ".png" ));
41 Masks[i] = new QBitmap();
42 (*Masks[i]) = Resource::loadPixmap("RoH/star/"+QString::number(i+1) +
43 ".png" );
44 }
45 }
46
47 IconWidth = Imgs[0]->size().width();
48 IconHeight = Imgs[0]->size().height();
49
50 resize( IconWidth, IconHeight );
51}
52
53int RoHFeedback::delay( void ) {
54 return DELAY+SPEED+50;
55}
56
57RoHFeedback::~RoHFeedback() {
58 for ( int i = 0; i < NOOFICONS; ++i ) {
59 delete Imgs [i];
60 delete Masks[i];
61 }
62}
63
64void RoHFeedback::init( const QPoint & P, QWidget* wid ) {
65 if( ! IconWidth )
66 return;
67
68 Receiver = wid;
69 IconNr = -1;
70 move( P.x()-IconWidth/2, P.y() - IconHeight/2 );
71 // to initialize
72 Timer.start( DELAY - SPEED/NOOFICONS );
73}
74
75void RoHFeedback::stop( void ) {
76 IconNr = -2; // stop
77 hide();
78 Timer.stop();
79}
80
81bool RoHFeedback::event( QEvent * E ) {
82
83 if( E->type() >= QEvent::MouseButtonPress &&
84 E->type() <= QEvent::MouseMove ) {
85 // pass the event to the receiver with translated coord
86 QMouseEvent QME( ((QMouseEvent *)E)->type(),
87 Receiver->mapFromGlobal(
88 ((QMouseEvent *)E)->globalPos() ),
89 ((QMouseEvent *)E)->globalPos(),
90 ((QMouseEvent *)E)->button(),
91 ((QMouseEvent *)E)->state()
92 );
93 return QPEApplication::sendEvent( Receiver, &QME );
94 }
95
96 // first let the label treat the event
97 return QLabel::event( E );
98}
99
100void RoHFeedback::iconShow( void ) {
101 switch( IconNr ) {
102 case FeedbackTimerStart:
103 IconNr = 0;
104 Timer.start( SPEED/NOOFICONS );
105 break;
106 case FeedbackStopped:
107 // stopped
108 IconNr = FeedbackTimerStart;
109 hide();
110 break;
111 case FeedbackShow: // first
112 show();
113 // FT
114 default :
115 // show
116
117 setPixmap( *(Imgs[IconNr]) );
118 setMask( *(Masks[IconNr]) );
119 IconNr = (IconNr+1)%NOOFICONS; // rotate
120 break;
121 }
122}
123
124}
125} \ No newline at end of file
diff --git a/library/backend/rohfeedback.h b/library/backend/rohfeedback.h
new file mode 100644
index 0000000..f38a095
--- a/dev/null
+++ b/library/backend/rohfeedback.h
@@ -0,0 +1,62 @@
1#ifndef ROHFEEDBACK_H
2#define ROHFEEDBACK_H
3
4/*
5
6 RightOnHold feedback show
7
8*/
9
10#define NOOFICONS 5
11
12#include <qlabel.h>
13#include <qtimer.h>
14
15class QEvent;
16class QPixmap;
17class QBitmap;
18class QMouseEvent;
19
20namespace Opie {
21namespace Internal {
22
23class RoHFeedback : public QLabel {
24
25 Q_OBJECT
26
27 enum Actions {
28 FeedbackStopped = -2,
29 FeedbackTimerStart = -1,
30 FeedbackShow = 0
31 };
32public :
33
34 RoHFeedback();
35 ~RoHFeedback();
36
37
38 void init( const QPoint & P, QWidget* wid );
39 void stop( void );
40 int delay( void );
41
42public slots :
43
44 void iconShow( void );
45
46protected :
47
48 bool event( QEvent * E );
49
50 QTimer Timer;
51 int IconNr;
52 QWidget * Receiver;
53
54 static int IconWidth;
55 static int IconHeight;
56 static QPixmap * Imgs[NOOFICONS];
57 static QBitmap * Masks[NOOFICONS];
58};
59}
60}
61
62#endif
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 59ca61b..acad81d 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -84,61 +84,66 @@
84#endif 84#endif
85 85
86#include "alarmserver.h" 86#include "alarmserver.h"
87#include "applnk.h" 87#include "applnk.h"
88#include "qpemenubar.h" 88#include "qpemenubar.h"
89#include "textcodecinterface.h" 89#include "textcodecinterface.h"
90#include "imagecodecinterface.h" 90#include "imagecodecinterface.h"
91 91
92#include <unistd.h> 92#include <unistd.h>
93#include <sys/file.h> 93#include <sys/file.h>
94#include <sys/ioctl.h> 94#include <sys/ioctl.h>
95#ifndef QT_NO_SOUND 95#ifndef QT_NO_SOUND
96#include <sys/soundcard.h> 96#include <sys/soundcard.h>
97#endif 97#endif
98#include "qt_override_p.h" 98#include "qt_override_p.h"
99 99
100#include <qpe/rohfeedback.h>
101
102
100static bool useBigPixmaps = 0; 103static bool useBigPixmaps = 0;
101 104
105
102class HackWidget : public QWidget 106class HackWidget : public QWidget
103{ 107{
104public: 108public:
105 bool needsOk() 109 bool needsOk()
106 { return (getWState() & WState_Reserved1 ); } 110 { return (getWState() & WState_Reserved1 ); }
107 111
108 QRect normalGeometry() 112 QRect normalGeometry()
109 { return topData()->normalGeometry; }; 113 { return topData()->normalGeometry; };
110}; 114};
111 115
112class QPEApplicationData 116class QPEApplicationData
113{ 117{
114public: 118public:
115 QPEApplicationData ( ) 119 QPEApplicationData ( )
116 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ), 120 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ),
117 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ), 121 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ),
118 keep_running( true ), qcopQok( false ), 122 keep_running( true ), qcopQok( false ),
119 fontFamily( "Vera" ), fontSize( 10 ), smallIconSize( 14 ), 123 fontFamily( "Vera" ), fontSize( 10 ), smallIconSize( 14 ),
120 bigIconSize( 32 ), qpe_main_widget( 0 ) 124 bigIconSize( 32 ), qpe_main_widget( 0 )
121 { 125 {
122 Config cfg( "qpe" ); 126 Config cfg( "qpe" );
123 cfg.setGroup( "Appearance" ); 127 cfg.setGroup( "Appearance" );
124 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false ); 128 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false );
125 fontFamily = cfg.readEntry( "FontFamily", "Vera" ); 129 fontFamily = cfg.readEntry( "FontFamily", "Vera" );
126 fontSize = cfg.readNumEntry( "FontSize", 10 ); 130 fontSize = cfg.readNumEntry( "FontSize", 10 );
127 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 ); 131 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 );
128 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 ); 132 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 );
133 RoH = 0;
129 } 134 }
130 135
131 int presstimer; 136 int presstimer;
132 QWidget* presswidget; 137 QWidget* presswidget;
133 QPoint presspos; 138 QPoint presspos;
134 139
135 bool rightpressed : 1; 140 bool rightpressed : 1;
136 bool kbgrabbed : 1; 141 bool kbgrabbed : 1;
137 bool notbusysent : 1; 142 bool notbusysent : 1;
138 bool preloaded : 1; 143 bool preloaded : 1;
139 bool forceshow : 1; 144 bool forceshow : 1;
140 bool nomaximize : 1; 145 bool nomaximize : 1;
141 bool keep_running : 1; 146 bool keep_running : 1;
142 bool qcopQok : 1; 147 bool qcopQok : 1;
143 148
144 QCString fontFamily; 149 QCString fontFamily;
@@ -479,32 +484,34 @@ static void qpe_show_dialog( QDialog* d, bool nomax )
479 for ( it = list.begin(); it != list.end(); ++it ) { 484 for ( it = list.begin(); it != list.end(); ++it ) {
480 ImageCodecInterface *iface = 0; 485 ImageCodecInterface *iface = 0;
481 QLibrary *lib = new QLibrary( path + "/" + *it ); 486 QLibrary *lib = new QLibrary( path + "/" + *it );
482 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 487 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
483 QStringList formats = iface->keys(); 488 QStringList formats = iface->keys();
484 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 489 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
485 (void)iface->installIOHandler(*i); 490 (void)iface->installIOHandler(*i);
486 // ### it exists now; need to remember if we can delete it 491 // ### it exists now; need to remember if we can delete it
487 } 492 }
488 } 493 }
489 else { 494 else {
490 lib->unload(); 495 lib->unload();
491 delete lib; 496 delete lib;
492 } 497 }
493 } 498 }
494 } 499 }
500
501 Opie::Internal::RoHFeedback * RoH;
495}; 502};
496 503
497class ResourceMimeFactory : public QMimeSourceFactory 504class ResourceMimeFactory : public QMimeSourceFactory
498{ 505{
499public: 506public:
500 ResourceMimeFactory() : resImage( 0 ) 507 ResourceMimeFactory() : resImage( 0 )
501 { 508 {
502 setFilePath( Global::helpPath() ); 509 setFilePath( Global::helpPath() );
503 setExtensionType( "html", "text/html;charset=UTF-8" ); 510 setExtensionType( "html", "text/html;charset=UTF-8" );
504 } 511 }
505 ~ResourceMimeFactory() { 512 ~ResourceMimeFactory() {
506 delete resImage; 513 delete resImage;
507 } 514 }
508 515
509 const QMimeSource* data( const QString& abs_name ) const 516 const QMimeSource* data( const QString& abs_name ) const
510 { 517 {
@@ -1192,33 +1199,33 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
1192 return QApplication::qwsEventFilter( e ); 1199 return QApplication::qwsEventFilter( e );
1193} 1200}
1194#endif 1201#endif
1195 1202
1196/*! 1203/*!
1197 Destroys the QPEApplication. 1204 Destroys the QPEApplication.
1198*/ 1205*/
1199QPEApplication::~QPEApplication() 1206QPEApplication::~QPEApplication()
1200{ 1207{
1201 ungrabKeyboard(); 1208 ungrabKeyboard();
1202#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 1209#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
1203 // Need to delete QCopChannels early, since the display will 1210 // Need to delete QCopChannels early, since the display will
1204 // be gone by the time we get to ~QObject(). 1211 // be gone by the time we get to ~QObject().
1205 delete sysChannel; 1212 delete sysChannel;
1206 delete pidChannel; 1213 delete pidChannel;
1207#endif 1214#endif
1208 1215 delete d->RoH;
1209 delete d; 1216 delete d;
1210} 1217}
1211 1218
1212/*! 1219/*!
1213 Returns <tt>$OPIEDIR/</tt>. 1220 Returns <tt>$OPIEDIR/</tt>.
1214*/ 1221*/
1215QString QPEApplication::qpeDir() 1222QString QPEApplication::qpeDir()
1216{ 1223{
1217 const char * base = getenv( "OPIEDIR" ); 1224 const char * base = getenv( "OPIEDIR" );
1218 if ( base ) 1225 if ( base )
1219 return QString( base ) + "/"; 1226 return QString( base ) + "/";
1220 1227
1221 return QString( "../" ); 1228 return QString( "../" );
1222} 1229}
1223 1230
1224/*! 1231/*!
@@ -2010,49 +2017,67 @@ void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode )
2010/*! 2017/*!
2011 \reimp 2018 \reimp
2012*/ 2019*/
2013bool QPEApplication::eventFilter( QObject *o, QEvent *e ) 2020bool QPEApplication::eventFilter( QObject *o, QEvent *e )
2014{ 2021{
2015 if ( !o->isWidgetType() ) 2022 if ( !o->isWidgetType() )
2016 return FALSE; 2023 return FALSE;
2017 2024
2018 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 2025 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
2019 QMouseEvent * me = ( QMouseEvent* ) e; 2026 QMouseEvent * me = ( QMouseEvent* ) e;
2020 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 2027 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
2021 switch (mode) { 2028 switch (mode) {
2022 case RightOnHold: 2029 case RightOnHold:
2023 switch ( me->type() ) { 2030 switch ( me->type() ) {
2024 case QEvent::MouseButtonPress: 2031 case QEvent::MouseButtonPress:
2025 if ( me->button() == LeftButton ) { 2032 if ( me->button() == LeftButton ) {
2026 if (!d->presstimer )
2027 d->presstimer = startTimer(500); // #### pref.
2028 d->presswidget = (QWidget*)o; 2033 d->presswidget = (QWidget*)o;
2029 d->presspos = me->pos(); 2034 d->presspos = me->pos();
2030 d->rightpressed = FALSE; 2035 d->rightpressed = FALSE;
2036 // just for the time being
2037 static int pref = 500;
2038#ifdef WITHROHFEEDBACK
2039 if( ! d->RoH )
2040 d->RoH = new Opie::Internal::RoHFeedback;
2041
2042 d->RoH->init( me->globalPos(), d->presswidget );
2043 pref = d->RoH->delay();
2044#endif
2045 if (!d->presstimer )
2046 d->presstimer = startTimer( pref ); // #### pref.
2047
2031 } 2048 }
2032 break; 2049 break;
2033 case QEvent::MouseMove: 2050 case QEvent::MouseMove:
2034 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 2051 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
2035 killTimer(d->presstimer); 2052 killTimer(d->presstimer);
2053#ifdef WITHROHFEEDBACK
2054 if( d->RoH )
2055 d->RoH->stop( );
2056#endif
2036 d->presstimer = 0; 2057 d->presstimer = 0;
2037 } 2058 }
2038 break; 2059 break;
2039 case QEvent::MouseButtonRelease: 2060 case QEvent::MouseButtonRelease:
2040 if ( me->button() == LeftButton ) { 2061 if ( me->button() == LeftButton ) {
2041 if ( d->presstimer ) { 2062 if ( d->presstimer ) {
2042 killTimer(d->presstimer); 2063 killTimer(d->presstimer);
2064#ifdef WITHROHFEEDBACK
2065 if( d->RoH )
2066 d->RoH->stop( );
2067#endif
2043 d->presstimer = 0; 2068 d->presstimer = 0;
2044 } 2069 }
2045 if ( d->rightpressed && d->presswidget ) { 2070 if ( d->rightpressed && d->presswidget ) {
2046 // Right released 2071 // Right released
2047 postEvent( d->presswidget, 2072 postEvent( d->presswidget,
2048 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 2073 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
2049 RightButton, LeftButton + RightButton ) ); 2074 RightButton, LeftButton + RightButton ) );
2050 // Left released, off-widget 2075 // Left released, off-widget
2051 postEvent( d->presswidget, 2076 postEvent( d->presswidget,
2052 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1), 2077 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
2053 LeftButton, LeftButton ) ); 2078 LeftButton, LeftButton ) );
2054 postEvent( d->presswidget, 2079 postEvent( d->presswidget,
2055 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1), 2080 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
2056 LeftButton, LeftButton ) ); 2081 LeftButton, LeftButton ) );
2057 d->rightpressed = FALSE; 2082 d->rightpressed = FALSE;
2058 return TRUE; // don't send the real Left release 2083 return TRUE; // don't send the real Left release
@@ -2080,32 +2105,33 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e )
2080 return FALSE; 2105 return FALSE;
2081} 2106}
2082 2107
2083/*! 2108/*!
2084 \reimp 2109 \reimp
2085*/ 2110*/
2086void QPEApplication::timerEvent( QTimerEvent *e ) 2111void QPEApplication::timerEvent( QTimerEvent *e )
2087{ 2112{
2088 if ( e->timerId() == d->presstimer && d->presswidget ) { 2113 if ( e->timerId() == d->presstimer && d->presswidget ) {
2089 // Right pressed 2114 // Right pressed
2090 postEvent( d->presswidget, 2115 postEvent( d->presswidget,
2091 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 2116 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
2092 RightButton, LeftButton ) ); 2117 RightButton, LeftButton ) );
2093 killTimer( d->presstimer ); 2118 killTimer( d->presstimer );
2094 d->presstimer = 0; 2119 d->presstimer = 0;
2095 d->rightpressed = TRUE; 2120 d->rightpressed = TRUE;
2121 d->RoH->stop();
2096 } 2122 }
2097} 2123}
2098 2124
2099void QPEApplication::removeSenderFromStylusDict() 2125void QPEApplication::removeSenderFromStylusDict()
2100{ 2126{
2101 stylusDict->remove 2127 stylusDict->remove
2102 ( ( void* ) sender() ); 2128 ( ( void* ) sender() );
2103 if ( d->presswidget == sender() ) 2129 if ( d->presswidget == sender() )
2104 d->presswidget = 0; 2130 d->presswidget = 0;
2105} 2131}
2106 2132
2107/*! 2133/*!
2108 \internal 2134 \internal
2109*/ 2135*/
2110bool QPEApplication::keyboardGrabbed() const 2136bool QPEApplication::keyboardGrabbed() const
2111{ 2137{