diff options
Diffstat (limited to 'settings/module.c')
-rw-r--r-- | settings/module.c | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/settings/module.c b/settings/module.c new file mode 100644 index 00000000..e10b396a --- /dev/null +++ b/settings/module.c @@ -0,0 +1,275 @@ +/* $Id$ */ +/*- + * Copyright (c) 2003-2004 Benedikt Meurer <benny@xfce.org> + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_MEMORY_H +#include <memory.h> +#endif +#ifdef HAVE_STRING_H +#include <string.h> +#endif + +#include <gmodule.h> + +#include <libxfcegui4/libxfcegui4.h> + +#include <libxfsm/xfsm-splash-engine.h> +#include <libxfsm/xfsm-splash-rc.h> + +#include "module.h" + + +struct _Module +{ + gchar *engine; + GModule *handle; + XfsmSplashConfig config; +}; + + + +Module* +module_load (const gchar *path, + XfceRc *rc) +{ + void (*init) (XfsmSplashConfig *config); + Module *module; + gchar group[128]; + gchar *dp; + gchar *sp; + + /* load module */ + module = g_new0 (Module, 1); +#if GLIB_CHECK_VERSION(2,4,0) + module->handle = g_module_open (path, G_MODULE_BIND_LOCAL); +#else + module->handle = g_module_open (path, 0); +#endif + if (G_UNLIKELY (module->handle == NULL)) + goto error0; + if (!g_module_symbol (module->handle, "config_init", (gpointer)&init)) + goto error1; + + /* determine engine name */ + sp = module->engine = g_path_get_basename (path); + if (sp[0] == 'l' && sp[1] == 'i' && sp[2] == 'b') + sp += 3; + for (dp = module->engine; *sp != '\0'; ++dp, ++sp) + { + if (*sp == '.') + break; + else + *dp = *sp; + } + *dp = '\0'; + g_snprintf (group, 128, "Engine: %s", module->engine); + + /* initialize module */ + module->config.rc = xfsm_splash_rc_new (rc, group); + init (&module->config); + if (G_UNLIKELY (module->config.name == NULL)) + { + module_free (module); + return NULL; + } + + /* succeed */ + return module; + +error1: + g_module_close (module->handle); +error0: + g_free (module); + return NULL; +} + + +const gchar* +module_engine (const Module *module) +{ + return module->engine; +} + + +const gchar* +module_name (const Module *module) +{ + return module->config.name; +} + + +const gchar* +module_descr (const Module *module) +{ + return module->config.description; +} + + +const gchar* +module_version (const Module *module) +{ + return module->config.version; +} + + +const gchar* +module_author (const Module *module) +{ + return module->config.author; +} + + +const gchar* +module_homepage (const Module *module) +{ + return module->config.homepage; +} + + +GdkPixbuf* +module_preview (Module *module) +{ + if (G_LIKELY (module->config.preview != NULL)) + return module->config.preview (&module->config); + else + return NULL; +} + + +gboolean +module_can_configure (const Module *module) +{ + return module->config.configure != NULL; +} + + +void +module_configure (Module *module, + GtkWidget *parent) +{ + if (G_LIKELY (module->config.configure != NULL)) + module->config.configure (&module->config, parent); +} + + +void +module_test (Module *module, + GdkDisplay *display) +{ + static char *steps[] = + { + "Starting the Window Manager", + "Starting the Desktop Manager", + "Starting the Taskbar", + "Starting the Panel", + NULL, + }; + + void (*init) (XfsmSplashEngine *engine); + XfsmSplashEngine engine; + GdkScreen *screen; + guint id; + int monitor; + int step; + + /* properly initialize the engine struct with zeros! */ + bzero (&engine, sizeof (engine)); + + /* locate monitor with pointer */ + screen = xfce_gdk_display_locate_monitor_with_pointer (display, &monitor); + if (G_UNLIKELY (screen == NULL)) + { + screen = gdk_display_get_screen (display, 0); + monitor = 0; + } + + /* initialize engine struct */ + engine.display = display; + engine.primary_screen = screen; + engine.primary_monitor = monitor; + + /* load and setup the engine */ + if (g_module_symbol (module->handle, "engine_init", (gpointer)&init)) + { + init (&engine); + + if (G_LIKELY (engine.setup != NULL)) + { + engine.setup (&engine, module->config.rc); + gdk_flush (); + } + + if (G_LIKELY (engine.start != NULL)) + { + engine.start (&engine, "Default", NULL, 4); + gdk_flush (); + } + + if (G_LIKELY (engine.next != NULL)) + { + for (step = 0; steps[step] != NULL; ++step) + { + engine.next (&engine, steps[step]); + id = g_timeout_add (1000, (GSourceFunc) gtk_main_quit, NULL); + gtk_main (); + g_source_remove (id); + } + } + + if (G_LIKELY (engine.destroy != NULL)) + engine.destroy (&engine); + } +} + + +void +module_free (Module *module) +{ + if (G_LIKELY (module->config.destroy != NULL)) + module->config.destroy (&module->config); + + if (G_LIKELY (module->config.name != NULL)) + g_free (module->config.name); + + if (G_LIKELY (module->config.description != NULL)) + g_free (module->config.description); + + if (G_LIKELY (module->config.version != NULL)) + g_free (module->config.version); + + if (G_LIKELY (module->config.author != NULL)) + g_free (module->config.author); + + if (G_LIKELY (module->config.homepage != NULL)) + g_free (module->config.homepage); + + xfsm_splash_rc_free (module->config.rc); + g_module_close (module->handle); + g_free (module->engine); + g_free (module); +} + + + + |