From Adrien Destugues <pulkomandy@xxxxxxxxx>:
Adrien Destugues has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2851 ;)
Change subject: Revert "BWindow: Do not invoke BView handlers directly"
......................................................................
Revert "BWindow: Do not invoke BView handlers directly"
This reverts commit 75e57397725ad811f905684682387a85053afb05.
This change does things differently from BeOS and breaks at least two
applications: Sawteeth and Q.
---
M src/kits/interface/View.cpp
M src/kits/interface/Window.cpp
2 files changed, 150 insertions(+), 123 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/51/2851/1
diff --git a/src/kits/interface/View.cpp b/src/kits/interface/View.cpp
index 7671604..804f81d 100644
--- a/src/kits/interface/View.cpp
+++ b/src/kits/interface/View.cpp
@@ -4938,40 +4938,6 @@
{
if (!message->HasSpecifiers()) {
switch (message->what) {
- case B_INVALIDATE:
- {
- BRect rect;
- if (message->FindRect("be:area", &rect) == B_OK)
- Invalidate(rect);
- else
- Invalidate();
- break;
- }
-
- case B_KEY_DOWN:
- {
- // TODO: cannot use "string" here if we support
having different
- // font encoding per view (it's supposed to be
converted by
- // BWindow::_HandleKeyDown() one day)
- const char* string;
- ssize_t bytes;
- if (message->FindData("bytes", B_STRING_TYPE,
- (const void**)&string, &bytes)
== B_OK)
- KeyDown(string, bytes - 1);
- break;
- }
-
- case B_KEY_UP:
- {
- // TODO: same as above
- const char* string;
- ssize_t bytes;
- if (message->FindData("bytes", B_STRING_TYPE,
- (const void**)&string, &bytes)
== B_OK)
- KeyUp(string, bytes - 1);
- break;
- }
-
case B_VIEW_RESIZED:
FrameResized(message->GetInt32("width", 0),
message->GetInt32("height", 0));
@@ -4981,14 +4947,6 @@
FrameMoved(fParentOffset);
break;
- case B_MOUSE_DOWN:
- {
- BPoint where;
- message->FindPoint("be:view_where", &where);
- MouseDown(where);
- break;
- }
-
case B_MOUSE_IDLE:
{
BPoint where;
@@ -5003,85 +4961,6 @@
break;
}
- case B_MOUSE_MOVED:
- {
- uint32 eventOptions = fEventOptions |
fMouseEventOptions;
- bool noHistory = eventOptions &
B_NO_POINTER_HISTORY;
- bool dropIfLate = !(eventOptions &
B_FULL_POINTER_HISTORY);
-
- bigtime_t eventTime;
- if (message->FindInt64("when",
(int64*)&eventTime) < B_OK)
- eventTime = system_time();
-
- uint32 transit;
- message->FindInt32("be:transit",
(int32*)&transit);
- // don't drop late messages with these
important transit values
- if (transit == B_ENTERED_VIEW || transit ==
B_EXITED_VIEW)
- dropIfLate = false;
-
- // TODO: The dropping code may have the
following problem: On
- // slower computers, 20ms may just be to
abitious a delay.
- // There, we might constantly check the message
queue for a
- // newer message, not find any, and still use
the only but later
- // than 20ms message, which of course makes the
whole thing
- // later than need be. An adaptive delay would
be kind of neat,
- // but would probably use additional BWindow
members to count
- // the successful versus fruitless queue
searches and the delay
- // value itself or something similar.
- if (noHistory
- || (dropIfLate && (system_time() -
eventTime > 20000))) {
- // filter out older mouse moved
messages in the queue
- BWindow* window = Window();
- window->_DequeueAll();
- BMessageQueue* queue =
window->MessageQueue();
- queue->Lock();
-
- BMessage* moved;
- for (int32 i = 0; (moved =
queue->FindMessage(i)) != NULL;
- i++) {
- if (moved != message &&
moved->what == B_MOUSE_MOVED) {
- // there is a newer
mouse moved message in the
- // queue, just ignore
the current one, the newer one
- // will be handled here
eventually
- queue->Unlock();
- return;
- }
- }
- queue->Unlock();
- }
-
- BPoint where;
- uint32 buttons;
- message->FindPoint("be:view_where", &where);
- message->FindInt32("buttons", (int32*)&buttons);
-
- if (transit == B_EXITED_VIEW || transit ==
B_OUTSIDE_VIEW)
- HideToolTip();
-
- BMessage* dragMessage = NULL;
- if (message->HasMessage("be:drag_message")) {
- dragMessage = new BMessage();
- if
(message->FindMessage("be:drag_message", dragMessage)
- != B_OK) {
- delete dragMessage;
- dragMessage = NULL;
- }
- }
-
- MouseMoved(where, transit, dragMessage);
- delete dragMessage;
- break;
- }
-
- case B_MOUSE_UP:
- {
- BPoint where;
- message->FindPoint("be:view_where", &where);
- fMouseEventOptions = 0;
- MouseUp(where);
- break;
- }
-
case B_MOUSE_WHEEL_CHANGED:
{
BScrollBar* horizontal =
ScrollBar(B_HORIZONTAL);
diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp
index 4af569f..969712d 100644
--- a/src/kits/interface/Window.cpp
+++ b/src/kits/interface/Window.cpp
@@ -1148,15 +1148,163 @@
target->MessageReceived(message);
break;
- case B_KEY_DOWN:
- if (!_HandleKeyDown(message))
+ case B_INVALIDATE:
+ {
+ if (BView* view = dynamic_cast<BView*>(target)) {
+ BRect rect;
+ if (message->FindRect("be:area", &rect) == B_OK)
+ view->Invalidate(rect);
+ else
+ view->Invalidate();
+ } else
target->MessageReceived(message);
break;
+ }
+
+ case B_KEY_DOWN:
+ {
+ if (!_HandleKeyDown(message)) {
+ if (BView* view = dynamic_cast<BView*>(target))
{
+ // TODO: cannot use "string" here if we
support having
+ // different font encoding per view
(it's supposed to be
+ // converted by _HandleKeyDown() one
day)
+ const char* string;
+ ssize_t bytes;
+ if (message->FindData("bytes",
B_STRING_TYPE,
+ (const void**)&string, &bytes)
== B_OK) {
+ view->KeyDown(string, bytes -
1);
+ }
+ } else
+ target->MessageReceived(message);
+ }
+ break;
+ }
+
+ case B_KEY_UP:
+ {
+ // TODO: same as above
+ if (BView* view = dynamic_cast<BView*>(target)) {
+ const char* string;
+ ssize_t bytes;
+ if (message->FindData("bytes", B_STRING_TYPE,
+ (const void**)&string, &bytes) == B_OK)
{
+ view->KeyUp(string, bytes - 1);
+ }
+ } else
+ target->MessageReceived(message);
+ break;
+ }
case B_UNMAPPED_KEY_DOWN:
+ {
if (!_HandleUnmappedKeyDown(message))
target->MessageReceived(message);
break;
+ }
+
+ case B_MOUSE_DOWN:
+ {
+ BView* view = dynamic_cast<BView*>(target);
+
+ if (view != NULL) {
+ BPoint where;
+ message->FindPoint("be:view_where", &where);
+ view->MouseDown(where);
+ } else
+ target->MessageReceived(message);
+
+ break;
+ }
+
+ case B_MOUSE_UP:
+ {
+ if (BView* view = dynamic_cast<BView*>(target)) {
+ BPoint where;
+ message->FindPoint("be:view_where", &where);
+ view->fMouseEventOptions = 0;
+ view->MouseUp(where);
+ } else
+ target->MessageReceived(message);
+
+ break;
+ }
+
+ case B_MOUSE_MOVED:
+ {
+ if (BView* view = dynamic_cast<BView*>(target)) {
+ uint32 eventOptions = view->fEventOptions
+ | view->fMouseEventOptions;
+ bool noHistory = eventOptions &
B_NO_POINTER_HISTORY;
+ bool dropIfLate = !(eventOptions &
B_FULL_POINTER_HISTORY);
+
+ bigtime_t eventTime;
+ if (message->FindInt64("when",
(int64*)&eventTime) < B_OK)
+ eventTime = system_time();
+
+ uint32 transit;
+ message->FindInt32("be:transit",
(int32*)&transit);
+ // don't drop late messages with these
important transit values
+ if (transit == B_ENTERED_VIEW || transit ==
B_EXITED_VIEW)
+ dropIfLate = false;
+
+ // TODO: The dropping code may have the
following problem:
+ // On slower computers, 20ms may just be to
abitious a delay.
+ // There, we might constantly check the message
queue for a
+ // newer message, not find any, and still use
the only but
+ // later than 20ms message, which of course
makes the whole
+ // thing later than need be. An adaptive delay
would be
+ // kind of neat, but would probably use
additional BWindow
+ // members to count the successful versus
fruitless queue
+ // searches and the delay value itself or
something similar.
+
+ if (noHistory
+ || (dropIfLate && (system_time() -
eventTime > 20000))) {
+ // filter out older mouse moved
messages in the queue
+ _DequeueAll();
+ BMessageQueue* queue = MessageQueue();
+ queue->Lock();
+
+ BMessage* moved;
+ for (int32 i = 0; (moved =
queue->FindMessage(i)) != NULL;
+ i++) {
+ if (moved != message &&
moved->what == B_MOUSE_MOVED) {
+ // there is a newer
mouse moved message in the
+ // queue, just ignore
the current one, the newer one
+ // will be handled here
eventually
+ queue->Unlock();
+ return;
+ }
+ }
+ queue->Unlock();
+ }
+
+ BPoint where;
+ uint32 buttons;
+ message->FindPoint("be:view_where", &where);
+ message->FindInt32("buttons", (int32*)&buttons);
+
+ if (transit == B_EXITED_VIEW || transit ==
B_OUTSIDE_VIEW) {
+ if
(dynamic_cast<BPrivate::ToolTipWindow*>(this) == NULL)
+
BToolTipManager::Manager()->HideTip();
+ }
+
+ BMessage* dragMessage = NULL;
+ if (message->HasMessage("be:drag_message")) {
+ dragMessage = new BMessage();
+ if
(message->FindMessage("be:drag_message", dragMessage)
+ != B_OK) {
+ delete dragMessage;
+ dragMessage = NULL;
+ }
+ }
+
+ view->MouseMoved(where, transit, dragMessage);
+ delete dragMessage;
+ } else
+ target->MessageReceived(message);
+
+ break;
+ }
case B_PULSE:
if (target == this && fPulseRunner) {
--
To view, visit https://review.haiku-os.org/c/haiku/+/2851
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I3f10fa209d13f4e905ef6fc16175db2547708992
Gerrit-Change-Number: 2851
Gerrit-PatchSet: 1
Gerrit-Owner: Adrien Destugues <pulkomandy@xxxxxxxxx>
Gerrit-MessageType: newchange