]> git.eshelyaron.com Git - emacs.git/commitdiff
Prevent crashes on event for removed scroll bar on Haiku
authorPo Lu <luangruo@yahoo.com>
Sat, 26 Feb 2022 07:24:12 +0000 (07:24 +0000)
committerPo Lu <luangruo@yahoo.com>
Sat, 26 Feb 2022 07:24:12 +0000 (07:24 +0000)
* 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
src/haiku_support.h
src/haikuterm.c

index ab33e38dc7079490a0f9d3fc3d21fadcb7992d8d..fe91986e8c46162df1945c816ea4844ffbbe0f5c 100644 (file)
@@ -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);
index 714cb18ae792696fb28b4f87201d3e2b65fd46cf..9d13cae47c29a87606cebe2df799883d0084a6aa 100644 (file)
@@ -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;
 };
 
index 357ec8239c5d922405f9ba7e186b0811885c3ef8..7779b3168b79bdbb29a3b0de0b6073403f6cab0c 100644 (file)
@@ -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)