mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-07-13 16:55:02 -04:00
UI: Fix potential race condition for hover items
The graphics thread should not be accessing any Qt objects that aren't guaranteed to exist. Instead, store the currently hovering list/preview scene items in the preview class.
This commit is contained in:
@@ -616,7 +616,7 @@ void OBSBasicPreview::mouseReleaseEvent(QMouseEvent *event)
|
||||
cropping = false;
|
||||
|
||||
OBSSceneItem item = GetItemAtPos(pos, true);
|
||||
hovered = item;
|
||||
hoveredPreviewItem = item;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1163,7 +1163,7 @@ void OBSBasicPreview::mouseMoveEvent(QMouseEvent *event)
|
||||
return;
|
||||
|
||||
if (mouseDown) {
|
||||
hovered = nullptr;
|
||||
hoveredPreviewItem = nullptr;
|
||||
|
||||
vec2 pos = GetMouseEventPos(event);
|
||||
|
||||
@@ -1205,13 +1205,13 @@ void OBSBasicPreview::mouseMoveEvent(QMouseEvent *event)
|
||||
vec2 pos = GetMouseEventPos(event);
|
||||
OBSSceneItem item = GetItemAtPos(pos, true);
|
||||
|
||||
hovered = item;
|
||||
hoveredPreviewItem = item;
|
||||
}
|
||||
}
|
||||
|
||||
void OBSBasicPreview::leaveEvent(QEvent *event)
|
||||
{
|
||||
hovered = nullptr;
|
||||
hoveredPreviewItem = nullptr;
|
||||
|
||||
UNUSED_PARAMETER(event);
|
||||
}
|
||||
@@ -1408,16 +1408,14 @@ bool OBSBasicPreview::DrawSelectedItem(obs_scene_t *scene,
|
||||
gs_matrix_pop();
|
||||
}
|
||||
|
||||
OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
|
||||
OBSBasicPreview *prev = reinterpret_cast<OBSBasicPreview*>(param);
|
||||
OBSBasic *main = OBSBasic::Get();
|
||||
|
||||
SourceTreeItem *hovItem = main->ui->sources->GetHoveredItem();
|
||||
SourceTreeItem *curItem = main->GetItemWidgetFromSceneItem(item);
|
||||
|
||||
bool hover = (curItem && hovItem == curItem) || prev->hovered == item;
|
||||
bool hovered = prev->hoveredPreviewItem == item ||
|
||||
prev->hoveredListItem == item;
|
||||
bool selected = obs_sceneitem_selected(item);
|
||||
|
||||
if (!selected && !hover)
|
||||
if (!selected && !hovered)
|
||||
return true;
|
||||
|
||||
matrix4 boxTransform;
|
||||
@@ -1466,7 +1464,7 @@ bool OBSBasicPreview::DrawSelectedItem(obs_scene_t *scene,
|
||||
|
||||
if (info.bounds_type == OBS_BOUNDS_NONE && crop_enabled(&crop)) {
|
||||
#define DRAW_SIDE(side, x1, y1, x2, y2) \
|
||||
if (hover && !selected) \
|
||||
if (hovered && !selected) \
|
||||
gs_effect_set_vec4(colParam, &blue); \
|
||||
else if (crop.side > 0) \
|
||||
gs_effect_set_vec4(colParam, &green); \
|
||||
|
||||
Reference in New Issue
Block a user