Drupal 7 has a hook that allows a module to change the currently enabled theme: hook_custom_theme().
Notice that the code used to invoke that hook is the following one. (See menu_get_custom_theme().)
// First allow modules to dynamically set a custom theme for the current
// page. Since we can only have one, the last module to return a valid
// theme takes precedence.
$custom_themes = array_filter(module_invoke_all('custom_theme'), 'drupal_theme_access');
if (!empty($custom_themes)) {
$custom_theme = array_pop($custom_themes);
}
// If there is a theme callback function for the current page, execute it.
// If this returns a valid theme, it will override any theme that was set
// by a hook_custom_theme() implementation above.
$router_item = menu_get_item();
if (!empty($router_item['access']) && !empty($router_item['theme_callback']) && function_exists($router_item['theme_callback'])) {
$theme_name = call_user_func_array($router_item['theme_callback'], $router_item['theme_arguments']);
if (drupal_theme_access($theme_name)) {
$custom_theme = $theme_name;
}
}
Since the System module implements that hook, if you implement hook_custom_theme()
in a module for which the hook is executed first (e.g. the short name of the module is custom_module), then the System module could override the theme set by your module.
Generally, setting the global $custom_theme
should get the same effect. Be sure the theme being set is enabled.