emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master e1757c00ca: Prevent crashes on event for removed scroll bar on Ha


From: Po Lu
Subject: master e1757c00ca: Prevent crashes on event for removed scroll bar on Haiku
Date: Sat, 26 Feb 2022 02:24:54 -0500 (EST)

branch: master
commit e1757c00caa342e698216fba0098dc9f42fc4777
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Prevent crashes on event for removed scroll bar on Haiku
    
    * src/haiku_support.cc (class EmacsScrollBar): Remove field
    `scroll_bar'.
    (ValueChanged, MouseDown, MouseUp, BScrollBar_make_for_view):
    Adjust for changes.
    
    * src/haiku_support.h (struct haiku_scroll_bar_value_event)
    (struct haiku_scroll_bar_drag_event)
    (struct haiku_scroll_bar_part_event): New field `window'.
    
    * src/haikuterm.c (haiku_scroll_bar_from_widget): New function.
    (haiku_read_socket): Adjust for changes in scroll bar event
    structures.
---
 src/haiku_support.cc | 22 +++++++++++++---------
 src/haiku_support.h  |  3 +++
 src/haikuterm.c      | 40 +++++++++++++++++++++++++++++++++++++---
 3 files changed, 53 insertions(+), 12 deletions(-)

diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index ab33e38dc7..fe91986e8c 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -1557,7 +1557,6 @@ public:
 class EmacsScrollBar : public BScrollBar
 {
 public:
-  void *scroll_bar;
   int dragging = 0;
   bool horizontal;
   enum haiku_scroll_bar_part current_part;
@@ -1599,7 +1598,8 @@ public:
              {
                SetValue (old_value);
 
-               part.scroll_bar = scroll_bar;
+               part.scroll_bar = this;
+               part.window = Window ();
                part.part = current_part;
                haiku_write (SCROLL_BAR_PART_EVENT, &part);
              }
@@ -1610,7 +1610,8 @@ public:
        return;
       }
 
-    rq.scroll_bar = scroll_bar;
+    rq.scroll_bar = this;
+    rq.window = Window ();
     rq.position = new_value;
 
     haiku_write (SCROLL_BAR_VALUE_EVENT, &rq);
@@ -1688,7 +1689,8 @@ public:
 
     if (r.Contains (pt))
       {
-       part.scroll_bar = scroll_bar;
+       part.scroll_bar = this;
+       part.window = Window ();
        part.part = HAIKU_SCROLL_BAR_UP_BUTTON;
        dragging = 1;
        current_part = HAIKU_SCROLL_BAR_UP_BUTTON;
@@ -1701,7 +1703,8 @@ public:
 
     if (r.Contains (pt))
       {
-       part.scroll_bar = scroll_bar;
+       part.scroll_bar = this;
+       part.window = Window ();
        part.part = HAIKU_SCROLL_BAR_DOWN_BUTTON;
        dragging = 1;
        current_part = HAIKU_SCROLL_BAR_DOWN_BUTTON;
@@ -1711,7 +1714,8 @@ public:
       }
 
     rq.dragging_p = 1;
-    rq.scroll_bar = scroll_bar;
+    rq.window = Window ();
+    rq.scroll_bar = this;
 
     haiku_write (SCROLL_BAR_DRAG_EVENT, &rq);
 
@@ -1724,7 +1728,8 @@ public:
   {
     struct haiku_scroll_bar_drag_event rq;
     rq.dragging_p = 0;
-    rq.scroll_bar = scroll_bar;
+    rq.scroll_bar = this;
+    rq.window = Window ();
 
     haiku_write (SCROLL_BAR_DRAG_EVENT, &rq);
     dragging = false;
@@ -2199,10 +2204,9 @@ BScrollBar_make_for_view (void *view, int horizontal_p,
                          void *scroll_bar_ptr)
 {
   EmacsScrollBar *sb = new EmacsScrollBar (x, y, x1, y1, horizontal_p);
-  sb->scroll_bar = scroll_bar_ptr;
-
   BView *vw = (BView *) view;
   BView *sv = (BView *) sb;
+
   if (!vw->LockLooper ())
     gui_abort ("Failed to lock scrollbar owner");
   vw->AddChild ((BView *) sb);
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 714cb18ae7..9d13cae47c 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -296,12 +296,14 @@ struct haiku_font_pattern
 struct haiku_scroll_bar_value_event
 {
   void *scroll_bar;
+  void *window;
   int position;
 };
 
 struct haiku_scroll_bar_drag_event
 {
   void *scroll_bar;
+  void *window;
   int dragging_p;
 };
 
@@ -314,6 +316,7 @@ enum haiku_scroll_bar_part
 struct haiku_scroll_bar_part_event
 {
   void *scroll_bar;
+  void *window;
   enum haiku_scroll_bar_part part;
 };
 
diff --git a/src/haikuterm.c b/src/haikuterm.c
index 357ec8239c..7779b3168b 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -416,6 +416,28 @@ haiku_mouse_or_wdesc_frame (void *window)
     }
 }
 
+static struct scroll_bar *
+haiku_scroll_bar_from_widget (void *scroll_bar, void *window)
+{
+  Lisp_Object tem;
+  struct frame *frame = haiku_window_to_frame (window);
+
+  if (!frame)
+    return NULL;
+
+  if (!NILP (FRAME_SCROLL_BARS (frame)))
+    {
+      for (tem = FRAME_SCROLL_BARS (frame); !NILP (tem);
+          tem = XSCROLL_BAR (tem)->next)
+       {
+         if (XSCROLL_BAR (tem)->scroll_bar == scroll_bar)
+           return XSCROLL_BAR (tem);
+       }
+    }
+
+  return NULL;
+}
+
 /* Unfortunately, NOACTIVATE is not implementable on Haiku.  */
 static void
 haiku_focus_frame (struct frame *frame, bool noactivate)
@@ -3127,7 +3149,11 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
        case SCROLL_BAR_VALUE_EVENT:
          {
            struct haiku_scroll_bar_value_event *b = buf;
-           struct scroll_bar *bar = b->scroll_bar;
+           struct scroll_bar *bar
+             = haiku_scroll_bar_from_widget (b->scroll_bar, b->window);
+
+           if (!bar)
+             continue;
 
            struct window *w = XWINDOW (bar->window);
 
@@ -3153,7 +3179,11 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
        case SCROLL_BAR_PART_EVENT:
          {
            struct haiku_scroll_bar_part_event *b = buf;
-           struct scroll_bar *bar = b->scroll_bar;
+           struct scroll_bar *bar
+             = haiku_scroll_bar_from_widget (b->scroll_bar, b->window);
+
+           if (!bar)
+             continue;
 
            inev.kind = (bar->horizontal ? HORIZONTAL_SCROLL_BAR_CLICK_EVENT
                         : SCROLL_BAR_CLICK_EVENT);
@@ -3183,7 +3213,11 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
        case SCROLL_BAR_DRAG_EVENT:
          {
            struct haiku_scroll_bar_drag_event *b = buf;
-           struct scroll_bar *bar = b->scroll_bar;
+           struct scroll_bar *bar
+             = haiku_scroll_bar_from_widget (b->scroll_bar, b->window);
+
+           if (!bar)
+             continue;
 
            bar->dragging = b->dragging_p;
            if (!b->dragging_p && bar->horizontal)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]