From fa00c6fa474e1aaac32de3f90d5489cfbfc65a83 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 13 Dec 2013 08:15:50 -0700 Subject: [PATCH] add a RAII wx connect wrapper --- obs/settings-basic-general.cpp | 15 ++------ obs/wx-wrappers.hpp | 68 +++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/obs/settings-basic-general.cpp b/obs/settings-basic-general.cpp index 7853d0fd3..35ea3ce86 100644 --- a/obs/settings-basic-general.cpp +++ b/obs/settings-basic-general.cpp @@ -20,10 +20,12 @@ #include "obs-app.hpp" #include "settings-basic.hpp" #include "window-settings-basic.hpp" +#include "wx-wrappers.hpp" #include "platform.hpp" class GeneralSettings : public BasicSettingsData { ConfigFile localeIni; + WXConnector languageBoxConnector; void LanguageChanged(wxCommandEvent &event); @@ -32,7 +34,6 @@ class GeneralSettings : public BasicSettingsData { public: GeneralSettings(OBSBasicSettings *window); - virtual ~GeneralSettings(); virtual void Apply(); }; @@ -86,16 +87,8 @@ GeneralSettings::GeneralSettings(OBSBasicSettings *window) "General", "Language"); FillLanguageList(currentLang); - window->languageList->Connect( - wxEVT_COMBOBOX, - wxCommandEventHandler(GeneralSettings::LanguageChanged), - NULL, - this); -} - -GeneralSettings::~GeneralSettings() -{ - window->languageList->Disconnect( + languageBoxConnector.Connect( + window->languageList, wxEVT_COMBOBOX, wxCommandEventHandler(GeneralSettings::LanguageChanged), NULL, diff --git a/obs/wx-wrappers.hpp b/obs/wx-wrappers.hpp index 77e911d4f..2fc9490fa 100644 --- a/obs/wx-wrappers.hpp +++ b/obs/wx-wrappers.hpp @@ -17,8 +17,74 @@ #pragma once +#include +#include + struct gs_window; -class wxWindow; gs_window WxToGSWindow(const wxWindow *window); void OBSErrorBox(wxWindow *parent, const char *message, ...); + +/* + * RAII wx connection wrapper + * + * Automatically disconnects events on destruction rather than having to + * manually call Disconnect for every Connect. + */ + +class WXConnector { + wxEvtHandler *obj; + wxEventType eventType; + wxObjectEventFunction func; + wxObject *userData; + wxEvtHandler *eventSink; + +public: + inline WXConnector() + : obj (NULL), + eventType (0), + func (NULL), + userData (NULL), + eventSink (NULL) + { + } + + inline WXConnector(wxEvtHandler *obj, wxEventType eventType, + wxObjectEventFunction func, wxObject *userData, + wxEvtHandler *eventSink) + : obj (obj), + eventType (eventType), + func (func), + userData (userData), + eventSink (eventSink) + { + obj->Connect(eventType, func, userData, eventSink); + } + + inline ~WXConnector() + { + Disconnect(); + } + + inline void Connect(wxEvtHandler *obj, wxEventType eventType, + wxObjectEventFunction func, wxObject *userData, + wxEvtHandler *eventSink) + { + Disconnect(); + + this->obj = obj; + this->eventType = eventType; + this->func = func; + this->userData = userData; + this->eventSink = eventSink; + + obj->Connect(eventType, func, userData, eventSink); + } + + inline void Disconnect() + { + if (obj) + obj->Disconnect(eventType, func, userData, eventSink); + obj = NULL; + } +};