[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master e1757c00ca: Prevent crashes on event for removed scroll bar on Haiku,
Po Lu <=