00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifdef KDE_USE_FINAL
00020 #ifdef KeyRelease
00021 #undef KeyRelease
00022 #endif
00023 #endif
00024
00025 #include <kcursor.h>
00026
00027 #include <qbitmap.h>
00028 #include <qcursor.h>
00029 #include <qevent.h>
00030 #include <qtimer.h>
00031 #include <qwidget.h>
00032
00033 #include <kglobal.h>
00034 #include <kconfig.h>
00035 #include <qscrollview.h>
00036
00037 #include "kcursor_private.h"
00038
00039 KCursor::KCursor()
00040 {
00041 }
00042
00043 QCursor KCursor::handCursor()
00044 {
00045 static QCursor *hand_cursor = 0;
00046
00047 if (hand_cursor == 0)
00048 {
00049 KConfig *config = KGlobal::config();
00050 KConfigGroupSaver saver( config, "General" );
00051
00052 if ( config->readEntry("handCursorStyle", "Windows") == "Windows" )
00053 {
00054 static const unsigned char HAND_BITS[] = {
00055 0x80, 0x01, 0x00, 0x40, 0x02, 0x00, 0x40, 0x02, 0x00, 0x40, 0x02,
00056 0x00, 0x40, 0x02, 0x00, 0x40, 0x02, 0x00, 0x40, 0x1e, 0x00, 0x40,
00057 0xf2, 0x00, 0x40, 0x92, 0x01, 0x70, 0x92, 0x02, 0x50, 0x92, 0x04,
00058 0x48, 0x80, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x04, 0x08, 0x00,
00059 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20,
00060 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x01, 0xc0, 0xff, 0x01};
00061 static const unsigned char HAND_MASK_BITS[] = {
00062 0x80, 0x01, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03,
00063 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x1f, 0x00, 0xc0,
00064 0xff, 0x00, 0xc0, 0xff, 0x01, 0xf0, 0xff, 0x03, 0xf0, 0xff, 0x07,
00065 0xf8, 0xff, 0x07, 0xf8, 0xff, 0x07, 0xf8, 0xff, 0x07, 0xf8, 0xff,
00066 0x07, 0xf8, 0xff, 0x07, 0xf0, 0xff, 0x07, 0xf0, 0xff, 0x07, 0xe0,
00067 0xff, 0x03, 0xc0, 0xff, 0x03, 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01};
00068 QBitmap hand_bitmap(22, 22, HAND_BITS, true);
00069 QBitmap hand_mask(22, 22, HAND_MASK_BITS, true);
00070 hand_cursor = new QCursor(hand_bitmap, hand_mask, 7, 0);
00071
00072
00073 hand_cursor->handle();
00074 }
00075 else
00076 hand_cursor = new QCursor(PointingHandCursor);
00077 }
00078
00079 Q_CHECK_PTR(hand_cursor);
00080 return *hand_cursor;
00081 }
00082
00083
00084 static const char * const working_cursor_xpm[]={
00085 "32 32 3 1",
00086 "# c None",
00087 "a c #000000",
00088 ". c #ffffff",
00089 "..##############################",
00090 ".a.##########.aaaa.#############",
00091 ".aa.#########.aaaa.#############",
00092 ".aaa.#######.aaaaaa.############",
00093 ".aaaa.#####.a...a..a..##########",
00094 ".aaaaa.####a....a...aa##########",
00095 ".aaaaaa.###a...aa...aa##########",
00096 ".aaaaaaa.##a..a.....aa##########",
00097 ".aaaaaaaa.#.aa.....a..##########",
00098 ".aaaaa....##.aaaaaa.############",
00099 ".aa.aa.######.aaaa.#############",
00100 ".a.#.aa.#####.aaaa.#############",
00101 "..##.aa.########################",
00102 "#####.aa.#######################",
00103 "#####.aa.#######################",
00104 "######..########################",
00105 "################################",
00106 "################################",
00107 "################################",
00108 "################################",
00109 "################################",
00110 "################################",
00111 "################################",
00112 "################################",
00113 "################################",
00114 "################################",
00115 "################################",
00116 "################################",
00117 "################################",
00118 "################################",
00119 "################################",
00120 "################################"};
00121
00122
00123 QCursor KCursor::workingCursor()
00124 {
00125 static QCursor *working_cursor = 0;
00126
00127 if (working_cursor == 0)
00128 {
00129 QPixmap pm( const_cast< const char** >( working_cursor_xpm ));
00130 working_cursor = new QCursor( pm, 1, 1 );
00131
00132
00133 working_cursor->handle();
00134 }
00135
00136 Q_CHECK_PTR(working_cursor);
00137 return *working_cursor;
00138 }
00139
00144 QCursor KCursor::arrowCursor()
00145 {
00146 return Qt::arrowCursor;
00147 }
00148
00149
00150 QCursor KCursor::upArrowCursor()
00151 {
00152 return Qt::upArrowCursor;
00153 }
00154
00155
00156 QCursor KCursor::crossCursor()
00157 {
00158 return Qt::crossCursor;
00159 }
00160
00161
00162 QCursor KCursor::waitCursor()
00163 {
00164 return Qt::waitCursor;
00165 }
00166
00167
00168 QCursor KCursor::ibeamCursor()
00169 {
00170 return Qt::ibeamCursor;
00171 }
00172
00173
00174 QCursor KCursor::sizeVerCursor()
00175 {
00176 return Qt::sizeVerCursor;
00177 }
00178
00179
00180 QCursor KCursor::sizeHorCursor()
00181 {
00182 return Qt::sizeHorCursor;
00183 }
00184
00185
00186 QCursor KCursor::sizeBDiagCursor()
00187 {
00188 return Qt::sizeBDiagCursor;
00189 }
00190
00191
00192 QCursor KCursor::sizeFDiagCursor()
00193 {
00194 return Qt::sizeFDiagCursor;
00195 }
00196
00197
00198 QCursor KCursor::sizeAllCursor()
00199 {
00200 return Qt::sizeAllCursor;
00201 }
00202
00203
00204 QCursor KCursor::blankCursor()
00205 {
00206 return Qt::blankCursor;
00207 }
00208
00209 QCursor KCursor::whatsThisCursor()
00210 {
00211 return Qt::whatsThisCursor;
00212 }
00213
00214
00215
00216 void KCursor::setAutoHideCursor( QWidget *w, bool enable )
00217 {
00218 setAutoHideCursor( w, enable, false );
00219 }
00220
00221 void KCursor::setAutoHideCursor( QWidget *w, bool enable,
00222 bool customEventFilter )
00223 {
00224 KCursorPrivate::self()->setAutoHideCursor( w, enable, customEventFilter );
00225 }
00226
00227 void KCursor::autoHideEventFilter( QObject *o, QEvent *e )
00228 {
00229 KCursorPrivate::self()->eventFilter( o, e );
00230 }
00231
00232 void KCursor::setHideCursorDelay( int ms )
00233 {
00234 KCursorPrivate::self()->hideCursorDelay = ms;
00235 }
00236
00237 int KCursor::hideCursorDelay()
00238 {
00239 return KCursorPrivate::self()->hideCursorDelay;
00240 }
00241
00242
00243
00244 KCursorPrivateAutoHideEventFilter::KCursorPrivateAutoHideEventFilter( QWidget* widget )
00245 : m_widget( widget )
00246 , m_wasMouseTracking( m_widget->hasMouseTracking() )
00247 , m_isCursorHidden( false )
00248 , m_isOwnCursor( false )
00249 {
00250 m_widget->setMouseTracking( true );
00251 connect( &m_autoHideTimer, SIGNAL( timeout() ),
00252 this, SLOT( hideCursor() ) );
00253 }
00254
00255 KCursorPrivateAutoHideEventFilter::~KCursorPrivateAutoHideEventFilter()
00256 {
00257 if( m_widget != NULL )
00258 m_widget->setMouseTracking( m_wasMouseTracking );
00259 }
00260
00261 void KCursorPrivateAutoHideEventFilter::resetWidget()
00262 {
00263 m_widget = NULL;
00264 }
00265
00266 void KCursorPrivateAutoHideEventFilter::hideCursor()
00267 {
00268 m_autoHideTimer.stop();
00269
00270 if ( m_isCursorHidden )
00271 return;
00272
00273 m_isCursorHidden = true;
00274
00275 QWidget* w = actualWidget();
00276
00277 m_isOwnCursor = w->ownCursor();
00278 if ( m_isOwnCursor )
00279 m_oldCursor = w->cursor();
00280
00281 w->setCursor( KCursor::blankCursor() );
00282 }
00283
00284 void KCursorPrivateAutoHideEventFilter::unhideCursor()
00285 {
00286 m_autoHideTimer.stop();
00287
00288 if ( !m_isCursorHidden )
00289 return;
00290
00291 m_isCursorHidden = false;
00292
00293 QWidget* w = actualWidget();
00294
00295 if ( m_isOwnCursor )
00296 w->setCursor( m_oldCursor );
00297 else
00298 w->unsetCursor();
00299 }
00300
00301 QWidget* KCursorPrivateAutoHideEventFilter::actualWidget() const
00302 {
00303 QWidget* w = m_widget;
00304
00305
00306 QScrollView * sv = dynamic_cast<QScrollView *>( w );
00307 if ( sv )
00308 w = sv->viewport();
00309
00310 return w;
00311 }
00312
00313 bool KCursorPrivateAutoHideEventFilter::eventFilter( QObject *o, QEvent *e )
00314 {
00315 Q_ASSERT( o == m_widget );
00316
00317 switch ( e->type() )
00318 {
00319 case QEvent::Create:
00320
00321 m_widget->setMouseTracking( true );
00322 break;
00323 case QEvent::Leave:
00324 case QEvent::FocusOut:
00325 case QEvent::WindowDeactivate:
00326 unhideCursor();
00327 break;
00328 case QEvent::KeyPress:
00329 case QEvent::AccelOverride:
00330 hideCursor();
00331 break;
00332 case QEvent::Enter:
00333 case QEvent::FocusIn:
00334 case QEvent::MouseButtonPress:
00335 case QEvent::MouseButtonRelease:
00336 case QEvent::MouseButtonDblClick:
00337 case QEvent::MouseMove:
00338 case QEvent::Show:
00339 case QEvent::Hide:
00340 case QEvent::Wheel:
00341 unhideCursor();
00342 if ( m_widget->hasFocus() )
00343 m_autoHideTimer.start( KCursorPrivate::self()->hideCursorDelay, true );
00344 break;
00345 default:
00346 break;
00347 }
00348
00349 return false;
00350 }
00351
00352 KCursorPrivate * KCursorPrivate::s_self = 0L;
00353
00354 KCursorPrivate * KCursorPrivate::self()
00355 {
00356 if ( !s_self )
00357 s_self = new KCursorPrivate;
00358
00359
00360 return s_self;
00361 }
00362
00363 KCursorPrivate::KCursorPrivate()
00364 {
00365 hideCursorDelay = 5000;
00366
00367 KConfig *kc = KGlobal::config();
00368 KConfigGroupSaver ks( kc, QString::fromLatin1("KDE") );
00369 enabled = kc->readBoolEntry(
00370 QString::fromLatin1("Autohiding cursor enabled"), true );
00371 }
00372
00373 KCursorPrivate::~KCursorPrivate()
00374 {
00375 }
00376
00377 void KCursorPrivate::setAutoHideCursor( QWidget *w, bool enable, bool customEventFilter )
00378 {
00379 if ( !w || !enabled )
00380 return;
00381
00382 if ( enable )
00383 {
00384 if ( m_eventFilters.find( w ) != NULL )
00385 return;
00386 KCursorPrivateAutoHideEventFilter* filter = new KCursorPrivateAutoHideEventFilter( w );
00387 m_eventFilters.insert( w, filter );
00388 if ( !customEventFilter )
00389 w->installEventFilter( filter );
00390 connect( w, SIGNAL( destroyed(QObject*) ),
00391 this, SLOT( slotWidgetDestroyed(QObject*) ) );
00392 }
00393 else
00394 {
00395 KCursorPrivateAutoHideEventFilter* filter = m_eventFilters.take( w );
00396 if ( filter == NULL )
00397 return;
00398 w->removeEventFilter( filter );
00399 delete filter;
00400 disconnect( w, SIGNAL( destroyed(QObject*) ),
00401 this, SLOT( slotWidgetDestroyed(QObject*) ) );
00402 }
00403 }
00404
00405 bool KCursorPrivate::eventFilter( QObject *o, QEvent *e )
00406 {
00407 if ( !enabled )
00408 return false;
00409
00410 KCursorPrivateAutoHideEventFilter* filter = m_eventFilters.find( o );
00411
00412 Q_ASSERT( filter != NULL );
00413 if ( filter == NULL )
00414 return false;
00415
00416 return filter->eventFilter( o, e );
00417 }
00418
00419 void KCursorPrivate::slotWidgetDestroyed( QObject* o )
00420 {
00421 KCursorPrivateAutoHideEventFilter* filter = m_eventFilters.take( o );
00422
00423 Q_ASSERT( filter != NULL );
00424
00425 filter->resetWidget();
00426 delete filter;
00427 }
00428
00429 #include "kcursor_private.moc"