aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-02-26 07:24:12 +0000
committerPo Lu2022-02-26 07:24:12 +0000
commite1757c00caa342e698216fba0098dc9f42fc4777 (patch)
treefb1d0aada3735f6a30eec84f14f1aa5700dfda06 /src
parent3e9c36e7999356d5d14bd587ce74083c5a2c6512 (diff)
downloademacs-e1757c00caa342e698216fba0098dc9f42fc4777.tar.gz
emacs-e1757c00caa342e698216fba0098dc9f42fc4777.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/haiku_support.cc22
-rw-r--r--src/haiku_support.h3
-rw-r--r--src/haikuterm.c40
3 files changed, 53 insertions, 12 deletions
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:
1557class EmacsScrollBar : public BScrollBar 1557class EmacsScrollBar : public BScrollBar
1558{ 1558{
1559public: 1559public:
1560 void *scroll_bar;
1561 int dragging = 0; 1560 int dragging = 0;
1562 bool horizontal; 1561 bool horizontal;
1563 enum haiku_scroll_bar_part current_part; 1562 enum haiku_scroll_bar_part current_part;
@@ -1599,7 +1598,8 @@ public:
1599 { 1598 {
1600 SetValue (old_value); 1599 SetValue (old_value);
1601 1600
1602 part.scroll_bar = scroll_bar; 1601 part.scroll_bar = this;
1602 part.window = Window ();
1603 part.part = current_part; 1603 part.part = current_part;
1604 haiku_write (SCROLL_BAR_PART_EVENT, &part); 1604 haiku_write (SCROLL_BAR_PART_EVENT, &part);
1605 } 1605 }
@@ -1610,7 +1610,8 @@ public:
1610 return; 1610 return;
1611 } 1611 }
1612 1612
1613 rq.scroll_bar = scroll_bar; 1613 rq.scroll_bar = this;
1614 rq.window = Window ();
1614 rq.position = new_value; 1615 rq.position = new_value;
1615 1616
1616 haiku_write (SCROLL_BAR_VALUE_EVENT, &rq); 1617 haiku_write (SCROLL_BAR_VALUE_EVENT, &rq);
@@ -1688,7 +1689,8 @@ public:
1688 1689
1689 if (r.Contains (pt)) 1690 if (r.Contains (pt))
1690 { 1691 {
1691 part.scroll_bar = scroll_bar; 1692 part.scroll_bar = this;
1693 part.window = Window ();
1692 part.part = HAIKU_SCROLL_BAR_UP_BUTTON; 1694 part.part = HAIKU_SCROLL_BAR_UP_BUTTON;
1693 dragging = 1; 1695 dragging = 1;
1694 current_part = HAIKU_SCROLL_BAR_UP_BUTTON; 1696 current_part = HAIKU_SCROLL_BAR_UP_BUTTON;
@@ -1701,7 +1703,8 @@ public:
1701 1703
1702 if (r.Contains (pt)) 1704 if (r.Contains (pt))
1703 { 1705 {
1704 part.scroll_bar = scroll_bar; 1706 part.scroll_bar = this;
1707 part.window = Window ();
1705 part.part = HAIKU_SCROLL_BAR_DOWN_BUTTON; 1708 part.part = HAIKU_SCROLL_BAR_DOWN_BUTTON;
1706 dragging = 1; 1709 dragging = 1;
1707 current_part = HAIKU_SCROLL_BAR_DOWN_BUTTON; 1710 current_part = HAIKU_SCROLL_BAR_DOWN_BUTTON;
@@ -1711,7 +1714,8 @@ public:
1711 } 1714 }
1712 1715
1713 rq.dragging_p = 1; 1716 rq.dragging_p = 1;
1714 rq.scroll_bar = scroll_bar; 1717 rq.window = Window ();
1718 rq.scroll_bar = this;
1715 1719
1716 haiku_write (SCROLL_BAR_DRAG_EVENT, &rq); 1720 haiku_write (SCROLL_BAR_DRAG_EVENT, &rq);
1717 1721
@@ -1724,7 +1728,8 @@ public:
1724 { 1728 {
1725 struct haiku_scroll_bar_drag_event rq; 1729 struct haiku_scroll_bar_drag_event rq;
1726 rq.dragging_p = 0; 1730 rq.dragging_p = 0;
1727 rq.scroll_bar = scroll_bar; 1731 rq.scroll_bar = this;
1732 rq.window = Window ();
1728 1733
1729 haiku_write (SCROLL_BAR_DRAG_EVENT, &rq); 1734 haiku_write (SCROLL_BAR_DRAG_EVENT, &rq);
1730 dragging = false; 1735 dragging = false;
@@ -2199,10 +2204,9 @@ BScrollBar_make_for_view (void *view, int horizontal_p,
2199 void *scroll_bar_ptr) 2204 void *scroll_bar_ptr)
2200{ 2205{
2201 EmacsScrollBar *sb = new EmacsScrollBar (x, y, x1, y1, horizontal_p); 2206 EmacsScrollBar *sb = new EmacsScrollBar (x, y, x1, y1, horizontal_p);
2202 sb->scroll_bar = scroll_bar_ptr;
2203
2204 BView *vw = (BView *) view; 2207 BView *vw = (BView *) view;
2205 BView *sv = (BView *) sb; 2208 BView *sv = (BView *) sb;
2209
2206 if (!vw->LockLooper ()) 2210 if (!vw->LockLooper ())
2207 gui_abort ("Failed to lock scrollbar owner"); 2211 gui_abort ("Failed to lock scrollbar owner");
2208 vw->AddChild ((BView *) sb); 2212 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
296struct haiku_scroll_bar_value_event 296struct haiku_scroll_bar_value_event
297{ 297{
298 void *scroll_bar; 298 void *scroll_bar;
299 void *window;
299 int position; 300 int position;
300}; 301};
301 302
302struct haiku_scroll_bar_drag_event 303struct haiku_scroll_bar_drag_event
303{ 304{
304 void *scroll_bar; 305 void *scroll_bar;
306 void *window;
305 int dragging_p; 307 int dragging_p;
306}; 308};
307 309
@@ -314,6 +316,7 @@ enum haiku_scroll_bar_part
314struct haiku_scroll_bar_part_event 316struct haiku_scroll_bar_part_event
315{ 317{
316 void *scroll_bar; 318 void *scroll_bar;
319 void *window;
317 enum haiku_scroll_bar_part part; 320 enum haiku_scroll_bar_part part;
318}; 321};
319 322
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)
416 } 416 }
417} 417}
418 418
419static struct scroll_bar *
420haiku_scroll_bar_from_widget (void *scroll_bar, void *window)
421{
422 Lisp_Object tem;
423 struct frame *frame = haiku_window_to_frame (window);
424
425 if (!frame)
426 return NULL;
427
428 if (!NILP (FRAME_SCROLL_BARS (frame)))
429 {
430 for (tem = FRAME_SCROLL_BARS (frame); !NILP (tem);
431 tem = XSCROLL_BAR (tem)->next)
432 {
433 if (XSCROLL_BAR (tem)->scroll_bar == scroll_bar)
434 return XSCROLL_BAR (tem);
435 }
436 }
437
438 return NULL;
439}
440
419/* Unfortunately, NOACTIVATE is not implementable on Haiku. */ 441/* Unfortunately, NOACTIVATE is not implementable on Haiku. */
420static void 442static void
421haiku_focus_frame (struct frame *frame, bool noactivate) 443haiku_focus_frame (struct frame *frame, bool noactivate)
@@ -3127,7 +3149,11 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
3127 case SCROLL_BAR_VALUE_EVENT: 3149 case SCROLL_BAR_VALUE_EVENT:
3128 { 3150 {
3129 struct haiku_scroll_bar_value_event *b = buf; 3151 struct haiku_scroll_bar_value_event *b = buf;
3130 struct scroll_bar *bar = b->scroll_bar; 3152 struct scroll_bar *bar
3153 = haiku_scroll_bar_from_widget (b->scroll_bar, b->window);
3154
3155 if (!bar)
3156 continue;
3131 3157
3132 struct window *w = XWINDOW (bar->window); 3158 struct window *w = XWINDOW (bar->window);
3133 3159
@@ -3153,7 +3179,11 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
3153 case SCROLL_BAR_PART_EVENT: 3179 case SCROLL_BAR_PART_EVENT:
3154 { 3180 {
3155 struct haiku_scroll_bar_part_event *b = buf; 3181 struct haiku_scroll_bar_part_event *b = buf;
3156 struct scroll_bar *bar = b->scroll_bar; 3182 struct scroll_bar *bar
3183 = haiku_scroll_bar_from_widget (b->scroll_bar, b->window);
3184
3185 if (!bar)
3186 continue;
3157 3187
3158 inev.kind = (bar->horizontal ? HORIZONTAL_SCROLL_BAR_CLICK_EVENT 3188 inev.kind = (bar->horizontal ? HORIZONTAL_SCROLL_BAR_CLICK_EVENT
3159 : SCROLL_BAR_CLICK_EVENT); 3189 : SCROLL_BAR_CLICK_EVENT);
@@ -3183,7 +3213,11 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
3183 case SCROLL_BAR_DRAG_EVENT: 3213 case SCROLL_BAR_DRAG_EVENT:
3184 { 3214 {
3185 struct haiku_scroll_bar_drag_event *b = buf; 3215 struct haiku_scroll_bar_drag_event *b = buf;
3186 struct scroll_bar *bar = b->scroll_bar; 3216 struct scroll_bar *bar
3217 = haiku_scroll_bar_from_widget (b->scroll_bar, b->window);
3218
3219 if (!bar)
3220 continue;
3187 3221
3188 bar->dragging = b->dragging_p; 3222 bar->dragging = b->dragging_p;
3189 if (!b->dragging_p && bar->horizontal) 3223 if (!b->dragging_p && bar->horizontal)