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"