Skip to content

Commit f51e77d

Browse files
committed
add a flag of EventFilter in Window::pollEvent() and Window::waitEvent()
1 parent c08e4f9 commit f51e77d

File tree

3 files changed

+23
-14
lines changed

3 files changed

+23
-14
lines changed

TODO.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ This file is a list of ideas for gf. Some of them will eventually be in gf. Othe
1515
## graphics
1616

1717
- (font) use Signed Distance Field for big size fonts
18-
- (window/events) add a flag in `pollEvent`/`waitEvent` (`EventFlag::TouchAsMouse`, `EventFlag::NoWindowFilter`)
1918
- (curve/shape) add anti-aliasing to `Curve` and `Shape`
2019
- ideas: [vaserenderer](https://github.com/tyt2y3/vaserenderer),
2120
- ideas: [a forum thread](https://forum.libcinder.org/topic/smooth-thick-lines-using-geometry-shader#23286000001269127)

include/gf/Window.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,16 @@ inline namespace v1 {
5555
Decorated = 0x0004, ///< Is the window decorated?
5656
};
5757

58+
/**
59+
* @ingroup graphics_window_monitor
60+
* @brief Filter for events
61+
*/
62+
enum class EventFilter {
63+
TouchAsMouse = 0x0001, ///< Treat touch events as mouse events
64+
AnyWindow = 0x0002, ///< Grab events from any window, not just the created window
65+
};
66+
67+
5868
#ifndef DOXYGEN_SHOULD_SKIP_THIS
5969
}
6070

@@ -354,7 +364,7 @@ inline namespace v1 {
354364
* @return True if an event was returned, or false if the event queue was empty
355365
* @sa waitEvent()
356366
*/
357-
bool pollEvent(Event& event);
367+
bool pollEvent(Event& event, Flags<EventFilter> filters = None);
358368

359369
/**
360370
* @brief Wait for an event and return it
@@ -380,7 +390,7 @@ inline namespace v1 {
380390
* @return False if any error occurred
381391
* @sa pollEvent()
382392
*/
383-
bool waitEvent(Event& event);
393+
bool waitEvent(Event& event, Flags<EventFilter> filters = None);
384394

385395
/** @} */
386396

library/graphics/Window.cc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ inline namespace v1 {
411411
return modifiers;
412412
}
413413

414-
bool translateEvent(Vector2i size, const SDL_Event *in, Event& out) {
414+
bool translateEvent(Vector2i size, const SDL_Event *in, Event& out, Flags<EventFilter> filters) {
415415
out.timestamp = in->common.timestamp;
416416

417417
switch (in->type) {
@@ -513,7 +513,7 @@ inline namespace v1 {
513513
break;
514514

515515
case SDL_MOUSEWHEEL:
516-
if (in->wheel.which == SDL_TOUCH_MOUSEID) {
516+
if (in->wheel.which == SDL_TOUCH_MOUSEID && !filters.test(EventFilter::TouchAsMouse)) {
517517
return false;
518518
}
519519

@@ -530,7 +530,7 @@ inline namespace v1 {
530530
case SDL_MOUSEBUTTONDOWN:
531531
assert(in->button.state == SDL_PRESSED);
532532

533-
if (in->button.which == SDL_TOUCH_MOUSEID) {
533+
if (in->button.which == SDL_TOUCH_MOUSEID && !filters.test(EventFilter::TouchAsMouse)) {
534534
return false;
535535
}
536536

@@ -545,7 +545,7 @@ inline namespace v1 {
545545
case SDL_MOUSEBUTTONUP:
546546
assert(in->button.state == SDL_RELEASED);
547547

548-
if (in->button.which == SDL_TOUCH_MOUSEID) {
548+
if (in->button.which == SDL_TOUCH_MOUSEID && !filters.test(EventFilter::TouchAsMouse)) {
549549
return false;
550550
}
551551

@@ -558,7 +558,7 @@ inline namespace v1 {
558558
break;
559559

560560
case SDL_MOUSEMOTION:
561-
if (in->motion.which == SDL_TOUCH_MOUSEID) {
561+
if (in->motion.which == SDL_TOUCH_MOUSEID && !filters.test(EventFilter::TouchAsMouse)) {
562562
return false;
563563
}
564564

@@ -710,7 +710,7 @@ inline namespace v1 {
710710

711711
} // anonymous namespace
712712

713-
bool Window::pollEvent(Event& event) {
713+
bool Window::pollEvent(Event& event, Flags<EventFilter> filters) {
714714
assert(m_window);
715715

716716
if (pickEventForWindow(m_windowId, event)) {
@@ -726,9 +726,9 @@ inline namespace v1 {
726726
if (status == 0) {
727727
return false;
728728
}
729-
} while (!translateEvent(getSize(), &ev, event));
729+
} while (!translateEvent(getSize(), &ev, event, filters));
730730

731-
if (isEventWindowDependent(event) && getWindowIdFromEvent(event) != m_windowId) {
731+
if (isEventWindowDependent(event) && (filters.test(EventFilter::AnyWindow) || getWindowIdFromEvent(event) != m_windowId)) {
732732
g_pendingEvents.push_back(event);
733733
} else {
734734
break;
@@ -738,7 +738,7 @@ inline namespace v1 {
738738
return true;
739739
}
740740

741-
bool Window::waitEvent(Event& event) {
741+
bool Window::waitEvent(Event& event, Flags<EventFilter> filters) {
742742
assert(m_window);
743743
SDL_Event ev;
744744

@@ -753,9 +753,9 @@ inline namespace v1 {
753753
if (status == 0) {
754754
return false;
755755
}
756-
} while (!translateEvent(getSize(), &ev, event));
756+
} while (!translateEvent(getSize(), &ev, event, filters));
757757

758-
if (isEventWindowDependent(event) && getWindowIdFromEvent(event) != m_windowId) {
758+
if (isEventWindowDependent(event) && (filters.test(EventFilter::AnyWindow) || getWindowIdFromEvent(event) != m_windowId)) {
759759
g_pendingEvents.push_back(event);
760760
} else {
761761
break;

0 commit comments

Comments
 (0)