mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-04-12 02:29:03 -04:00
UI: Fix a series of mem leaks (#1614)
* UI: Fix mem leak with projectors * UI: Fix mem leak with ScaleFilteringMenu * UI: Fix mem leak with sourceProjector * UI: Fix leak with preview projector in Source menu and Preview * UI: Fix mem leaks with background color menu * UI: Fix leak with deinterlace Menu * UI: Fix leak with scene transition override menu * UI: Fix leak with scene projector menu * UI: Fix leak with filter shortcut in Main * UI: Fix leak with filter shortcut in stats
This commit is contained in:
@@ -27,7 +27,6 @@
|
||||
#include <QDesktopWidget>
|
||||
#include <QScreen>
|
||||
#include <QColorDialog>
|
||||
#include <QWidgetAction>
|
||||
#include <QSizePolicy>
|
||||
|
||||
#include <util/dstr.h>
|
||||
@@ -223,7 +222,9 @@ OBSBasic::OBSBasic(QWidget *parent)
|
||||
connect(windowHandle(), &QWindow::screenChanged, displayResize);
|
||||
connect(ui->preview, &OBSQTDisplay::DisplayResized, displayResize);
|
||||
|
||||
installEventFilter(CreateShortcutFilter());
|
||||
delete shortcutFilter;
|
||||
shortcutFilter = CreateShortcutFilter();
|
||||
installEventFilter(shortcutFilter);
|
||||
|
||||
stringstream name;
|
||||
name << "OBS " << App()->GetVersionString();
|
||||
@@ -2131,6 +2132,19 @@ OBSBasic::~OBSBasic()
|
||||
updateCheckThread->wait();
|
||||
|
||||
delete multiviewProjectorMenu;
|
||||
delete previewProjector;
|
||||
delete studioProgramProjector;
|
||||
delete previewProjectorSource;
|
||||
delete previewProjectorMain;
|
||||
delete sourceProjector;
|
||||
delete sceneProjectorMenu;
|
||||
delete scaleFilteringMenu;
|
||||
delete colorMenu;
|
||||
delete colorWidgetAction;
|
||||
delete colorSelect;
|
||||
delete deinterlaceMenu;
|
||||
delete perSceneTransitionMenu;
|
||||
delete shortcutFilter;
|
||||
delete trayMenu;
|
||||
delete programOptions;
|
||||
delete program;
|
||||
@@ -3798,7 +3812,6 @@ static void AddProjectorMenuMonitors(QMenu *parent, QObject *target,
|
||||
void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos)
|
||||
{
|
||||
QListWidgetItem *item = ui->scenes->itemAt(pos);
|
||||
QPointer<QMenu> sceneProjectorMenu;
|
||||
|
||||
QMenu popup(this);
|
||||
QMenu order(QTStr("Basic.MainMenu.Edit.Order"), this);
|
||||
@@ -3828,6 +3841,7 @@ void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos)
|
||||
|
||||
popup.addSeparator();
|
||||
|
||||
delete sceneProjectorMenu;
|
||||
sceneProjectorMenu = new QMenu(QTStr("SceneProjector"));
|
||||
AddProjectorMenuMonitors(sceneProjectorMenu, this,
|
||||
SLOT(OpenSceneProjector()));
|
||||
@@ -3844,8 +3858,9 @@ void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos)
|
||||
|
||||
popup.addSeparator();
|
||||
|
||||
QMenu *transitionMenu = CreatePerSceneTransitionMenu();
|
||||
popup.addMenu(transitionMenu);
|
||||
delete perSceneTransitionMenu;
|
||||
perSceneTransitionMenu = CreatePerSceneTransitionMenu();
|
||||
popup.addMenu(perSceneTransitionMenu);
|
||||
|
||||
/* ---------------------- */
|
||||
|
||||
@@ -4005,9 +4020,8 @@ void OBSBasic::SetDeinterlacingOrder()
|
||||
obs_source_set_deinterlace_field_order(source, order);
|
||||
}
|
||||
|
||||
QMenu *OBSBasic::AddDeinterlacingMenu(obs_source_t *source)
|
||||
QMenu *OBSBasic::AddDeinterlacingMenu(QMenu *menu, obs_source_t *source)
|
||||
{
|
||||
QMenu *menu = new QMenu(QTStr("Deinterlacing"));
|
||||
obs_deinterlace_mode deinterlaceMode =
|
||||
obs_source_get_deinterlace_mode(source);
|
||||
obs_deinterlace_field_order deinterlaceOrder =
|
||||
@@ -4057,9 +4071,8 @@ void OBSBasic::SetScaleFilter()
|
||||
obs_sceneitem_set_scale_filter(sceneItem, mode);
|
||||
}
|
||||
|
||||
QMenu *OBSBasic::AddScaleFilteringMenu(obs_sceneitem_t *item)
|
||||
QMenu *OBSBasic::AddScaleFilteringMenu(QMenu *menu, obs_sceneitem_t *item)
|
||||
{
|
||||
QMenu *menu = new QMenu(QTStr("ScaleFiltering"));
|
||||
obs_scale_type scaleFilter = obs_sceneitem_get_scale_filter(item);
|
||||
QAction *action;
|
||||
|
||||
@@ -4080,9 +4093,9 @@ QMenu *OBSBasic::AddScaleFilteringMenu(obs_sceneitem_t *item)
|
||||
return menu;
|
||||
}
|
||||
|
||||
QMenu *OBSBasic::AddBackgroundColorMenu(obs_sceneitem_t *item)
|
||||
QMenu *OBSBasic::AddBackgroundColorMenu(QMenu *menu, QWidgetAction *widgetAction,
|
||||
ColorSelect *select, obs_sceneitem_t *item)
|
||||
{
|
||||
QMenu *menu = new QMenu(QTStr("ChangeBG"));
|
||||
QAction *action;
|
||||
|
||||
menu->setStyleSheet(QString(
|
||||
@@ -4115,8 +4128,6 @@ QMenu *OBSBasic::AddBackgroundColorMenu(obs_sceneitem_t *item)
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
QWidgetAction *widgetAction = new QWidgetAction(menu);
|
||||
ColorSelect *select = new ColorSelect(menu);
|
||||
widgetAction->setDefaultWidget(select);
|
||||
|
||||
for (int i = 1; i < 9; i++) {
|
||||
@@ -4137,11 +4148,23 @@ QMenu *OBSBasic::AddBackgroundColorMenu(obs_sceneitem_t *item)
|
||||
return menu;
|
||||
}
|
||||
|
||||
ColorSelect::ColorSelect(QWidget *parent)
|
||||
: QWidget(parent),
|
||||
ui(new Ui::ColorSelect)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
|
||||
{
|
||||
QMenu popup(this);
|
||||
QPointer<QMenu> previewProjector;
|
||||
QPointer<QMenu> sourceProjector;
|
||||
delete previewProjectorSource;
|
||||
delete sourceProjector;
|
||||
delete scaleFilteringMenu;
|
||||
delete colorMenu;
|
||||
delete colorWidgetAction;
|
||||
delete colorSelect;
|
||||
delete deinterlaceMenu;
|
||||
|
||||
if (preview) {
|
||||
QAction *action = popup.addAction(
|
||||
@@ -4156,11 +4179,11 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
|
||||
popup.addAction(ui->actionLockPreview);
|
||||
popup.addMenu(ui->scalingMenu);
|
||||
|
||||
previewProjector = new QMenu(QTStr("PreviewProjector"));
|
||||
AddProjectorMenuMonitors(previewProjector, this,
|
||||
previewProjectorSource = new QMenu(QTStr("PreviewProjector"));
|
||||
AddProjectorMenuMonitors(previewProjectorSource, this,
|
||||
SLOT(OpenPreviewProjector()));
|
||||
|
||||
popup.addMenu(previewProjector);
|
||||
popup.addMenu(previewProjectorSource);
|
||||
|
||||
QAction *previewWindow = popup.addAction(
|
||||
QTStr("PreviewWindow"),
|
||||
@@ -4213,7 +4236,11 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
|
||||
OBS_SOURCE_AUDIO;
|
||||
QAction *action;
|
||||
|
||||
popup.addMenu(AddBackgroundColorMenu(sceneItem));
|
||||
colorMenu = new QMenu(QTStr("ChangeBG"));
|
||||
colorWidgetAction = new QWidgetAction(colorMenu);
|
||||
colorSelect = new ColorSelect(colorMenu);
|
||||
popup.addMenu(AddBackgroundColorMenu(colorMenu,
|
||||
colorWidgetAction, colorSelect, sceneItem));
|
||||
popup.addAction(QTStr("Rename"), this,
|
||||
SLOT(EditSceneItemName()));
|
||||
popup.addAction(QTStr("Remove"), this,
|
||||
@@ -4243,7 +4270,8 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
|
||||
}
|
||||
|
||||
if (isAsyncVideo) {
|
||||
popup.addMenu(AddDeinterlacingMenu(source));
|
||||
deinterlaceMenu = new QMenu(QTStr("Deinterlacing"));
|
||||
popup.addMenu(AddDeinterlacingMenu(deinterlaceMenu, source));
|
||||
popup.addSeparator();
|
||||
}
|
||||
|
||||
@@ -4262,7 +4290,8 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
|
||||
if (width == 0 || height == 0)
|
||||
resizeOutput->setEnabled(false);
|
||||
|
||||
popup.addMenu(AddScaleFilteringMenu(sceneItem));
|
||||
scaleFilteringMenu = new QMenu(QTStr("ScaleFiltering"));
|
||||
popup.addMenu(AddScaleFilteringMenu(scaleFilteringMenu, sceneItem));
|
||||
popup.addSeparator();
|
||||
|
||||
popup.addMenu(sourceProjector);
|
||||
@@ -5471,7 +5500,7 @@ void OBSBasic::on_previewDisabledLabel_customContextMenuRequested(
|
||||
const QPoint &pos)
|
||||
{
|
||||
QMenu popup(this);
|
||||
QPointer<QMenu> previewProjector;
|
||||
delete previewProjectorMain;
|
||||
|
||||
QAction *action = popup.addAction(
|
||||
QTStr("Basic.Main.PreviewConextMenu.Enable"),
|
||||
@@ -5479,15 +5508,15 @@ void OBSBasic::on_previewDisabledLabel_customContextMenuRequested(
|
||||
action->setCheckable(true);
|
||||
action->setChecked(obs_display_enabled(ui->preview->GetDisplay()));
|
||||
|
||||
previewProjector = new QMenu(QTStr("PreviewProjector"));
|
||||
AddProjectorMenuMonitors(previewProjector, this,
|
||||
previewProjectorMain = new QMenu(QTStr("PreviewProjector"));
|
||||
AddProjectorMenuMonitors(previewProjectorMain, this,
|
||||
SLOT(OpenPreviewProjector()));
|
||||
|
||||
QAction *previewWindow = popup.addAction(
|
||||
QTStr("PreviewWindow"),
|
||||
this, SLOT(OpenPreviewWindow()));
|
||||
|
||||
popup.addMenu(previewProjector);
|
||||
popup.addMenu(previewProjectorMain);
|
||||
popup.addAction(previewWindow);
|
||||
popup.exec(QCursor::pos());
|
||||
|
||||
@@ -6823,10 +6852,3 @@ void OBSBasic::ResizeOutputSizeOfSource()
|
||||
ResetVideo();
|
||||
on_actionFitToScreen_triggered();
|
||||
}
|
||||
|
||||
ColorSelect::ColorSelect(QWidget *parent)
|
||||
: QWidget(parent),
|
||||
ui(new Ui::ColorSelect)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user