2005-11-17 17:58:19 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2005, Haiku, Inc. All Rights Reserved.
|
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Axel Dörfler, axeld@pinc-software.de
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "EventDispatcher.h"
|
|
|
|
#include "EventStream.h"
|
|
|
|
#include "HWInterface.h"
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
#include "InputManager.h"
|
2005-11-17 17:58:19 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
#include <TokenSpace.h>
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
#include <Autolock.h>
|
|
|
|
#include <View.h>
|
|
|
|
|
2005-11-17 21:46:55 +03:00
|
|
|
#include <new>
|
2005-11-17 17:58:19 +03:00
|
|
|
#include <stdio.h>
|
2005-11-25 15:50:21 +03:00
|
|
|
#include <string.h>
|
2005-11-17 17:58:19 +03:00
|
|
|
|
|
|
|
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
//#define TRACE_EVENTS
|
|
|
|
#ifdef TRACE_EVENTS
|
|
|
|
# define ETRACE(x) printf x
|
|
|
|
#else
|
|
|
|
# define ETRACE(x) ;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2005-11-17 21:46:55 +03:00
|
|
|
/*!
|
2005-11-29 20:00:08 +03:00
|
|
|
The EventDispatcher is a per Desktop object that handles all input
|
|
|
|
events for that desktop.
|
|
|
|
|
|
|
|
The events are processed as needed in the Desktop class (via EventFilters),
|
|
|
|
and then forwarded to the actual target of the event, a client window
|
|
|
|
(or more correctly, to its EventTarget).
|
|
|
|
You cannot set the target of an event directly - the event filters need
|
|
|
|
to specify the targets.
|
|
|
|
The event loop will make sure that every target and interested listener
|
|
|
|
will get the event - it also delivers mouse moved events to the previous
|
|
|
|
target once so that this target can then spread the B_EXITED_VIEW transit
|
|
|
|
to the local target handler (usually a BView).
|
|
|
|
|
|
|
|
If you look at the event_listener structure below, the differentiation
|
|
|
|
between target and token may look odd, but it really has a reason as
|
|
|
|
well:
|
2005-11-24 19:04:29 +03:00
|
|
|
All events are sent to the preferred window handler only - the window
|
|
|
|
may then use the token or token list to identify the specific target
|
2005-11-29 20:00:08 +03:00
|
|
|
view(s). This makes it possible to send every event only once, no
|
|
|
|
matter how many local target handlers there are.
|
2005-11-17 21:46:55 +03:00
|
|
|
*/
|
2005-11-24 19:04:29 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
struct event_listener {
|
2005-11-17 21:46:55 +03:00
|
|
|
int32 token;
|
2005-11-21 19:25:23 +03:00
|
|
|
uint32 event_mask;
|
2005-11-17 21:46:55 +03:00
|
|
|
uint32 options;
|
2005-11-21 19:25:23 +03:00
|
|
|
uint32 temporary_event_mask;
|
2005-11-17 21:46:55 +03:00
|
|
|
uint32 temporary_options;
|
2005-11-24 19:04:29 +03:00
|
|
|
|
|
|
|
uint32 EffectiveEventMask() const { return event_mask | temporary_event_mask; }
|
2006-01-11 15:25:06 +03:00
|
|
|
uint32 EffectiveOptions() const { return options | temporary_options; }
|
2005-11-17 21:46:55 +03:00
|
|
|
};
|
|
|
|
|
2005-11-21 19:25:23 +03:00
|
|
|
static const char* kTokenName = "_token";
|
2005-11-17 21:46:55 +03:00
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
static const float kMouseMovedImportance = 0.1f;
|
|
|
|
static const float kMouseTransitImportance = 1.0f;
|
|
|
|
static const float kStandardImportance = 0.9f;
|
2005-11-17 21:46:55 +03:00
|
|
|
static const float kListenerImportance = 0.8f;
|
2005-11-17 17:58:19 +03:00
|
|
|
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget::EventTarget()
|
2005-11-24 19:04:29 +03:00
|
|
|
:
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
fListeners(2, true)
|
2005-11-24 19:04:29 +03:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget::~EventTarget()
|
2005-11-24 19:04:29 +03:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
void
|
|
|
|
EventTarget::SetTo(const BMessenger& messenger)
|
|
|
|
{
|
|
|
|
fMessenger = messenger;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
event_listener*
|
|
|
|
EventTarget::FindListener(int32 token, int32* _index)
|
2005-11-24 19:04:29 +03:00
|
|
|
{
|
|
|
|
for (int32 i = fListeners.CountItems(); i-- > 0;) {
|
|
|
|
event_listener* listener = fListeners.ItemAt(i);
|
|
|
|
|
|
|
|
if (listener->token == token) {
|
|
|
|
if (_index)
|
|
|
|
*_index = i;
|
|
|
|
return listener;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget::_RemoveTemporaryListener(event_listener* listener, int32 index)
|
2005-11-24 19:04:29 +03:00
|
|
|
{
|
|
|
|
if (listener->event_mask == 0) {
|
|
|
|
// this is only a temporary target
|
|
|
|
ETRACE(("events: remove temp. listener: token %ld, eventMask = %ld, options = %ld\n",
|
|
|
|
listener->token, listener->temporary_event_mask, listener->temporary_options));
|
|
|
|
|
|
|
|
fListeners.RemoveItemAt(index);
|
|
|
|
delete listener;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (listener->temporary_event_mask != 0) {
|
|
|
|
ETRACE(("events: clear temp. listener: token %ld, eventMask = %ld, options = %ld\n",
|
|
|
|
listener->token, listener->temporary_event_mask, listener->temporary_options));
|
|
|
|
|
|
|
|
listener->temporary_event_mask = 0;
|
|
|
|
listener->temporary_options = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget::RemoveTemporaryListeners()
|
2005-11-24 19:04:29 +03:00
|
|
|
{
|
|
|
|
for (int32 index = CountListeners(); index-- > 0;) {
|
|
|
|
event_listener* listener = ListenerAt(index);
|
|
|
|
|
|
|
|
_RemoveTemporaryListener(listener, index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget::RemoveTemporaryListener(int32 token)
|
2005-11-24 19:04:29 +03:00
|
|
|
{
|
|
|
|
int32 index;
|
|
|
|
event_listener* listener = FindListener(token, &index);
|
|
|
|
if (listener == NULL)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return _RemoveTemporaryListener(listener, index);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget::RemoveListener(int32 token)
|
2005-11-24 19:04:29 +03:00
|
|
|
{
|
|
|
|
int32 index;
|
|
|
|
event_listener* listener = FindListener(token, &index);
|
|
|
|
if (listener == NULL)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (listener->temporary_event_mask != 0) {
|
|
|
|
// we still need this event
|
|
|
|
listener->event_mask = 0;
|
|
|
|
listener->options = 0;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
fListeners.RemoveItemAt(index);
|
|
|
|
delete listener;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget::AddListener(int32 token, uint32 eventMask,
|
2005-11-24 19:04:29 +03:00
|
|
|
uint32 options, bool temporary)
|
|
|
|
{
|
|
|
|
event_listener* listener = new (std::nothrow) event_listener;
|
|
|
|
if (listener == NULL)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
listener->token = token;
|
|
|
|
|
|
|
|
if (temporary) {
|
|
|
|
listener->event_mask = 0;
|
|
|
|
listener->options = 0;
|
|
|
|
listener->temporary_event_mask = eventMask;
|
|
|
|
listener->temporary_options = options;
|
|
|
|
} else {
|
|
|
|
listener->event_mask = eventMask;
|
|
|
|
listener->options = options;
|
|
|
|
listener->temporary_event_mask = 0;
|
|
|
|
listener->temporary_options = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool success = fListeners.AddItem(listener);
|
|
|
|
if (!success)
|
|
|
|
delete listener;
|
|
|
|
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// #pragma mark -
|
|
|
|
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
EventDispatcher::EventDispatcher()
|
|
|
|
: BLocker("event dispatcher"),
|
|
|
|
fStream(NULL),
|
|
|
|
fThread(-1),
|
|
|
|
fCursorThread(-1),
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
fPreviousMouseTarget(NULL),
|
2005-11-24 19:04:29 +03:00
|
|
|
fFocus(NULL),
|
2005-11-17 21:46:55 +03:00
|
|
|
fSuspendFocus(false),
|
2005-11-17 17:58:19 +03:00
|
|
|
fMouseFilter(NULL),
|
2005-11-18 16:51:32 +03:00
|
|
|
fKeyboardFilter(NULL),
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
fTargets(10),
|
2006-01-11 15:25:06 +03:00
|
|
|
fNextLatestMouseMoved(NULL),
|
2005-11-17 17:58:19 +03:00
|
|
|
fCursorLock("cursor loop lock"),
|
|
|
|
fHWInterface(NULL)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EventDispatcher::~EventDispatcher()
|
|
|
|
{
|
|
|
|
_Unset();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
status_t
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
EventDispatcher::SetTo(EventStream* stream)
|
2005-11-17 17:58:19 +03:00
|
|
|
{
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
ETRACE(("event dispatcher: stream = %p\n", stream));
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
_Unset();
|
|
|
|
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
if (stream == NULL)
|
|
|
|
return B_OK;
|
|
|
|
|
|
|
|
fStream = stream;
|
2005-11-17 17:58:19 +03:00
|
|
|
return _Run();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
status_t
|
|
|
|
EventDispatcher::InitCheck()
|
|
|
|
{
|
|
|
|
if (fStream != NULL) {
|
|
|
|
if (fThread < B_OK)
|
|
|
|
return fThread;
|
|
|
|
|
|
|
|
return B_OK;
|
|
|
|
}
|
|
|
|
return B_NO_INIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
EventDispatcher::_Unset()
|
|
|
|
{
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
if (fStream == NULL)
|
|
|
|
return;
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
fStream->SendQuit();
|
|
|
|
|
2005-11-30 18:31:33 +03:00
|
|
|
status_t status;
|
|
|
|
wait_for_thread(fThread, &status);
|
|
|
|
wait_for_thread(fCursorThread, &status);
|
2005-11-17 17:58:19 +03:00
|
|
|
|
|
|
|
fThread = fCursorThread = -1;
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
|
|
|
|
gInputManager->PutStream(fStream);
|
|
|
|
fStream = NULL;
|
2005-11-17 17:58:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
status_t
|
|
|
|
EventDispatcher::_Run()
|
|
|
|
{
|
|
|
|
fThread = spawn_thread(_event_looper, "event loop",
|
|
|
|
B_REAL_TIME_DISPLAY_PRIORITY - 10, this);
|
|
|
|
if (fThread < B_OK)
|
|
|
|
return fThread;
|
|
|
|
|
|
|
|
if (fStream->SupportsCursorThread()) {
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
ETRACE(("event stream supports cursor thread!\n"));
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
fCursorThread = spawn_thread(_cursor_looper, "cursor loop",
|
|
|
|
B_REAL_TIME_DISPLAY_PRIORITY - 5, this);
|
|
|
|
if (resume_thread(fCursorThread) != B_OK) {
|
|
|
|
kill_thread(fCursorThread);
|
|
|
|
fCursorThread = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return resume_thread(fThread);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
/*!
|
|
|
|
\brief Removes any reference to the target, but doesn't delete it.
|
|
|
|
*/
|
2005-11-24 19:04:29 +03:00
|
|
|
void
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventDispatcher::RemoveTarget(EventTarget& target)
|
2005-11-17 17:58:19 +03:00
|
|
|
{
|
|
|
|
BAutolock _(this);
|
2005-11-17 21:46:55 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (fFocus == &target)
|
2005-11-24 19:04:29 +03:00
|
|
|
fFocus = NULL;
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (fPreviousMouseTarget == &target)
|
|
|
|
fPreviousMouseTarget = NULL;
|
2005-11-17 19:08:04 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
fTargets.RemoveItem(&target);
|
2005-11-24 19:04:29 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-18 18:50:30 +03:00
|
|
|
/*!
|
|
|
|
\brief Adds the specified listener or updates its event mask and options
|
|
|
|
if already added.
|
|
|
|
|
|
|
|
It follows the BView semantics in that specifiying an event mask of zero
|
|
|
|
leaves the event mask untouched and just updates the options.
|
|
|
|
*/
|
2005-11-17 21:46:55 +03:00
|
|
|
bool
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventDispatcher::_AddListener(EventTarget& target, int32 token,
|
2005-11-21 19:25:23 +03:00
|
|
|
uint32 eventMask, uint32 options, bool temporary)
|
2005-11-17 21:46:55 +03:00
|
|
|
{
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
BAutolock _(this);
|
|
|
|
|
|
|
|
if (!fTargets.HasItem(&target))
|
|
|
|
fTargets.AddItem(&target);
|
2005-11-24 19:04:29 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
event_listener* listener = target.FindListener(token);
|
2005-11-24 19:04:29 +03:00
|
|
|
if (listener != NULL) {
|
2005-11-17 21:46:55 +03:00
|
|
|
// we already have this target, update its event mask
|
|
|
|
if (temporary) {
|
2005-11-21 19:25:23 +03:00
|
|
|
if (eventMask != 0)
|
2005-11-24 19:04:29 +03:00
|
|
|
listener->temporary_event_mask = eventMask;
|
|
|
|
listener->temporary_options = options;
|
2005-11-17 21:46:55 +03:00
|
|
|
} else {
|
2005-11-21 19:25:23 +03:00
|
|
|
if (eventMask != 0)
|
2005-11-24 19:04:29 +03:00
|
|
|
listener->event_mask = eventMask;
|
|
|
|
listener->options = options;
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2005-11-21 19:25:23 +03:00
|
|
|
if (eventMask == 0)
|
2005-11-18 18:50:30 +03:00
|
|
|
return false;
|
|
|
|
|
2005-11-21 19:25:23 +03:00
|
|
|
ETRACE(("events: add listener: token %ld, eventMask = %ld, options = %ld, %s\n",
|
|
|
|
token, eventMask, options, temporary ? "temporary" : "permanent"));
|
2005-11-20 19:03:11 +03:00
|
|
|
|
2005-11-17 21:46:55 +03:00
|
|
|
// we need a new target
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
bool success = target.AddListener(token, eventMask, options, temporary);
|
2005-11-24 19:04:29 +03:00
|
|
|
if (!success) {
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (target.IsEmpty())
|
|
|
|
fTargets.RemoveItem(&target);
|
2005-11-24 19:04:29 +03:00
|
|
|
} else {
|
2005-11-17 21:46:55 +03:00
|
|
|
if (options & B_SUSPEND_VIEW_FOCUS)
|
|
|
|
fSuspendFocus = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
EventDispatcher::_RemoveTemporaryListeners()
|
|
|
|
{
|
2005-11-24 19:04:29 +03:00
|
|
|
for (int32 i = fTargets.CountItems(); i-- > 0;) {
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget* target = fTargets.ItemAt(i);
|
2005-11-17 21:46:55 +03:00
|
|
|
|
2005-11-24 19:04:29 +03:00
|
|
|
target->RemoveTemporaryListeners();
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventDispatcher::AddListener(EventTarget& target, int32 token,
|
2005-11-21 19:25:23 +03:00
|
|
|
uint32 eventMask, uint32 options)
|
2005-11-17 21:46:55 +03:00
|
|
|
{
|
2005-11-21 19:25:23 +03:00
|
|
|
options &= B_NO_POINTER_HISTORY;
|
|
|
|
// that's currently the only allowed option
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
return _AddListener(target, token, eventMask, options, false);
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventDispatcher::AddTemporaryListener(EventTarget& target,
|
2005-11-21 19:25:23 +03:00
|
|
|
int32 token, uint32 eventMask, uint32 options)
|
2005-11-17 21:46:55 +03:00
|
|
|
{
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
return _AddListener(target, token, eventMask, options, true);
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventDispatcher::RemoveListener(EventTarget& target, int32 token)
|
2005-11-18 18:50:30 +03:00
|
|
|
{
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
BAutolock _(this);
|
2005-11-20 19:03:11 +03:00
|
|
|
ETRACE(("events: remove listener token %ld\n", token));
|
2005-11-18 18:50:30 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (target.RemoveListener(token) && target.IsEmpty())
|
|
|
|
fTargets.RemoveItem(&target);
|
2005-11-18 18:50:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventDispatcher::RemoveTemporaryListener(EventTarget& target, int32 token)
|
2005-11-17 21:46:55 +03:00
|
|
|
{
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
BAutolock _(this);
|
|
|
|
ETRACE(("events: remove temporary listener token %ld\n", token));
|
2005-11-17 21:46:55 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (target.RemoveTemporaryListener(token) && target.IsEmpty())
|
|
|
|
fTargets.RemoveItem(&target);
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
void
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventDispatcher::SetMouseFilter(EventFilter* filter)
|
2005-11-17 17:58:19 +03:00
|
|
|
{
|
|
|
|
BAutolock _(this);
|
|
|
|
|
|
|
|
if (fMouseFilter == filter)
|
|
|
|
return;
|
|
|
|
|
|
|
|
delete fMouseFilter;
|
|
|
|
fMouseFilter = filter;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventDispatcher::SetKeyboardFilter(EventFilter* filter)
|
2005-11-17 17:58:19 +03:00
|
|
|
{
|
|
|
|
BAutolock _(this);
|
|
|
|
|
2005-11-18 16:51:32 +03:00
|
|
|
if (fKeyboardFilter == filter)
|
2005-11-17 17:58:19 +03:00
|
|
|
return;
|
|
|
|
|
2005-11-18 16:51:32 +03:00
|
|
|
delete fKeyboardFilter;
|
|
|
|
fKeyboardFilter = filter;
|
2005-11-17 17:58:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-23 14:27:09 +03:00
|
|
|
void
|
|
|
|
EventDispatcher::GetMouse(BPoint& where, int32& buttons)
|
|
|
|
{
|
2005-11-30 13:45:01 +03:00
|
|
|
BAutolock _(this);
|
2005-11-23 14:27:09 +03:00
|
|
|
|
|
|
|
where = fLastCursorPosition;
|
|
|
|
buttons = fLastButtons;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-30 13:45:01 +03:00
|
|
|
void
|
|
|
|
EventDispatcher::SendFakeMouseMoved(EventTarget& target, int32 viewToken)
|
|
|
|
{
|
|
|
|
BAutolock _(this);
|
|
|
|
|
|
|
|
BMessage moved(B_MOUSE_MOVED);
|
|
|
|
moved.AddPoint("screen_where", fLastCursorPosition);
|
|
|
|
moved.AddInt32("buttons", fLastButtons);
|
|
|
|
moved.AddInt32("_view_token", viewToken);
|
2005-12-08 15:41:19 +03:00
|
|
|
|
|
|
|
if (fDraggingMessage) {
|
|
|
|
/* moved.AddInt32("_msg_data", );
|
|
|
|
moved.AddInt32("_msg_base_", );
|
|
|
|
moved.AddInt32("_msg_what_", fDragMessage->what);*/
|
|
|
|
moved.AddMessage("be:drag_message", &fDragMessage);
|
|
|
|
}
|
|
|
|
|
2005-11-30 13:45:01 +03:00
|
|
|
_SendMessage(target.Messenger(), &moved, kMouseTransitImportance);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
bool
|
|
|
|
EventDispatcher::HasCursorThread()
|
|
|
|
{
|
|
|
|
return fCursorThread >= B_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Sets the HWInterface to use when moving the mouse cursor.
|
|
|
|
\a interface is allowed to be NULL.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
EventDispatcher::SetHWInterface(HWInterface* interface)
|
|
|
|
{
|
|
|
|
BAutolock _(fCursorLock);
|
|
|
|
|
|
|
|
fHWInterface = interface;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-12-08 15:41:19 +03:00
|
|
|
void
|
|
|
|
EventDispatcher::SetDragMessage(BMessage& message)
|
|
|
|
{
|
|
|
|
printf("EventDispatcher::SetDragMessage()\n");
|
|
|
|
|
|
|
|
BAutolock _(*this);
|
|
|
|
|
|
|
|
fDragMessage = message;
|
|
|
|
|
|
|
|
fDraggingMessage = true;
|
|
|
|
}
|
|
|
|
|
2005-11-24 19:04:29 +03:00
|
|
|
// #pragma mark - Message methods
|
|
|
|
|
|
|
|
|
2005-11-17 21:46:55 +03:00
|
|
|
/*!
|
|
|
|
\brief Sends \a message to the provided \a messenger.
|
|
|
|
|
|
|
|
TODO: the following feature is not yet implemented:
|
|
|
|
If the message could not be delivered immediately, it is included
|
|
|
|
in a waiting message queue with a fixed length - the least important
|
|
|
|
messages are removed first when that gets full.
|
|
|
|
|
|
|
|
Returns "false" if the target port does not exist anymore, "true"
|
|
|
|
if it doesn't.
|
|
|
|
*/
|
|
|
|
bool
|
2005-11-17 19:08:04 +03:00
|
|
|
EventDispatcher::_SendMessage(BMessenger& messenger, BMessage* message,
|
2005-11-17 17:58:19 +03:00
|
|
|
float importance)
|
|
|
|
{
|
|
|
|
// TODO: add failed messages to a queue, and start dropping them by importance
|
2006-01-10 23:47:16 +03:00
|
|
|
// (and use the same mechanism in ServerWindow::SendMessageToClient())
|
2005-11-17 17:58:19 +03:00
|
|
|
|
2006-01-10 23:47:16 +03:00
|
|
|
status_t status = messenger.SendMessage(message, (BHandler*)NULL, 0);
|
2005-11-25 15:50:21 +03:00
|
|
|
if (status != B_OK) {
|
|
|
|
printf("EventDispatcher: failed to send message '%.4s' to target: %s\n",
|
|
|
|
(char*)&message->what, strerror(status));
|
|
|
|
}
|
2005-11-17 21:46:55 +03:00
|
|
|
|
|
|
|
if (status == B_BAD_PORT_ID) {
|
|
|
|
// the target port is gone
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
2005-11-17 17:58:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-17 21:46:55 +03:00
|
|
|
bool
|
2006-01-11 15:25:06 +03:00
|
|
|
EventDispatcher::_AddTokens(BMessage* message, EventTarget* target,
|
|
|
|
uint32 eventMask, BMessage* nextMouseMoved, int32* _viewToken)
|
2005-11-17 21:46:55 +03:00
|
|
|
{
|
|
|
|
_RemoveTokens(message);
|
|
|
|
|
2005-11-24 19:04:29 +03:00
|
|
|
int32 count = target->CountListeners();
|
2006-01-11 15:25:06 +03:00
|
|
|
int32 added = 0;
|
|
|
|
|
|
|
|
for (int32 i = 0; i < count; i++) {
|
2005-11-24 19:04:29 +03:00
|
|
|
event_listener* listener = target->ListenerAt(i);
|
2006-01-11 15:25:06 +03:00
|
|
|
if ((listener->EffectiveEventMask() & eventMask) == 0)
|
|
|
|
continue;
|
|
|
|
|
2006-01-17 19:14:53 +03:00
|
|
|
if (nextMouseMoved != NULL && message->what == B_MOUSE_MOVED
|
2006-01-11 15:25:06 +03:00
|
|
|
&& (listener->EffectiveOptions() & B_NO_POINTER_HISTORY) != 0
|
2006-01-17 19:14:53 +03:00
|
|
|
&& message != nextMouseMoved
|
|
|
|
&& _viewToken != NULL) {
|
2006-01-11 15:25:06 +03:00
|
|
|
if (listener->token == *_viewToken) {
|
|
|
|
// focus view doesn't want to get pointer history
|
|
|
|
*_viewToken = B_NULL_TOKEN;
|
|
|
|
}
|
2005-11-24 19:04:29 +03:00
|
|
|
continue;
|
|
|
|
}
|
2005-11-17 21:46:55 +03:00
|
|
|
|
2005-11-24 19:04:29 +03:00
|
|
|
ETRACE((" add token %ld\n", listener->token));
|
|
|
|
|
2006-01-11 15:25:06 +03:00
|
|
|
if (message->AddInt32(kTokenName, listener->token) == B_OK)
|
|
|
|
added++;
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
|
2006-01-11 15:25:06 +03:00
|
|
|
return added != 0;
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
EventDispatcher::_RemoveTokens(BMessage* message)
|
|
|
|
{
|
|
|
|
message->RemoveName(kTokenName);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-22 15:49:35 +03:00
|
|
|
void
|
|
|
|
EventDispatcher::_SetFeedFocus(BMessage* message)
|
|
|
|
{
|
|
|
|
if (message->ReplaceBool("_feed_focus", true) != B_OK)
|
|
|
|
message->AddBool("_feed_focus", true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
EventDispatcher::_UnsetFeedFocus(BMessage* message)
|
|
|
|
{
|
|
|
|
message->RemoveName("_feed_focus");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-12-08 15:41:19 +03:00
|
|
|
void
|
|
|
|
EventDispatcher::_DeliverDragMessage()
|
|
|
|
{
|
|
|
|
printf("EventDispatcher::_DeliverDragMessage()\n");
|
|
|
|
|
|
|
|
if (fDraggingMessage && fPreviousMouseTarget) {
|
|
|
|
fDragMessage.RemoveName("_original_what");
|
|
|
|
fDragMessage.AddInt32("_original_what", fDragMessage.what);
|
|
|
|
fDragMessage.what = _MESSAGE_DROPPED_;
|
|
|
|
|
|
|
|
// fDragMessage.AddBool("dropped", true);
|
|
|
|
printf(" sending message to previous mouse target\n");
|
|
|
|
_SendMessage(fPreviousMouseTarget->Messenger(),
|
|
|
|
&fDragMessage, 100.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
fDragMessage.MakeEmpty();
|
|
|
|
fDragMessage.what = 0;
|
|
|
|
fDraggingMessage = false;
|
2005-12-26 01:17:17 +03:00
|
|
|
|
|
|
|
fHWInterface->SetDragBitmap(NULL, B_ORIGIN);
|
2005-12-08 15:41:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-24 19:04:29 +03:00
|
|
|
// #pragma mark - Event loops
|
|
|
|
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
void
|
|
|
|
EventDispatcher::_EventLoop()
|
|
|
|
{
|
|
|
|
BMessage* event;
|
|
|
|
while (fStream->GetNextEvent(&event)) {
|
|
|
|
if (event == NULL) {
|
|
|
|
// may happen in out of memory situations or junk at the port
|
|
|
|
// we can't do anything about those yet
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
BAutolock _(this);
|
2005-11-17 21:46:55 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget* current = NULL;
|
|
|
|
EventTarget* previous = NULL;
|
2005-11-17 21:46:55 +03:00
|
|
|
bool pointerEvent = false;
|
|
|
|
bool keyboardEvent = false;
|
|
|
|
bool addedTokens = false;
|
2005-11-17 17:58:19 +03:00
|
|
|
|
|
|
|
switch (event->what) {
|
|
|
|
case B_MOUSE_MOVED:
|
2005-11-23 14:27:09 +03:00
|
|
|
{
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
BPoint where;
|
|
|
|
if (event->FindPoint("where", &where) == B_OK)
|
|
|
|
fLastCursorPosition = where;
|
|
|
|
|
2005-12-08 15:41:19 +03:00
|
|
|
if (fDraggingMessage) {
|
|
|
|
/* event->AddInt32("_msg_data", );
|
|
|
|
event->AddInt32("_msg_base_", );
|
|
|
|
event->AddInt32("_msg_what_", fDragMessage->what);*/
|
|
|
|
event->AddMessage("be:drag_message", &fDragMessage);
|
|
|
|
}
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
if (!HasCursorThread()) {
|
|
|
|
// there is no cursor thread, we need to move the cursor ourselves
|
|
|
|
BAutolock _(fCursorLock);
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (fHWInterface != NULL) {
|
|
|
|
fHWInterface->MoveCursorTo(fLastCursorPosition.x,
|
|
|
|
fLastCursorPosition.y);
|
2005-11-17 17:58:19 +03:00
|
|
|
}
|
|
|
|
}
|
2006-01-11 02:18:36 +03:00
|
|
|
|
2006-01-11 15:25:06 +03:00
|
|
|
// This is for B_NO_POINTER_HISTORY - we always want the
|
|
|
|
// latest mouse moved event in the queue only
|
|
|
|
if (fNextLatestMouseMoved == NULL)
|
|
|
|
fNextLatestMouseMoved = fStream->PeekLatestMouseMoved();
|
|
|
|
else if (fNextLatestMouseMoved != event) {
|
|
|
|
// Drop older mouse moved messages if the server is lagging too
|
|
|
|
// much (if the message is older than 100 msecs)
|
|
|
|
bigtime_t eventTime;
|
|
|
|
if (event->FindInt64("when", &eventTime) == B_OK) {
|
|
|
|
if (system_time() - eventTime > 100000)
|
|
|
|
break;
|
ServerFont:
* fixed weird pointer conversion in SetStyle()
* fixed a potential mix up in operator=() in case the
other ServerFont has fStyle == NULL
ServerWindow:
* the WindowLayer fTopLayer cannot be deleted by
client request, just for safety reasons
* the link is flushed if there is no drawing engine,
but this case is theoretical only
* deleting the ServerWindow object syncs with the
client, so that when BBitmaps are deleted, they
can be sure there are no pending messages (which
would be executed in a nother thread)
* there is no timeout anymore when sending messages
to the client, which made absolutely no sense
AGGTextRenderer:
* renamed fFontManager to fFontCache, because that's
what it really is
* fLastFamilyAndStyle defaulted to the system plain
font and therefor that font was never loaded when
the font never changed meanwhile
DrawingMode:
* I'm not quite sure but I think there was the
potential of a division by zero, at least I
had crashes with "divide error"
HWInterface:
* fix update when the cursor shape changed in
double buffered mode
ViewLayer:
* since the top layer is never really deleted
before its time has come, it is not necessary
to set it to NULL in the ViewLayer destructor
ViewLayer/WindowLayer:
* added a function to collect the view tokens
that are affected by an update session
EventDispatcher:
* use the importance of the message for the timeout
in _SendMessage()
* drop mouse moved events in the server if we're
lagging behind more than 5 ms (Axel, maybe review)
View:
* there were some problems with the locking
of the BWindow looper in RemoveSelf(), since
this is called from the window destructor,
also of BWindows from BBitmaps, which have
never been run (this might need review), at
least I seem to have solved the crashing
problems introduced by actually deleting the
view hirarchy in the BWindow destructor
* fixed _Draw() for being used non-recursively,
temporarily disabled DrawAfterChildren, which
didn't work yet anyways (because views cannot
draw over children in the server yet)
Window:
* small cleanup when deleting shortcuts
* sync with the server when having send
AS_DELETE_WINDOW (see ServerWindow above)
* fixed locking in Begin/EndViewTransaction()
* removed folding of _UPDATE_ messages, since
there is only one ever in the queue
* set the fInTransaction flag during an update,
I plan to use this in BView later to
flush the link when drawing outside of an
update
* BView::_Draw() is now called by view token,
this gives the next leap forward in speed,
the overhead because of drawing clean views
was considerable
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15878 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-01-09 01:04:52 +03:00
|
|
|
}
|
|
|
|
}
|
2005-11-23 14:27:09 +03:00
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
// supposed to fall through
|
2005-11-23 14:27:09 +03:00
|
|
|
}
|
2005-11-17 17:58:19 +03:00
|
|
|
case B_MOUSE_DOWN:
|
|
|
|
case B_MOUSE_UP:
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
{
|
2005-11-24 19:04:29 +03:00
|
|
|
#ifdef TRACE_EVENTS
|
|
|
|
if (event->what != B_MOUSE_MOVED)
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
printf("mouse up/down event, previous target = %p\n", fPreviousMouseTarget);
|
2005-11-24 19:04:29 +03:00
|
|
|
#endif
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
pointerEvent = true;
|
|
|
|
|
|
|
|
if (fMouseFilter == NULL)
|
|
|
|
break;
|
|
|
|
|
|
|
|
EventTarget* mouseTarget = fPreviousMouseTarget;
|
|
|
|
int32 viewToken = B_NULL_TOKEN;
|
2006-01-11 15:25:06 +03:00
|
|
|
if (fMouseFilter->Filter(event, &mouseTarget, &viewToken,
|
|
|
|
fNextLatestMouseMoved) == B_SKIP_MESSAGE) {
|
2005-11-21 19:25:23 +03:00
|
|
|
// this is a work-around if the wrong B_MOUSE_UP
|
|
|
|
// event is filtered out
|
|
|
|
if (event->what == B_MOUSE_UP) {
|
|
|
|
fSuspendFocus = false;
|
|
|
|
_RemoveTemporaryListeners();
|
|
|
|
}
|
2005-11-17 17:58:19 +03:00
|
|
|
break;
|
2005-11-21 19:25:23 +03:00
|
|
|
}
|
2005-11-17 17:58:19 +03:00
|
|
|
|
2005-11-23 14:27:09 +03:00
|
|
|
int32 buttons;
|
|
|
|
if (event->FindInt32("buttons", &buttons) == B_OK)
|
|
|
|
fLastButtons = buttons;
|
|
|
|
else
|
|
|
|
fLastButtons = 0;
|
|
|
|
|
|
|
|
// the "where" field will be filled in by the receiver
|
|
|
|
// (it's supposed to be expressed in local window coordinates)
|
|
|
|
event->RemoveName("where");
|
|
|
|
event->AddPoint("screen_where", fLastCursorPosition);
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (event->what == B_MOUSE_MOVED
|
|
|
|
&& fPreviousMouseTarget != NULL
|
|
|
|
&& mouseTarget != fPreviousMouseTarget) {
|
|
|
|
// target has changed, we need to notify the previous target
|
|
|
|
// that the mouse has exited its views
|
|
|
|
addedTokens = _AddTokens(event, fPreviousMouseTarget,
|
|
|
|
B_POINTER_EVENTS);
|
2005-12-30 23:59:14 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
_SendMessage(fPreviousMouseTarget->Messenger(), event,
|
|
|
|
kMouseTransitImportance);
|
|
|
|
previous = fPreviousMouseTarget;
|
|
|
|
}
|
2005-11-17 21:46:55 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
current = fPreviousMouseTarget = mouseTarget;
|
2005-11-25 19:11:19 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (current != NULL) {
|
2006-01-11 15:25:06 +03:00
|
|
|
int32 focusView = viewToken;
|
|
|
|
addedTokens |= _AddTokens(event, current, B_POINTER_EVENTS,
|
|
|
|
fNextLatestMouseMoved, &focusView);
|
|
|
|
|
|
|
|
bool noPointerHistoryFocus = focusView != viewToken;
|
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (viewToken != B_NULL_TOKEN)
|
|
|
|
event->AddInt32("_view_token", viewToken);
|
2006-01-11 15:25:06 +03:00
|
|
|
|
|
|
|
if (addedTokens && !noPointerHistoryFocus)
|
2005-12-30 23:59:14 +03:00
|
|
|
_SetFeedFocus(event);
|
2006-01-11 15:25:06 +03:00
|
|
|
else if (noPointerHistoryFocus) {
|
|
|
|
// no tokens were added or the focus shouldn't get a mouse moved
|
|
|
|
break;
|
|
|
|
}
|
2005-11-25 19:11:19 +03:00
|
|
|
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
_SendMessage(current->Messenger(), event, event->what == B_MOUSE_MOVED
|
2005-11-17 19:08:04 +03:00
|
|
|
? kMouseMovedImportance : kStandardImportance);
|
|
|
|
}
|
2005-11-17 17:58:19 +03:00
|
|
|
break;
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
}
|
2005-11-17 17:58:19 +03:00
|
|
|
|
|
|
|
case B_KEY_DOWN:
|
|
|
|
case B_KEY_UP:
|
|
|
|
case B_UNMAPPED_KEY_DOWN:
|
|
|
|
case B_UNMAPPED_KEY_UP:
|
|
|
|
case B_MODIFIERS_CHANGED:
|
2005-11-24 19:04:29 +03:00
|
|
|
ETRACE(("key event, focus = %p\n", fFocus));
|
|
|
|
|
2005-11-18 16:51:32 +03:00
|
|
|
if (fKeyboardFilter != NULL
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
&& fKeyboardFilter->Filter(event, &fFocus) == B_SKIP_MESSAGE)
|
2005-11-17 17:58:19 +03:00
|
|
|
break;
|
|
|
|
|
2005-11-17 21:46:55 +03:00
|
|
|
keyboardEvent = true;
|
|
|
|
|
2005-12-30 23:59:14 +03:00
|
|
|
if (fFocus != NULL && _AddTokens(event, fFocus, B_KEYBOARD_EVENTS)) {
|
2005-11-21 19:25:23 +03:00
|
|
|
// if tokens were added, we need to explicetly suspend
|
|
|
|
// focus in the event - if not, the event is simply not
|
|
|
|
// forwarded to the target
|
|
|
|
addedTokens = true;
|
|
|
|
|
2005-11-22 15:49:35 +03:00
|
|
|
if (!fSuspendFocus)
|
|
|
|
_SetFeedFocus(event);
|
2005-11-21 19:25:23 +03:00
|
|
|
}
|
|
|
|
|
2005-11-17 21:46:55 +03:00
|
|
|
// supposed to fall through
|
|
|
|
|
2005-11-17 17:58:19 +03:00
|
|
|
default:
|
2005-12-30 23:59:14 +03:00
|
|
|
// TODO: the keyboard filter sets the focus - ie. no other
|
|
|
|
// focus messages that go through the event dispatcher can
|
|
|
|
// go through.
|
|
|
|
if (event->what == B_MOUSE_WHEEL_CHANGED)
|
|
|
|
current = fPreviousMouseTarget;
|
|
|
|
else
|
|
|
|
current = fFocus;
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
|
|
|
|
if (current != NULL && (!fSuspendFocus || addedTokens))
|
|
|
|
_SendMessage(current->Messenger(), event, kStandardImportance);
|
2005-11-17 17:58:19 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-11-17 21:46:55 +03:00
|
|
|
if (keyboardEvent || pointerEvent) {
|
|
|
|
// send the event to the additional listeners
|
|
|
|
|
2005-11-23 14:27:09 +03:00
|
|
|
if (addedTokens) {
|
|
|
|
_RemoveTokens(event);
|
2005-11-22 15:49:35 +03:00
|
|
|
_UnsetFeedFocus(event);
|
|
|
|
}
|
2005-11-23 14:27:09 +03:00
|
|
|
if (pointerEvent) {
|
2005-12-08 15:41:19 +03:00
|
|
|
// this is added in the Desktop mouse processing
|
2005-11-23 14:27:09 +03:00
|
|
|
// but it's only intended for the focus view
|
|
|
|
event->RemoveName("_view_token");
|
|
|
|
}
|
2005-11-17 21:46:55 +03:00
|
|
|
|
2005-11-24 19:04:29 +03:00
|
|
|
for (int32 i = fTargets.CountItems(); i-- > 0;) {
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
EventTarget* target = fTargets.ItemAt(i);
|
2005-11-17 21:46:55 +03:00
|
|
|
|
|
|
|
// we already sent the event to the all focus and last focus tokens
|
Have I said input event handling is done?
* didn't realize that mouse events always go to the view under the mouse, not
only if its the focus window (FFM can really do harm, after all :-)).
* removed a TODO from the list: EventDispatcher::Target is now a public
class EventTarget, and every ServerWindow has one.
* as a result, EventDispatcher no longer manages targets itself, it
just maintains a list of them. You no longer set messengers, you
only set targets.
* customization of the message filters, they no longer inherit from
BMessageFilter (but EventFilter).
* a message target is no longer set explicetly anywhere, it's only
changed in the message filters if needed.
* therefore, no more locking mess in the EventDispatcher needed.
* this also made the EventDispatcher::fLastFocus stuff superfluous.
* moved the RootLayer::MouseEventHandler() into the message filter.
* Replaced RootLayer::_ChildAt() with WindowAt().
* WindowLayer now has an idea if it has focus or not, it no longer needs
to query the RootLayer for this - maybe we should rename "focus" to
"active", though (as far as layers are concerned).
* the "_view_token" data is now added from the EventDispatcher, not
the (Window)Layer class anymore.
* removed Layer::MouseWheelChanged() as we currently don't need it
(if the need arises, we can add it back later again)
* there is still no mouse moved message sent when opening a window
under the cursor, though...
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-29 19:01:41 +03:00
|
|
|
if (current == target || previous == target)
|
2005-11-17 21:46:55 +03:00
|
|
|
continue;
|
|
|
|
|
2005-11-24 19:04:29 +03:00
|
|
|
// don't send the message if there are no tokens for this event
|
|
|
|
if (!_AddTokens(event, target,
|
2006-01-11 15:25:06 +03:00
|
|
|
keyboardEvent ? B_KEYBOARD_EVENTS : B_POINTER_EVENTS,
|
|
|
|
event->what == B_MOUSE_MOVED ? fNextLatestMouseMoved : NULL))
|
2005-11-17 21:46:55 +03:00
|
|
|
continue;
|
|
|
|
|
2005-11-24 19:04:29 +03:00
|
|
|
if (!_SendMessage(target->Messenger(), event, event->what == B_MOUSE_MOVED
|
2005-11-17 21:46:55 +03:00
|
|
|
? kMouseMovedImportance : kListenerImportance)) {
|
2005-11-24 19:04:29 +03:00
|
|
|
// the target doesn't seem to exist anymore, let's remove it
|
|
|
|
fTargets.RemoveItemAt(i);
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (event->what == B_MOUSE_UP) {
|
|
|
|
fSuspendFocus = false;
|
|
|
|
_RemoveTemporaryListeners();
|
2005-12-08 15:41:19 +03:00
|
|
|
if (fDraggingMessage)
|
|
|
|
_DeliverDragMessage();
|
2005-11-17 21:46:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-11 15:25:06 +03:00
|
|
|
if (fNextLatestMouseMoved == event)
|
|
|
|
fNextLatestMouseMoved = NULL;
|
2005-11-17 17:58:19 +03:00
|
|
|
delete event;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
EventDispatcher::_CursorLoop()
|
|
|
|
{
|
|
|
|
BPoint where;
|
|
|
|
while (fStream->GetNextCursorPosition(where)) {
|
|
|
|
BAutolock _(fCursorLock);
|
|
|
|
|
|
|
|
if (fHWInterface != NULL)
|
|
|
|
fHWInterface->MoveCursorTo(where.x, where.y);
|
|
|
|
}
|
|
|
|
|
|
|
|
fCursorThread = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*static*/
|
|
|
|
status_t
|
|
|
|
EventDispatcher::_event_looper(void* _dispatcher)
|
|
|
|
{
|
|
|
|
EventDispatcher* dispatcher = (EventDispatcher*)_dispatcher;
|
|
|
|
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
ETRACE(("Start event loop\n"));
|
2005-11-17 17:58:19 +03:00
|
|
|
dispatcher->_EventLoop();
|
|
|
|
return B_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*static*/
|
|
|
|
status_t
|
|
|
|
EventDispatcher::_cursor_looper(void* _dispatcher)
|
|
|
|
{
|
|
|
|
EventDispatcher* dispatcher = (EventDispatcher*)_dispatcher;
|
|
|
|
|
* the new input event dispatcher is now actually used, although it doesn't
distribute any messages to the clients yet.
* removed the working thread from RootLayer - for now, its event handlers are
still called using input filters in the new event dispatcher, though (to
get things started).
* ServerApp is now using a BMessenger to identify its client, and no longer
stores the port/token separately.
* the input_server handshake is a bit simpler now, as it can now just reply
to the app_server message, removed unused code from ServerProtocol.h
* calmed down the MultiLocker (it always printed thread statistics on startup,
because it's compiled in debug mode).
* removed the cursor thread stuff from AppServer.cpp
* the new event dispatcher now uses a cursor thread when supported (only in
native mode, not in the test environment), although it improves cursor
movement under Qemu, the effect is not as good as expected - this might
need some more investigations (might just be a thread priority problem).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15012 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-18 14:30:06 +03:00
|
|
|
ETRACE(("Start cursor loop\n"));
|
2005-11-17 17:58:19 +03:00
|
|
|
dispatcher->_CursorLoop();
|
|
|
|
return B_OK;
|
|
|
|
}
|