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

KDEUI

  • 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.
32bool _k_eventFilter(void *message);
33
37class KEventHackWidget : public QWidget
38{
39public:
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
58class KSystemEventFilterPrivate : public QObject
59{
60 Q_OBJECT
61
62public Q_SLOTS:
63 void filterWidgetDestroyed(QObject *widget)
64 {
65 KSystemEventFilter::removeEventFilter(qobject_cast<QWidget*>(widget));
66 }
67
68public:
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
87K_GLOBAL_STATIC(KSystemEventFilterPrivate, kSystemEventFilter)
88
89bool _k_eventFilter(void *message)
90{
91 return kSystemEventFilter->filterEvent(message);
92}
93
94bool 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
143namespace KSystemEventFilter
144{
145
146void installEventFilter(QWidget *filter)
147{
148 kSystemEventFilter->m_filters.append(filter);
149 kSystemEventFilter->connect(filter, SIGNAL(destroyed(QObject*)),
150 SLOT(filterWidgetDestroyed(QObject*)));
151}
152
153void 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"
QList
QObject
QWidget
K_GLOBAL_STATIC
#define K_GLOBAL_STATIC(TYPE, NAME)
kglobal.h
_k_eventFilter
bool _k_eventFilter(void *message)
Copyright 2009, 2010 Michael Leupold lemma@confuego.org
Definition: ksystemeventfilter.cpp:89
ksystemeventfilter.h
message
void message(KMessage::MessageType messageType, const QString &text, const QString &caption=QString())
KSystemEventFilter
Members of this namespace allow installing and removing global event-filters that will catch all wind...
Definition: ksystemeventfilter.cpp:144
KSystemEventFilter::installEventFilter
void installEventFilter(QWidget *filter)
Installs a widget filter as a global X11 event filter.
Definition: ksystemeventfilter.cpp:146
KSystemEventFilter::removeEventFilter
void removeEventFilter(const QWidget *filter)
Removes a global widget filter.
Definition: ksystemeventfilter.cpp:153
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 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-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 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
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