From 059553acb1fd81caac4cdf19ecbda399a0d83090 Mon Sep 17 00:00:00 2001
From: Cecil <knoppmyth@gmail.com>
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 <carmelo.piccione@gmail.com>
+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<TraverseFunctors::Delete<Func> >(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<std::map<std::string, Func*>::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<std::string, Func*> pair = std::make_pair(std::string(func->getName()), func);
++  
++  assert(pair.second);
++  
++  const std::pair<std::map<std::string, Func*>::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<std::string, Func*> 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 <sstream>
+-PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0) {}
++PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0), initialized(false) {}
+ 
+ PresetFactoryManager::~PresetFactoryManager() {
+ 	for (std::vector<PresetFactory *>::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<std::string, PresetFactory *> _factoryMap;
+ 		mutable std::vector<PresetFactory *> _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<float> ( "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 <iostream>
+ #include "qprojectm.hpp"
+ #include <QGLWidget>
+ #include <QMutex>
+@@ -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

