[haiku-commits] Change in haiku[master]: Revert "BWindow: Do not invoke BView handlers directly"

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 30 May 2020 12:08:27 +0000

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

Other related posts:

  • » [haiku-commits] Change in haiku[master]: Revert "BWindow: Do not invoke BView handlers directly" - Gerrit