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