diff options
| author | Po Lu | 2022-02-26 07:24:12 +0000 |
|---|---|---|
| committer | Po Lu | 2022-02-26 07:24:12 +0000 |
| commit | e1757c00caa342e698216fba0098dc9f42fc4777 (patch) | |
| tree | fb1d0aada3735f6a30eec84f14f1aa5700dfda06 /src | |
| parent | 3e9c36e7999356d5d14bd587ce74083c5a2c6512 (diff) | |
| download | emacs-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.cc | 22 | ||||
| -rw-r--r-- | src/haiku_support.h | 3 | ||||
| -rw-r--r-- | src/haikuterm.c | 40 |
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: | |||
| 1557 | class EmacsScrollBar : public BScrollBar | 1557 | class EmacsScrollBar : public BScrollBar |
| 1558 | { | 1558 | { |
| 1559 | public: | 1559 | public: |
| 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 | |||
| 296 | struct haiku_scroll_bar_value_event | 296 | struct 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 | ||
| 302 | struct haiku_scroll_bar_drag_event | 303 | struct 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 | |||
| 314 | struct haiku_scroll_bar_part_event | 316 | struct 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 | ||
| 419 | static struct scroll_bar * | ||
| 420 | haiku_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. */ |
| 420 | static void | 442 | static void |
| 421 | haiku_focus_frame (struct frame *frame, bool noactivate) | 443 | haiku_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) |