From: Po Lu Date: Sat, 26 Feb 2022 07:24:12 +0000 (+0000) Subject: Prevent crashes on event for removed scroll bar on Haiku X-Git-Tag: emacs-29.0.90~2101 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e1757c00caa342e698216fba0098dc9f42fc4777;p=emacs.git 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. --- diff --git a/src/haiku_support.cc b/src/haiku_support.cc index ab33e38dc70..fe91986e8c4 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 714cb18ae79..9d13cae47c2 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 357ec8239c5..7779b3168b7 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)