/** * This file is a part of the Cairo-Dock project * * Copyright : (C) see the 'copyright' file. * E-mail : see the 'copyright' file. * * 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 3 * of the License, 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, see . */ #include #include #include #include "gldi-config.h" #include "cairo-dock-log.h" #include "cairo-dock-config.h" // cairo_dock_get_string_key_value #include "cairo-dock-keyfile-utilities.h" // cairo_dock_write_keys_to_file #include "cairo-dock-notifications.h" #include "cairo-dock-opengl-font.h" #define _MANAGER_DEF_ #include "cairo-dock-data-renderer-manager.h" // public (manager, config, data) CairoDataRenderersManager myDataRenderersMgr; // dependancies extern gboolean g_bUseOpenGL; extern gchar *g_cExtrasDirPath; // private static GHashTable *s_hDataRendererTable = NULL; // table des rendus de donnees disponibles. static CairoDockGLFont *s_pFont = NULL; //////////// /// FONT /// //////////// #define _init_data_renderer_font(...) s_pFont = cairo_dock_load_textured_font ("Monospace Bold 12", 0, 184) // on va jusqu'a ΓΈ CairoDockGLFont *cairo_dock_get_default_data_renderer_font (void) { if (s_pFont == NULL) _init_data_renderer_font (); return s_pFont; } void cairo_dock_unload_default_data_renderer_font (void) { cairo_dock_free_gl_font (s_pFont); s_pFont = NULL; } ///////////////////////// /// LIST OF RENDERERS /// ///////////////////////// CairoDockDataRendererRecord *cairo_dock_get_data_renderer_record (const gchar *cRendererName) { if (cRendererName != NULL) return g_hash_table_lookup (s_hDataRendererTable, cRendererName); else return NULL; } void cairo_dock_register_data_renderer (const gchar *cRendererName, CairoDockDataRendererRecord *pRecord) { cd_message ("%s (%s)", __func__, cRendererName); g_hash_table_insert (s_hDataRendererTable, g_strdup (cRendererName), pRecord); } void cairo_dock_remove_data_renderer (const gchar *cRendererName) { g_hash_table_remove (s_hDataRendererTable, cRendererName); } CairoDataRenderer *cairo_dock_new_data_renderer (const gchar *cRendererName) { CairoDockDataRendererRecord *pRecord = cairo_dock_get_data_renderer_record (cRendererName); g_return_val_if_fail (pRecord != NULL && pRecord->iStructSize != 0, NULL); if (g_bUseOpenGL && s_pFont == NULL) { _init_data_renderer_font (); } CairoDataRenderer *pRenderer = g_malloc0 (pRecord->iStructSize); memcpy (&pRenderer->interface, &pRecord->interface, sizeof (CairoDataRendererInterface)); return pRenderer; } ////////////////////// /// LIST OF THEMES /// ////////////////////// GHashTable *cairo_dock_list_available_themes_for_data_renderer (const gchar *cRendererName) { CairoDockDataRendererRecord *pRecord = cairo_dock_get_data_renderer_record (cRendererName); g_return_val_if_fail (pRecord != NULL, NULL); if (pRecord->cThemeDirName == NULL && pRecord->cDistantThemeDirName == NULL) return NULL; gchar *cGaugeShareDir = g_strdup_printf ("%s/%s", GLDI_SHARE_DATA_DIR, pRecord->cThemeDirName); gchar *cGaugeUserDir = g_strdup_printf ("%s/%s", g_cExtrasDirPath, pRecord->cThemeDirName); GHashTable *pGaugeTable = cairo_dock_list_packages (cGaugeShareDir, cGaugeUserDir, pRecord->cDistantThemeDirName, NULL); g_free (cGaugeShareDir); g_free (cGaugeUserDir); return pGaugeTable; } gchar *cairo_dock_get_data_renderer_theme_path (const gchar *cRendererName, const gchar *cThemeName, CairoDockPackageType iType) // utile pour DBus aussi. { CairoDockDataRendererRecord *pRecord = cairo_dock_get_data_renderer_record (cRendererName); g_return_val_if_fail (pRecord != NULL, NULL); if (pRecord->cThemeDirName == NULL && pRecord->cDistantThemeDirName == NULL) return NULL; const gchar *cGaugeShareDir = g_strdup_printf (GLDI_SHARE_DATA_DIR"/%s", pRecord->cThemeDirName); gchar *cGaugeUserDir = g_strdup_printf ("%s/%s", g_cExtrasDirPath, pRecord->cThemeDirName); gchar *cThemePath = cairo_dock_get_package_path (cThemeName, cGaugeShareDir, cGaugeUserDir, pRecord->cDistantThemeDirName, iType); g_free (cGaugeUserDir); return cThemePath; } gchar *cairo_dock_get_package_path_for_data_renderer (const gchar *cRendererName, const gchar *cAppletConfFilePath, GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, const gchar *cDefaultThemeName) { CairoDockDataRendererRecord *pRecord = cairo_dock_get_data_renderer_record (cRendererName); g_return_val_if_fail (pRecord != NULL, NULL); gchar *cChosenThemeName = cairo_dock_get_string_key_value (pKeyFile, cGroupName, cKeyName, bFlushConfFileNeeded, cDefaultThemeName, NULL, NULL); if (cChosenThemeName == NULL) cChosenThemeName = g_strdup (pRecord->cDefaultTheme); CairoDockPackageType iType = cairo_dock_extract_package_type_from_name (cChosenThemeName); gchar *cThemePath = cairo_dock_get_data_renderer_theme_path (cRendererName, cChosenThemeName, iType); if (cThemePath == NULL) // theme introuvable. cThemePath = g_strdup_printf (GLDI_SHARE_DATA_DIR"/%s/%s", pRecord->cThemeDirName, pRecord->cDefaultTheme); if (iType != CAIRO_DOCK_ANY_PACKAGE) { g_key_file_set_string (pKeyFile, cGroupName, cKeyName, cChosenThemeName); cairo_dock_write_keys_to_file (pKeyFile, cAppletConfFilePath); } cd_debug ("DataRenderer's theme : %s", cThemePath); g_free (cChosenThemeName); return cThemePath; } ////////////// /// UNLOAD /// ////////////// static void unload (void) { cairo_dock_free_gl_font (s_pFont); s_pFont = NULL; } //////////// /// INIT /// //////////// static void init (void) { s_hDataRendererTable = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); } /////////////// /// MANAGER /// /////////////// void gldi_register_data_renderers_manager (void) { // Manager memset (&myDataRenderersMgr, 0, sizeof (CairoDataRenderersManager)); myDataRenderersMgr.mgr.cModuleName = "Data-Renderers"; myDataRenderersMgr.mgr.init = init; myDataRenderersMgr.mgr.load = NULL; // loaded on demand myDataRenderersMgr.mgr.unload = unload; myDataRenderersMgr.mgr.reload = (GldiManagerReloadFunc)NULL; myDataRenderersMgr.mgr.get_config = (GldiManagerGetConfigFunc)NULL; myDataRenderersMgr.mgr.reset_config = (GldiManagerResetConfigFunc)NULL; // Config myDataRenderersMgr.mgr.pConfig = (GldiManagerConfigPtr)NULL; myDataRenderersMgr.mgr.iSizeOfConfig = 0; // data myDataRenderersMgr.mgr.pData = (GldiManagerDataPtr)NULL; myDataRenderersMgr.mgr.iSizeOfData = 0; // signals cairo_dock_install_notifications_on_object (&myDataRenderersMgr, NB_NOTIFICATIONS_DATA_RENDERERS); // register gldi_register_manager (GLDI_MANAGER(&myDataRenderersMgr)); }