From 439974a5d5692c912c239496e4b48aac342bcb5a Mon Sep 17 00:00:00 2001
From: Zach Prezkuta <fermion@gmx.com>
Date: Mon, 4 Feb 2013 20:53:53 -0700
Subject: [PATCH] allow themes to use plugin hooks

---
 include/plugin.php | 40 ++++++++++++++++++++++++++++++++++++++++
 mod/admin.php      |  8 ++++++--
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/include/plugin.php b/include/plugin.php
index db3224f296..ef0ddd05ef 100644
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -162,6 +162,10 @@ function call_hooks($name, &$data = null) {
 
 	if((is_array($a->hooks)) && (array_key_exists($name,$a->hooks))) {
 		foreach($a->hooks[$name] as $hook) {
+			// Don't run a theme's hook if the user isn't using the theme
+			if(strpos($hook[0], 'view/theme/') !== false && strpos($hook[0], 'view/theme/'.current_theme()) === false)
+				continue;
+
 			@include_once($hook[0]);
 			if(function_exists($hook[1])) {
 				$func = $hook[1];
@@ -318,6 +322,42 @@ function get_theme_screenshot($theme) {
 	return($a->get_baseurl() . '/images/blank.png');
 }
 
+// install and uninstall theme
+if (! function_exists('uninstall_theme')){
+function uninstall_theme($theme){
+	logger("Addons: uninstalling theme " . $theme);
+    
+	@include_once("view/theme/$theme/theme.php");
+	if(function_exists("{$theme}_uninstall")) {
+		$func = "{$theme}_uninstall";
+		$func();
+	}
+}}
+
+if (! function_exists('install_theme')){
+function install_theme($theme) {
+	// silently fail if theme was removed
+
+	if(! file_exists("view/theme/$theme/theme.php"))
+		return false;
+
+	logger("Addons: installing theme $theme");
+
+	@include_once("view/theme/$theme/theme.php");
+
+	if(function_exists("{$theme}_install")) {
+		$func = "{$theme}_install";
+		$func();
+		return true;
+	}
+	else {
+		logger("Addons: FAILED installing theme $theme");
+		return false;
+	}
+
+}}
+
+
 
 // check service_class restrictions. If there are no service_classes defined, everything is allowed.
 // if $usage is supplied, we check against a maximum count and return true if the current usage is 
diff --git a/mod/admin.php b/mod/admin.php
index 89363541ca..8a79fb108c 100644
--- a/mod/admin.php
+++ b/mod/admin.php
@@ -980,10 +980,14 @@ function admin_page_themes(&$a){
 
 			toggle_theme($themes,$theme,$result);
 			$s = rebuild_theme_table($themes);
-			if($result)
+			if($result) {
+				install_theme($theme);
 				info( sprintf('Theme %s enabled.',$theme));
-			else
+			}
+			else {
+				uninstall_theme($theme);
 				info( sprintf('Theme %s disabled.',$theme));
+			}
 
 			set_config('system','allowed_themes',$s);
 			goaway($a->get_baseurl(true) . '/admin/themes' );