• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdelibs API Reference
  • KDE Home
  • Contact Us
 

KDEUI

  • sources
  • kde-4.14
  • kdelibs
  • kdeui
  • kernel
ksystemeventfilter.cpp
Go to the documentation of this file.
1 
21 #include "ksystemeventfilter.h"
22 
23 #include <QObject>
24 #include <QWidget>
25 #include <QWeakPointer>
26 #include <QSet>
27 #include <QAbstractEventDispatcher>
28 #include <kglobal.h>
29 
30 // Our global event-filter which will pass events to all registered
31 // widget filters.
32 bool _k_eventFilter(void *message);
33 
37 class KEventHackWidget : public QWidget
38 {
39 public:
40 #if defined(Q_WS_X11)
41  bool publicX11Event(XEvent *e)
42  {
43  return x11Event(e);
44  }
45 #elif defined(Q_WS_MAC)
46  bool publicMacEvent(EventHandlerCallRef caller, EventRef event)
47  {
48  return macEvent(caller, event);
49  }
50 #elif defined(Q_WS_WIN)
51  bool publicWinEvent(MSG *message, long *result)
52  {
53  return winEvent(message, result);
54  }
55 #endif
56 };
57 
58 class KSystemEventFilterPrivate : public QObject
59 {
60  Q_OBJECT
61 
62 public Q_SLOTS:
63  void filterWidgetDestroyed(QObject *widget)
64  {
65  KSystemEventFilter::removeEventFilter(qobject_cast<QWidget*>(widget));
66  }
67 
68 public:
69  KSystemEventFilterPrivate()
70  {
71  // install our event-filter. note that this will only happen when this
72  // object is constructed (which is when the global static is first
73  // accessed.
74  m_nextFilter = QAbstractEventDispatcher::instance()->setEventFilter(_k_eventFilter);
75  }
76 
77  bool filterEvent(void *message);
78 
79  // the installed event filters
80  QList< QWeakPointer<QWidget> > m_filters;
81  // if an event filter had already been previously installed, it is
82  // stored here so we can call it if none of our event filters consumes
83  // the event
84  QAbstractEventDispatcher::EventFilter m_nextFilter;
85 };
86 
87 K_GLOBAL_STATIC(KSystemEventFilterPrivate, kSystemEventFilter)
88 
89 bool _k_eventFilter(void *message)
90 {
91  return kSystemEventFilter->filterEvent(message);
92 }
93 
94 bool KSystemEventFilterPrivate::filterEvent(void *message)
95 {
96  if (!m_filters.isEmpty()) {
97 #if defined(Q_WS_X11)
98  XEvent *xevt = static_cast<XEvent*>(message);
99  // pass the event as long as it's not consumed
100  Q_FOREACH (const QWeakPointer<QWidget> &wp, m_filters) {
101  if (QWidget *w = wp.data()) {
102  if (static_cast<KEventHackWidget*>(w)->publicX11Event(xevt)) {
103  return true;
104  }
105  }
106  }
107 #elif defined(Q_WS_MAC)
108  // FIXME: untested
109 
110 /* NSEvent *nsevt = static_cast<NSEvent*>(message);
111  // pass the event as long as it's not consumed
112  Q_FOREACH (const QWeakPointer<QWidget> &wp, m_filters) {
113  if (QWidget *w = wp.data()) {
114  if (static_cast<KEventHackWidget*>(w)->publicMacEvent(0, nsevt->eventRef)) {
115  return true;
116  }
117  }
118  }*/
119 #elif defined(Q_WS_WIN)
120  // FIXME: untested
121 
122 /* MSG *msg = static_cast<MSG*>(message);
123  long ret; // widget filter returns are discarded!
124  // pass the event as long as it's not consumed
125  Q_FOREACH (const QWeakPointer<QWidget> &wp, m_filters) {
126  if (QWidget *w = wp.data()) {
127  if (static_cast<KEventHackWidget*>(w)->publicWinEvent(msg, &ret)) {
128  return true;
129  }
130  }
131  }*/
132 #endif
133  }
134 
135  // call next filter if we have one
136  if (m_nextFilter) {
137  return m_nextFilter(message);
138  } else {
139  return false;
140  }
141 }
142 
143 namespace KSystemEventFilter
144 {
145 
146 void installEventFilter(QWidget *filter)
147 {
148  kSystemEventFilter->m_filters.append(filter);
149  kSystemEventFilter->connect(filter, SIGNAL(destroyed(QObject*)),
150  SLOT(filterWidgetDestroyed(QObject*)));
151 }
152 
153 void removeEventFilter(const QWidget *filter)
154 {
155  QMutableListIterator< QWeakPointer<QWidget> > it(kSystemEventFilter->m_filters);
156  while (it.hasNext()) {
157  QWidget *w = it.next().data();
158  if (w == filter || w == 0) {
159  it.remove();
160  }
161  }
162 }
163 
164 }
165 
166 #include "ksystemeventfilter.moc"
QWidget
_k_eventFilter
bool _k_eventFilter(void *message)
Copyright 2009, 2010 Michael Leupold lemma@confuego.org
Definition: ksystemeventfilter.cpp:89
QAbstractEventDispatcher::instance
QAbstractEventDispatcher * instance(QThread *thread)
QAbstractEventDispatcher::EventFilter
typedef EventFilter
K_GLOBAL_STATIC
#define K_GLOBAL_STATIC(TYPE, NAME)
QWidget::macEvent
virtual bool macEvent(EventHandlerCallRef caller, EventRef event)
QWeakPointer::data
T * data() const
QWidget::x11Event
virtual bool x11Event(XEvent *event)
QWidget::winEvent
virtual bool winEvent(MSG *message, long *result)
kglobal.h
QObject
QMutableListIterator::remove
void remove()
QList
ksystemeventfilter.h
QMutableListIterator::hasNext
bool hasNext() const
QMutableListIterator::next
T & next()
QMutableListIterator
KSystemEventFilter::removeEventFilter
void removeEventFilter(const QWidget *filter)
Removes a global widget filter.
Definition: ksystemeventfilter.cpp:153
bool
KSystemEventFilter::installEventFilter
void installEventFilter(QWidget *filter)
Installs a widget filter as a global X11 event filter.
Definition: ksystemeventfilter.cpp:146
QWeakPointer
QAbstractEventDispatcher::setEventFilter
EventFilter setEventFilter(EventFilter filter)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:24:00 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDEUI

Skip menu "KDEUI"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal