Mageia Bugzilla – Attachment 6929 Details for
Bug 16093
X segfaulting on Dell X13 9343 machine after hybernation (BUG: synaptics.c:3020 in UpdateTouchState())
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
New Account
|
Forgot Password
[patch]
patch to fix the problem - taken from fdo#88903 and just rediffed to apply
synaptics-fdo88903.patch (text/plain), 6.32 KB, created by
Christian Lohmaier
on 2015-08-14 14:03:14 CEST
(
hide
)
Description:
patch to fix the problem - taken from fdo#88903 and just rediffed to apply
Filename:
MIME Type:
Creator:
Christian Lohmaier
Created:
2015-08-14 14:03:14 CEST
Size:
6.32 KB
patch
obsolete
>diff -ru xf86-input-synaptics-1.8.1/src/eventcomm.c xf86-input-synaptics-1.8.1_patched/src/eventcomm.c >--- xf86-input-synaptics-1.8.1/src/eventcomm.c 2014-09-17 23:39:51.000000000 +0200 >+++ xf86-input-synaptics-1.8.1_patched/src/eventcomm.c 2015-08-13 13:57:20.455077398 +0200 >@@ -80,6 +80,13 @@ > * exists for readability of the code. > */ > BOOL need_grab; >+ >+ /* >+ * Does the last_ev member of this struct contain a valid event for >+ * processing? >+ */ >+ BOOL process_ev; >+ > int st_to_mt_offset[2]; > double st_to_mt_scale[2]; > int axis_map[ABS_MT_CNT]; >@@ -91,6 +98,7 @@ > enum libevdev_read_flag read_flag; > > int have_monotonic_clock; >+ struct input_event last_ev; > }; > > static void >@@ -576,7 +584,7 @@ > return FALSE; > } > >-static void >+static Bool > EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw, > struct input_event *ev) > { >@@ -584,7 +592,7 @@ > struct eventcomm_proto_data *proto_data = priv->proto_data; > > if (!priv->has_touch) >- return; >+ return TRUE; > > if (ev->code == ABS_MT_SLOT) { > proto_data->cur_slot = ev->value; >@@ -593,11 +601,16 @@ > int slot_index = proto_data->cur_slot; > > if (slot_index < 0) >- return; >+ return TRUE; > >- if (hw->slot_state[slot_index] == SLOTSTATE_OPEN_EMPTY) >- hw->slot_state[slot_index] = SLOTSTATE_UPDATE; > if (ev->code == ABS_MT_TRACKING_ID) { >+ if(hw->slot_state[slot_index] != SLOTSTATE_EMPTY && hw->slot_state[slot_index] != SLOTSTATE_OPEN_EMPTY) >+ { >+ // Happens when libevdev sends more than one open/close events in one SYN_REPORT packet. >+ // Must inject a SYN_REPORT for synaptics.c state machine >+ return FALSE; >+ } >+ > if (ev->value >= 0) { > hw->slot_state[slot_index] = SLOTSTATE_OPEN; > proto_data->num_touches++; >@@ -614,6 +627,9 @@ > int map = proto_data->axis_map[ev->code - ABS_MT_TOUCH_MAJOR]; > int last_val = valuator_mask_get(mask, map); > >+ if (hw->slot_state[slot_index] == SLOTSTATE_OPEN_EMPTY) >+ hw->slot_state[slot_index] = SLOTSTATE_UPDATE; >+ > valuator_mask_set(hw->mt_mask[slot_index], map, ev->value); > if (EventTouchSlotPreviouslyOpen(priv, slot_index)) { > if (ev->code == ABS_MT_POSITION_X) >@@ -625,6 +641,8 @@ > valuator_mask_set(mask, map, ev->value); > } > } >+ >+ return TRUE; > } > > /** >@@ -662,16 +680,34 @@ > proto_data->st_to_mt_offset[axis]; > } > >+static inline Bool >+syn_report(InputInfoPtr pInfo, struct CommData *comm, struct SynapticsHwState *hwRet) >+{ >+ struct SynapticsHwState *hw = comm->hwState; >+ SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; >+ struct eventcomm_proto_data *proto_data = priv->proto_data; >+ struct input_event *ev = &proto_data->last_ev; >+ >+ hw->numFingers = count_fingers(pInfo, comm); >+ if (proto_data->have_monotonic_clock) >+ hw->millis = 1000 * ev->time.tv_sec + ev->time.tv_usec / 1000; >+ else >+ hw->millis = GetTimeInMillis(); >+ >+ SynapticsCopyHwState(hwRet, hw); >+ return TRUE; >+} >+ > Bool > EventReadHwState(InputInfoPtr pInfo, > struct CommData *comm, struct SynapticsHwState *hwRet) > { >- struct input_event ev; > Bool v; > struct SynapticsHwState *hw = comm->hwState; > SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; > SynapticsParameters *para = &priv->synpara; > struct eventcomm_proto_data *proto_data = priv->proto_data; >+ struct input_event *ev = &proto_data->last_ev; > Bool sync_cumulative = FALSE; > > set_libevdev_log_handler(); >@@ -686,23 +722,19 @@ > sync_cumulative = TRUE; > } > >- while (SynapticsReadEvent(pInfo, &ev)) { >- switch (ev.type) { >+ while (proto_data->process_ev || SynapticsReadEvent(pInfo, ev)) { >+ proto_data->process_ev = FALSE; >+ >+ switch (ev->type) { > case EV_SYN: >- switch (ev.code) { >+ switch (ev->code) { > case SYN_REPORT: >- hw->numFingers = count_fingers(pInfo, comm); >- if (proto_data->have_monotonic_clock) >- hw->millis = 1000 * ev.time.tv_sec + ev.time.tv_usec / 1000; >- else >- hw->millis = GetTimeInMillis(); >- SynapticsCopyHwState(hwRet, hw); >- return TRUE; >+ return syn_report(pInfo, comm, hwRet); > } > break; > case EV_KEY: >- v = (ev.value ? TRUE : FALSE); >- switch (ev.code) { >+ v = (ev->value ? TRUE : FALSE); >+ switch (ev->code) { > case BTN_LEFT: > hw->left = v; > break; >@@ -758,28 +790,32 @@ > } > break; > case EV_ABS: >- if (ev.code < ABS_MT_SLOT) { >- switch (ev.code) { >+ if (ev->code < ABS_MT_SLOT) { >+ switch (ev->code) { > case ABS_X: >- hw->x = apply_st_scaling(proto_data, ev.value, 0); >+ hw->x = apply_st_scaling(proto_data, ev->value, 0); > if (sync_cumulative) > hw->cumulative_dx = hw->x; > break; > case ABS_Y: >- hw->y = apply_st_scaling(proto_data, ev.value, 1); >+ hw->y = apply_st_scaling(proto_data, ev->value, 1); > if (sync_cumulative) > hw->cumulative_dy = hw->y; > break; > case ABS_PRESSURE: >- hw->z = ev.value; >+ hw->z = ev->value; > break; > case ABS_TOOL_WIDTH: >- hw->fingerWidth = ev.value; >+ hw->fingerWidth = ev->value; > break; > } > } > else >- EventProcessTouchEvent(pInfo, hw, &ev); >+ if(!EventProcessTouchEvent(pInfo, hw, ev)) >+ { >+ proto_data->process_ev = TRUE; >+ return syn_report(pInfo, comm, hwRet); >+ } > break; > } > } >Nur in xf86-input-synaptics-1.8.1_patched/src: eventcomm.c.orig.
diff -ru xf86-input-synaptics-1.8.1/src/eventcomm.c xf86-input-synaptics-1.8.1_patched/src/eventcomm.c --- xf86-input-synaptics-1.8.1/src/eventcomm.c 2014-09-17 23:39:51.000000000 +0200 +++ xf86-input-synaptics-1.8.1_patched/src/eventcomm.c 2015-08-13 13:57:20.455077398 +0200 @@ -80,6 +80,13 @@ * exists for readability of the code. */ BOOL need_grab; + + /* + * Does the last_ev member of this struct contain a valid event for + * processing? + */ + BOOL process_ev; + int st_to_mt_offset[2]; double st_to_mt_scale[2]; int axis_map[ABS_MT_CNT]; @@ -91,6 +98,7 @@ enum libevdev_read_flag read_flag; int have_monotonic_clock; + struct input_event last_ev; }; static void @@ -576,7 +584,7 @@ return FALSE; } -static void +static Bool EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw, struct input_event *ev) { @@ -584,7 +592,7 @@ struct eventcomm_proto_data *proto_data = priv->proto_data; if (!priv->has_touch) - return; + return TRUE; if (ev->code == ABS_MT_SLOT) { proto_data->cur_slot = ev->value; @@ -593,11 +601,16 @@ int slot_index = proto_data->cur_slot; if (slot_index < 0) - return; + return TRUE; - if (hw->slot_state[slot_index] == SLOTSTATE_OPEN_EMPTY) - hw->slot_state[slot_index] = SLOTSTATE_UPDATE; if (ev->code == ABS_MT_TRACKING_ID) { + if(hw->slot_state[slot_index] != SLOTSTATE_EMPTY && hw->slot_state[slot_index] != SLOTSTATE_OPEN_EMPTY) + { + // Happens when libevdev sends more than one open/close events in one SYN_REPORT packet. + // Must inject a SYN_REPORT for synaptics.c state machine + return FALSE; + } + if (ev->value >= 0) { hw->slot_state[slot_index] = SLOTSTATE_OPEN; proto_data->num_touches++; @@ -614,6 +627,9 @@ int map = proto_data->axis_map[ev->code - ABS_MT_TOUCH_MAJOR]; int last_val = valuator_mask_get(mask, map); + if (hw->slot_state[slot_index] == SLOTSTATE_OPEN_EMPTY) + hw->slot_state[slot_index] = SLOTSTATE_UPDATE; + valuator_mask_set(hw->mt_mask[slot_index], map, ev->value); if (EventTouchSlotPreviouslyOpen(priv, slot_index)) { if (ev->code == ABS_MT_POSITION_X) @@ -625,6 +641,8 @@ valuator_mask_set(mask, map, ev->value); } } + + return TRUE; } /** @@ -662,16 +680,34 @@ proto_data->st_to_mt_offset[axis]; } +static inline Bool +syn_report(InputInfoPtr pInfo, struct CommData *comm, struct SynapticsHwState *hwRet) +{ + struct SynapticsHwState *hw = comm->hwState; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; + struct eventcomm_proto_data *proto_data = priv->proto_data; + struct input_event *ev = &proto_data->last_ev; + + hw->numFingers = count_fingers(pInfo, comm); + if (proto_data->have_monotonic_clock) + hw->millis = 1000 * ev->time.tv_sec + ev->time.tv_usec / 1000; + else + hw->millis = GetTimeInMillis(); + + SynapticsCopyHwState(hwRet, hw); + return TRUE; +} + Bool EventReadHwState(InputInfoPtr pInfo, struct CommData *comm, struct SynapticsHwState *hwRet) { - struct input_event ev; Bool v; struct SynapticsHwState *hw = comm->hwState; SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; SynapticsParameters *para = &priv->synpara; struct eventcomm_proto_data *proto_data = priv->proto_data; + struct input_event *ev = &proto_data->last_ev; Bool sync_cumulative = FALSE; set_libevdev_log_handler(); @@ -686,23 +722,19 @@ sync_cumulative = TRUE; } - while (SynapticsReadEvent(pInfo, &ev)) { - switch (ev.type) { + while (proto_data->process_ev || SynapticsReadEvent(pInfo, ev)) { + proto_data->process_ev = FALSE; + + switch (ev->type) { case EV_SYN: - switch (ev.code) { + switch (ev->code) { case SYN_REPORT: - hw->numFingers = count_fingers(pInfo, comm); - if (proto_data->have_monotonic_clock) - hw->millis = 1000 * ev.time.tv_sec + ev.time.tv_usec / 1000; - else - hw->millis = GetTimeInMillis(); - SynapticsCopyHwState(hwRet, hw); - return TRUE; + return syn_report(pInfo, comm, hwRet); } break; case EV_KEY: - v = (ev.value ? TRUE : FALSE); - switch (ev.code) { + v = (ev->value ? TRUE : FALSE); + switch (ev->code) { case BTN_LEFT: hw->left = v; break; @@ -758,28 +790,32 @@ } break; case EV_ABS: - if (ev.code < ABS_MT_SLOT) { - switch (ev.code) { + if (ev->code < ABS_MT_SLOT) { + switch (ev->code) { case ABS_X: - hw->x = apply_st_scaling(proto_data, ev.value, 0); + hw->x = apply_st_scaling(proto_data, ev->value, 0); if (sync_cumulative) hw->cumulative_dx = hw->x; break; case ABS_Y: - hw->y = apply_st_scaling(proto_data, ev.value, 1); + hw->y = apply_st_scaling(proto_data, ev->value, 1); if (sync_cumulative) hw->cumulative_dy = hw->y; break; case ABS_PRESSURE: - hw->z = ev.value; + hw->z = ev->value; break; case ABS_TOOL_WIDTH: - hw->fingerWidth = ev.value; + hw->fingerWidth = ev->value; break; } } else - EventProcessTouchEvent(pInfo, hw, &ev); + if(!EventProcessTouchEvent(pInfo, hw, ev)) + { + proto_data->process_ev = TRUE; + return syn_report(pInfo, comm, hwRet); + } break; } } Nur in xf86-input-synaptics-1.8.1_patched/src: eventcomm.c.orig.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 16093
:
6713
|
6776
| 6929