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:
pkv
2019-01-31 03:33:15 +01:00
committed by Colin Edwards
parent 72b8448b3d
commit 62fa2b0086
4 changed files with 85 additions and 45 deletions

View File

@@ -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);
}