From 059553acb1fd81caac4cdf19ecbda399a0d83090 Mon Sep 17 00:00:00 2001 From: Cecil Date: Mon, 8 Aug 2011 17:34:47 -0700 Subject: project-complete:Added patch that fixes crashing after switching to fullscreen! --- abs/core/projectm-complete/PKGBUILD | 9 +- abs/core/projectm-complete/error-handling.patch | 308 ++++++++++++++++++++++++ 2 files changed, 315 insertions(+), 2 deletions(-) create mode 100644 abs/core/projectm-complete/error-handling.patch diff --git a/abs/core/projectm-complete/PKGBUILD b/abs/core/projectm-complete/PKGBUILD index e6a975d..59fd26f 100644 --- a/abs/core/projectm-complete/PKGBUILD +++ b/abs/core/projectm-complete/PKGBUILD @@ -2,7 +2,7 @@ pkgname=projectm-complete pkgver=2.0.1 -pkgrel=2 +pkgrel=3 pkgdesc="A music visualizer which uses 3D accelerated iterative image based rendering (all components)" arch=('i686' 'x86_64') url="http://projectm.sourceforge.net/" @@ -12,16 +12,21 @@ provides=('projectm' 'projectm-qt' 'projectm-libvisual' 'projectm-libvisual-alsa conflicts=('projectm' 'projectm-qt' 'projectm-libvisual' 'projectm-libvisual-alsa') makedepends=('pkgconfig' 'xproto' 'cmake') source=("http://sourceforge.net/projects/projectm/files/2.0.1/projectM-complete-2.0.1-Source.tar.gz/download" - "libprojectm-2.0.1-pcfix.patch") + "libprojectm-2.0.1-pcfix.patch" + "error-handling.patch") md5sums=('9d32fa1357622c7a945a2e10620ee945' '9e2d9b03748fd6511181366b8d025425') build() { cd $srcdir/projectM-complete-$pkgver-Source/ || return 1 patch -p1 -i ../libprojectm-2.0.1-pcfix.patch + patch -p1 -i ../error-handling.patch cd src cmake -D CMAKE_INSTALL_PREFIX=/usr -D CMAKE_BUILD_TYPE=Release -D USE_FBO=OFF . || return 1 make all || return 1 make DESTDIR=$pkgdir install || return 1 rm -rf $srcdir/projectM-complete-$pkgver-Source } +md5sums=('9d32fa1357622c7a945a2e10620ee945' + '9e2d9b03748fd6511181366b8d025425' + '9b6e5a862603e7b9e45bfc51313c6a04') diff --git a/abs/core/projectm-complete/error-handling.patch b/abs/core/projectm-complete/error-handling.patch new file mode 100644 index 0000000..4154884 --- /dev/null +++ b/abs/core/projectm-complete/error-handling.patch @@ -0,0 +1,308 @@ +Description: Error handling + * Guard against reinitializing the builtin milkdrop functions. + Hides a deeper issue where something is double loading the preset factories, most + likely. + * Playlist file / directory error handling fixes, resize playlist refresh fix + +Forwarded: yes +Author: Carmelo Piccione +Last-Update: 2010-07-29 +--- a/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.cpp ++++ b/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.cpp +@@ -29,7 +29,7 @@ + /* Create new function */ + func = new Func(name, func_ptr, num_args); + +- if (func == NULL) ++ if (func == 0) + return PROJECTM_OUTOFMEM_ERROR; + + retval = insert_func( func ); +@@ -115,12 +115,18 @@ + return PROJECTM_SUCCESS; + } + ++volatile bool BuiltinFuncs::initialized = false; + + /* Initialize the builtin function database. + Should only be necessary once */ + int BuiltinFuncs::init_builtin_func_db() { + int retval; + ++ if (initialized) { ++ return 0; ++ } else ++ initialized = true; ++ + retval = load_all_builtin_func(); + return retval; + } +@@ -134,7 +140,7 @@ + traverse >(builtin_func_tree); + + builtin_func_tree.clear(); +- ++initialized = false; + return PROJECTM_SUCCESS; + } + +@@ -142,13 +148,24 @@ + int BuiltinFuncs::insert_func( Func *func ) { + + assert(func); +- std::pair::iterator, bool> inserteePair = +- builtin_func_tree.insert(std::make_pair(std::string(func->getName()), func)); + ++ if (func == 0) { ++ std::cerr << "Received a null function object, ignoring...." << std::endl; ++ return PROJECTM_ERROR; ++ } ++ ++// //std::cout << "inserting function " << func->getName() << std::endl; ++ ++ const std::pair pair = std::make_pair(std::string(func->getName()), func); ++ ++ assert(pair.second); ++ ++ const std::pair::iterator, bool> inserteePair = ++ builtin_func_tree.insert(pair); ++ + if (!inserteePair.second) { + std::cerr << "Failed to insert builtin function \"" << func->getName() << "\" into collection! Bailing..." << std::endl; + abort(); +- + } + + return PROJECTM_SUCCESS; +--- a/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.hpp ++++ b/src/libprojectM/MilkdropPresetFactory/BuiltinFuncs.hpp +@@ -229,6 +229,7 @@ + static Func *find_func( const std::string & name ); + private: + static std::map builtin_func_tree; ++ static volatile bool initialized; + }; + + #endif +--- a/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.cpp ++++ b/src/libprojectM/MilkdropPresetFactory/MilkdropPresetFactory.cpp +@@ -26,7 +26,7 @@ + Eval::init_infix_ops(); + + _presetOutputs = createPresetOutputs(gx,gy); +- _presetOutputs2 = createPresetOutputs(gx, gy); ++ _presetOutputs2 = createPresetOutputs(gx, gy); + } + + MilkdropPresetFactory::~MilkdropPresetFactory() { +@@ -37,13 +37,13 @@ + BuiltinFuncs::destroy_builtin_func_db(); + std::cerr << "[~MilkdropPresetFactory] delete preset out puts" << std::endl; + delete(_presetOutputs); +- delete(_presetOutputs2); ++ delete(_presetOutputs2); + std::cerr << "[~MilkdropPresetFactory] done" << std::endl; + + } + + /* Reinitializes the engine variables to a default (conservative and sane) value */ +-void resetPresetOutputs(PresetOutputs *presetOutputs) ++void resetPresetOutputs(PresetOutputs * presetOutputs) + { + + presetOutputs->zoom=1.0; +--- a/src/libprojectM/PresetFactoryManager.cpp ++++ b/src/libprojectM/PresetFactoryManager.cpp +@@ -20,7 +20,7 @@ + #endif + + #include +-PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0) {} ++PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0), initialized(false) {} + + PresetFactoryManager::~PresetFactoryManager() { + for (std::vector::iterator pos = _factoryList.begin(); +@@ -29,11 +29,20 @@ + delete(*pos); + } + +- ++ initialized = false; + } ++ + void PresetFactoryManager::initialize(int gx, int gy) { + _gx = gx; + _gy = gy; ++ ++ if (!initialized) { ++ initialized = true; ++ } else { ++ std::cout << "already initialized " << std::endl; ++ return; ++ } ++ + PresetFactory * factory; + + #ifndef DISABLE_MILKDROP_PRESETS +--- a/src/libprojectM/PresetFactoryManager.hpp ++++ b/src/libprojectM/PresetFactoryManager.hpp +@@ -21,7 +21,7 @@ + virtual ~PresetFactoryException() throw() {} + const std::string & message() const { return _message; } + +- private: ++ private: + std::string _message; + }; + +@@ -54,6 +54,6 @@ + mutable std::map _factoryMap; + mutable std::vector _factoryList; + void registerFactory(const std::string & extension, PresetFactory * factory); +- ++ volatile bool initialized; + }; + #endif +--- a/src/libprojectM/projectM.cpp ++++ b/src/libprojectM/projectM.cpp +@@ -222,7 +222,6 @@ + projectM_init ( _settings.meshX, _settings.meshY, _settings.fps, + _settings.textureSize, _settings.windowWidth,_settings.windowHeight); + +- + _settings.beatSensitivity = beatDetect->beat_sensitivity = config.read ( "Hard Cut Sensitivity", 10.0 ); + + if ( config.read ( "Aspect Correction", true ) ) +--- a/src/projectM-pulseaudio/QPulseAudioThread.cpp ++++ b/src/projectM-pulseaudio/QPulseAudioThread.cpp +@@ -296,9 +296,7 @@ + { + assert ( mainloop_api ); + mainloop_api->quit ( mainloop_api, ret ); +- if (*s_qprojectM_MainWindowPtr) +- delete(*s_qprojectM_MainWindowPtr); +- *s_qprojectM_MainWindowPtr = 0; ++ + } + + +@@ -315,7 +313,8 @@ + { + fprintf ( stderr, "pa_stream_peek() failed: %s\n", pa_strerror ( pa_context_errno ( context ) ) ); + pulseQuit ( 1 ); +- return; ++ return ++; + } + + if ((!s_qprojectM_MainWindowPtr) || (!*s_qprojectM_MainWindowPtr)) +@@ -352,16 +351,16 @@ + switch ( pa_stream_get_state ( s ) ) + { + case PA_STREAM_UNCONNECTED: +-// qDebug() << "UNCONNECTED"; ++ qDebug() << "UNCONNECTED"; + break; + case PA_STREAM_CREATING: +-// qDebug() << "CREATED"; ++ qDebug() << "CREATED"; + break; + case PA_STREAM_TERMINATED: +-// qDebug() << "TERMINATED"; ++ qDebug() << "TERMINATED"; + break; + case PA_STREAM_READY: +-// qDebug() << "READY"; ++ qDebug() << "READY"; + if ( verbose ) + { + const pa_buffer_attr *a; +--- a/src/projectM-qt/qplaylisttableview.hpp ++++ b/src/projectM-qt/qplaylisttableview.hpp +@@ -93,14 +93,14 @@ + } + + inline void resizeEvent(QResizeEvent * event) { +- ++ QTableView::resizeEvent(event); + emit(resized(event)); + } + + inline void mousePressEvent(QMouseEvent * event) { + QAbstractItemView::mousePressEvent(event); + if (event->button() == Qt::RightButton) { +- emit(mousePressed(event, selectedIndexes())); ++ emit(mousePressed(event, selectedIndexes())); + } + else + ; +--- a/src/projectM-qt/qprojectm_mainwindow.cpp ++++ b/src/projectM-qt/qprojectm_mainwindow.cpp +@@ -98,7 +98,8 @@ + + connect(ui->tableView, SIGNAL(resized(QResizeEvent *)), this, SLOT(refreshHeaders(QResizeEvent*))); + +- connect(ui->tableView, SIGNAL(mousePressed(QMouseEvent*, const QModelIndexList &)), this, SLOT(popupPlaylistContextMenu(QMouseEvent*, const QModelIndexList &))); ++ connect(ui->tableView, SIGNAL(mousePressed(QMouseEvent*, const QModelIndexList &)), this, ++ SLOT(popupPlaylistContextMenu(QMouseEvent*, const QModelIndexList &))); + + connect ( m_QProjectMWidget, SIGNAL ( projectM_Initialized(QProjectM*) ), + this, SLOT ( postProjectM_Initialize() ) ); +@@ -662,7 +663,7 @@ + // Add 1 to skip the Name column + hHeader->setResizeMode (i+1, QHeaderView::ResizeToContents); + sizeTotal += hHeader->sectionSize(i+1); +- } ++ } + hHeader->resizeSection(0, ui->tableView->size().width()-20-sizeTotal); + + +@@ -883,11 +884,13 @@ + QString url = m_QPlaylistFileDialog->selectedFiles() [0]; + + +- if ( !playlistModel->readPlaylist ( url ) ) { ++ const bool loadedOk = playlistModel->readPlaylist ( url ); ++ ++ if (!loadedOk) { + qDebug() << "could not open playlist"; + url = QString(); +- +- } ++ } ++ + qDebug() << "url: " << url; + updatePlaylistUrl(url); + +--- a/src/projectM-qt/qprojectmwidget.hpp ++++ b/src/projectM-qt/qprojectmwidget.hpp +@@ -22,6 +22,7 @@ + #ifndef QPROJECTM_WIDGET_HPP + #define QPROJECTM_WIDGET_HPP + ++#include + #include "qprojectm.hpp" + #include + #include +@@ -111,7 +112,7 @@ + + void resetProjectM() + { +- ++ std::cout << "reseting" << std::endl; + qDebug() << "reset start"; + + emit ( projectM_BeforeDestroy() ); +@@ -246,8 +247,10 @@ + void initializeGL() + { + +- this->m_projectM = new QProjectM ( m_config_file ); +- projectM_Initialized ( m_projectM ); ++ if (m_projectM == 0) { ++ this->m_projectM = new QProjectM ( m_config_file ); ++ projectM_Initialized ( m_projectM ); ++ } + } + + inline void paintGL() -- cgit v0.12