X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkthemes.c;h=18559a81a7409be2fd53bffff24caa651125e2a1;hb=5c327ecbe573c60de2265a9622e569fd52943768;hp=c0510d0461bce8badaeebc4a9a027c720ab55ae4;hpb=238ede333fb92750520071b71ebff7130b4c8803;p=~andy%2Fgtk diff --git a/gtk/gtkthemes.c b/gtk/gtkthemes.c index c0510d046..18559a81a 100644 --- a/gtk/gtkthemes.c +++ b/gtk/gtkthemes.c @@ -4,140 +4,193 @@ * Themes added by The Rasterman * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include + #include #include #include #include "gtkthemes.h" -#include "gtkmain.h" #include "gtkrc.h" -#include "gtkselection.h" -#include "gtksignal.h" -#include "gtkwidget.h" -#include "gtkprivate.h" -#include "config.h" +#include "gtkintl.h" +#include "gtkalias.h" -typedef struct _GtkThemeEnginePrivate GtkThemeEnginePrivate; +typedef struct _GtkThemeEngineClass GtkThemeEngineClass; -struct _GtkThemeEnginePrivate { - GtkThemeEngine engine; +struct _GtkThemeEngine +{ + GTypeModule parent_instance; GModule *library; - void *name; - void (*init) (GtkThemeEngine *); + void (*init) (GTypeModule *); void (*exit) (void); + GtkRcStyle *(*create_rc_style) (); + + gchar *name; +}; - guint refcount; +struct _GtkThemeEngineClass +{ + GTypeModuleClass parent_class; }; static GHashTable *engine_hash = NULL; -GtkThemeEngine* -gtk_theme_engine_get (gchar *name) +static gboolean +gtk_theme_engine_load (GTypeModule *module) { - GtkThemeEnginePrivate *result; + GtkThemeEngine *engine = GTK_THEME_ENGINE (module); - if (!engine_hash) - engine_hash = g_hash_table_new (g_str_hash, g_str_equal); - - /* get the library name for the theme */ + gchar *engine_path; + + engine_path = gtk_rc_find_module_in_path (engine->name); - result = g_hash_table_lookup (engine_hash, name); - - if (!result) + if (!engine_path) { - gchar fullname[1024]; - gchar *engine_path; - GModule *library; - - g_snprintf (fullname, 1024, "lib%s.so", name); - engine_path = gtk_rc_find_module_in_path (fullname); - - if (!engine_path) - { - g_warning ("Unable to locate loadable module in module_path: \"%s\",", - fullname); - - return NULL; - } - - /* load the lib */ - - printf ("Loading Theme %s\n", engine_path); + g_warning (_("Unable to locate theme engine in module_path: \"%s\","), + engine->name); + return FALSE; + } + + /* load the lib */ + + GTK_NOTE (MISC, g_message ("Loading Theme %s\n", engine_path)); - library = g_module_open (engine_path, 0); - g_free(engine_path); - if (!library) - g_error(g_module_error()); - else - { - result = g_new (GtkThemeEnginePrivate, 1); - - result->refcount = 1; - result->name = g_strdup (name); - result->library = library; - - /* extract symbols from the lib */ - if (!g_module_symbol (library, "theme_init", - (gpointer *)&result->init) || - !g_module_symbol (library, "theme_exit", - (gpointer *)&result->exit)) - { - g_error (g_module_error()); - g_free (result); - return NULL; - } - - /* call the theme's init (theme_init) function to let it */ - /* setup anything it needs to set up. */ - result->init((GtkThemeEngine *)result); - - g_hash_table_insert (engine_hash, result->name, result); - } + engine->library = g_module_open (engine_path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL); + g_free(engine_path); + if (!engine->library) + { + g_warning (g_module_error()); + return FALSE; } - else - result->refcount++; + + /* extract symbols from the lib */ + if (!g_module_symbol (engine->library, "theme_init", + (gpointer *)&engine->init) || + !g_module_symbol (engine->library, "theme_exit", + (gpointer *)&engine->exit) || + !g_module_symbol (engine->library, "theme_create_rc_style", + (gpointer *)&engine->create_rc_style)) + { + g_warning (g_module_error()); + g_module_close (engine->library); + + return FALSE; + } + + /* call the theme's init (theme_init) function to let it */ + /* setup anything it needs to set up. */ + engine->init (module); - return (GtkThemeEngine *)result; + return TRUE; } -void -gtk_theme_engine_ref (GtkThemeEngine *engine) +static void +gtk_theme_engine_unload (GTypeModule *module) { - g_return_if_fail (engine != NULL); - - ((GtkThemeEnginePrivate *)engine)->refcount++; + GtkThemeEngine *engine = GTK_THEME_ENGINE (module); + + engine->exit(); + + g_module_close (engine->library); + engine->library = NULL; + + engine->init = NULL; + engine->exit = NULL; + engine->create_rc_style = NULL; } -void -gtk_theme_engine_unref (GtkThemeEngine *engine) +static void +gtk_theme_engine_class_init (GtkThemeEngineClass *class) { - GtkThemeEnginePrivate *private; + GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS (class); - g_return_if_fail (engine != NULL); + module_class->load = gtk_theme_engine_load; + module_class->unload = gtk_theme_engine_unload; +} - private = (GtkThemeEnginePrivate *)engine; - private->refcount--; +GType +gtk_theme_engine_get_type (void) +{ + static GType theme_engine_type = 0; - if (private->refcount == 0) + if (!theme_engine_type) { - g_hash_table_remove (engine_hash, private->name); - - g_module_close (private->library); - g_free (private->name); - g_free (private); + const GTypeInfo theme_engine_info = { + sizeof (GtkThemeEngineClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gtk_theme_engine_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GtkThemeEngine), + 0, /* n_preallocs */ + NULL, /* instance_init */ + }; + + theme_engine_type = + g_type_register_static (G_TYPE_TYPE_MODULE, I_("GtkThemeEngine"), + &theme_engine_info, 0); + } + + return theme_engine_type; +} + +GtkThemeEngine* +gtk_theme_engine_get (const gchar *name) +{ + GtkThemeEngine *result; + + if (!engine_hash) + engine_hash = g_hash_table_new (g_str_hash, g_str_equal); + + /* get the library name for the theme + */ + result = g_hash_table_lookup (engine_hash, name); + + if (!result) + { + result = g_object_new (GTK_TYPE_THEME_ENGINE, NULL); + g_type_module_set_name (G_TYPE_MODULE (result), name); + result->name = g_strdup (name); + + g_hash_table_insert (engine_hash, result->name, result); } + + if (!g_type_module_use (G_TYPE_MODULE (result))) + return NULL; + + return result; } + +GtkRcStyle * +gtk_theme_engine_create_rc_style (GtkThemeEngine *engine) +{ + g_return_val_if_fail (engine != NULL, NULL); + + return engine->create_rc_style (); +} + +#define __GTK_THEMES_C__ +#include "gtkaliasdef.c"