2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
23
#include "cairo-dock-draw.h"
24
#include "cairo-dock-icons.h"
25
#include "cairo-dock-callbacks.h"
26
#include "cairo-dock-keyfile-utilities.h"
27
#include "cairo-dock-dock-factory.h"
28
#include "cairo-dock-log.h"
29
#include "cairo-dock-gui-factory.h"
30
#include "cairo-dock-internal-views.h"
31
#include "cairo-dock-internal-desklets.h"
32
#include "cairo-dock-internal-system.h"
33
#include "cairo-dock-animations.h"
34
#include "cairo-dock-dialogs.h"
35
#include "cairo-dock-container.h"
36
#include "cairo-dock-renderer-manager.h"
38
extern gboolean g_bUseOpenGL;
40
static GHashTable *s_hRendererTable = NULL; // table des rendus de dock.
41
static GHashTable *s_hDeskletRendererTable = NULL; // table des rendus des desklets.
42
static GHashTable *s_hDialogRendererTable = NULL; // table des rendus des dialogues.
43
static GHashTable *s_hDeskletDecorationsTable = NULL; // table des decorations des desklets.
44
static GHashTable *s_hAnimationsTable = NULL; // table des animations disponibles.
45
static GHashTable *s_hDialogDecoratorTable = NULL; // table des decorateurs de dialogues disponibles.
46
static GHashTable *s_hDataRendererTable = NULL; // table des rendus de donnees disponibles.
49
CairoDockRenderer *cairo_dock_get_renderer (const gchar *cRendererName, gboolean bForMainDock)
51
//g_print ("%s (%s, %d)\n", __func__, cRendererName, bForMainDock);
52
CairoDockRenderer *pRenderer = NULL;
53
if (cRendererName != NULL)
54
pRenderer = g_hash_table_lookup (s_hRendererTable, cRendererName);
56
if (pRenderer == NULL)
58
const gchar *cDefaultRendererName = (bForMainDock ? myViews.cMainDockDefaultRendererName : myViews.cSubDockDefaultRendererName);
59
//g_print (" cDefaultRendererName : %s\n", cDefaultRendererName);
60
if (cDefaultRendererName != NULL)
61
pRenderer = g_hash_table_lookup (s_hRendererTable, cDefaultRendererName);
64
if (pRenderer == NULL)
65
pRenderer = g_hash_table_lookup (s_hRendererTable, CAIRO_DOCK_DEFAULT_RENDERER_NAME);
70
void cairo_dock_register_renderer (const gchar *cRendererName, CairoDockRenderer *pRenderer)
72
cd_message ("%s (%s)", __func__, cRendererName);
73
g_hash_table_insert (s_hRendererTable, g_strdup (cRendererName), pRenderer);
76
void cairo_dock_remove_renderer (const gchar *cRendererName)
78
g_hash_table_remove (s_hRendererTable, cRendererName);
82
CairoDeskletRenderer *cairo_dock_get_desklet_renderer (const gchar *cRendererName)
84
if (cRendererName != NULL)
85
return g_hash_table_lookup (s_hDeskletRendererTable, cRendererName);
90
void cairo_dock_register_desklet_renderer (const gchar *cRendererName, CairoDeskletRenderer *pRenderer)
92
cd_message ("%s (%s)", __func__, cRendererName);
93
g_hash_table_insert (s_hDeskletRendererTable, g_strdup (cRendererName), pRenderer);
96
void cairo_dock_remove_desklet_renderer (const gchar *cRendererName)
98
g_hash_table_remove (s_hDeskletRendererTable, cRendererName);
101
void cairo_dock_predefine_desklet_renderer_config (CairoDeskletRenderer *pRenderer, const gchar *cConfigName, CairoDeskletRendererConfigPtr pConfig)
103
g_return_if_fail (cConfigName != NULL && pConfig != NULL);
104
CairoDeskletRendererPreDefinedConfig *pPreDefinedConfig = g_new (CairoDeskletRendererPreDefinedConfig, 1);
105
pPreDefinedConfig->cName = g_strdup (cConfigName);
106
pPreDefinedConfig->pConfig = pConfig;
107
pRenderer->pPreDefinedConfigList = g_list_prepend (pRenderer->pPreDefinedConfigList, pPreDefinedConfig);
110
CairoDeskletRendererConfigPtr cairo_dock_get_desklet_renderer_predefined_config (const gchar *cRendererName, const gchar *cConfigName)
112
CairoDeskletRenderer *pRenderer = cairo_dock_get_desklet_renderer (cRendererName);
113
g_return_val_if_fail (pRenderer != NULL && cConfigName != NULL, NULL);
116
CairoDeskletRendererPreDefinedConfig *pPreDefinedConfig;
117
for (c = pRenderer->pPreDefinedConfigList; c != NULL; c = c->next)
119
pPreDefinedConfig = c->data;
120
if (strcmp (pPreDefinedConfig->cName, cConfigName) == 0)
121
return pPreDefinedConfig->pConfig;
127
CairoDialogRenderer *cairo_dock_get_dialog_renderer (const gchar *cRendererName)
129
if (cRendererName != NULL)
130
return g_hash_table_lookup (s_hDialogRendererTable, cRendererName);
135
void cairo_dock_register_dialog_renderer (const gchar *cRendererName, CairoDialogRenderer *pRenderer)
137
cd_message ("%s (%s)", __func__, cRendererName);
138
g_hash_table_insert (s_hDialogRendererTable, g_strdup (cRendererName), pRenderer);
141
void cairo_dock_remove_dialog_renderer (const gchar *cRendererName)
143
g_hash_table_remove (s_hDialogRendererTable, cRendererName);
147
CairoDeskletDecoration *cairo_dock_get_desklet_decoration (const gchar *cDecorationName)
149
if (cDecorationName != NULL)
150
return g_hash_table_lookup (s_hDeskletDecorationsTable, cDecorationName);
151
else if (myDesklets.cDeskletDecorationsName != NULL)
152
return g_hash_table_lookup (s_hDeskletDecorationsTable, myDesklets.cDeskletDecorationsName);
157
void cairo_dock_register_desklet_decoration (const gchar *cDecorationName, CairoDeskletDecoration *pDecoration)
159
cd_message ("%s (%s)", __func__, cDecorationName);
160
g_hash_table_insert (s_hDeskletDecorationsTable, g_strdup (cDecorationName), pDecoration);
163
void cairo_dock_remove_desklet_decoration (const gchar *cDecorationName)
165
g_hash_table_remove (s_hDeskletDecorationsTable, cDecorationName);
169
CairoDataRendererNewFunc cairo_dock_get_data_renderer_entry_point (const gchar *cRendererName)
171
if (cRendererName != NULL)
172
return g_hash_table_lookup (s_hDataRendererTable, cRendererName);
177
void cairo_dock_register_data_renderer_entry_point (const gchar *cRendererName, CairoDataRendererNewFunc pFunc)
179
cd_message ("%s (%s)", __func__, cRendererName);
180
g_hash_table_insert (s_hDataRendererTable, g_strdup (cRendererName), pFunc);
183
void cairo_dock_remove_data_renderer_entry_point (const gchar *cRendererName)
185
g_hash_table_remove (s_hDataRendererTable, cRendererName);
188
void cairo_dock_initialize_renderer_manager (void)
190
g_return_if_fail (s_hRendererTable == NULL);
193
s_hRendererTable = g_hash_table_new_full (g_str_hash,
198
s_hDeskletRendererTable = g_hash_table_new_full (g_str_hash,
203
s_hDialogRendererTable = g_hash_table_new_full (g_str_hash,
208
s_hDeskletDecorationsTable = g_hash_table_new_full (g_str_hash,
211
(GFreeFunc) cairo_dock_free_desklet_decoration);
213
s_hAnimationsTable = g_hash_table_new_full (g_str_hash,
216
(GFreeFunc) cairo_dock_free_animation_record);
218
s_hDialogDecoratorTable = g_hash_table_new_full (g_str_hash,
223
s_hDataRendererTable = g_hash_table_new_full (g_str_hash,
230
void cairo_dock_set_renderer (CairoDock *pDock, const gchar *cRendererName)
232
g_return_if_fail (pDock != NULL);
233
cd_message ("%s (%x:%s)", __func__, pDock, cRendererName);
235
if (pDock->pRenderer && pDock->pRenderer->free_data)
237
pDock->pRenderer->free_data (pDock);
238
pDock->pRendererData = NULL;
240
pDock->pRenderer = cairo_dock_get_renderer (cRendererName, (pDock->iRefCount == 0));
242
pDock->fMagnitudeMax = 1.;
243
pDock->container.bUseReflect = pDock->pRenderer->bUseReflect;
244
gtk_widget_set_double_buffered (pDock->container.pWidget, ! (g_bUseOpenGL && pDock->pRenderer->render_opengl != NULL));
246
int iAnimationDeltaT = pDock->container.iAnimationDeltaT;
247
pDock->container.iAnimationDeltaT = (g_bUseOpenGL && pDock->pRenderer->render_opengl != NULL ? mySystem.iGLAnimationDeltaT : mySystem.iCairoAnimationDeltaT);
248
if (pDock->container.iAnimationDeltaT == 0)
249
pDock->container.iAnimationDeltaT = 30; // le main dock est cree avant meme qu'on ait recuperer la valeur en conf. Lorsqu'une vue lui sera attribuee, la bonne valeur sera renseignee, en attendant on met un truc non nul.
250
if (iAnimationDeltaT != pDock->container.iAnimationDeltaT && pDock->container.iSidGLAnimation != 0)
252
g_source_remove (pDock->container.iSidGLAnimation);
253
pDock->container.iSidGLAnimation = 0;
254
cairo_dock_launch_animation (CAIRO_CONTAINER (pDock));
256
if (/**cRendererName != NULL && */pDock->cRendererName != cRendererName) // NULL ecrase le nom de l'ancienne vue depuis le 12/11/2009
258
g_free (pDock->cRendererName);
259
pDock->cRendererName = g_strdup (cRendererName);
263
void cairo_dock_set_default_renderer (CairoDock *pDock)
265
g_return_if_fail (pDock != NULL);
266
cairo_dock_set_renderer (pDock, (pDock->cRendererName != NULL ? pDock->cRendererName : NULL)); // NULL => laissera le champ cRendererName nul plutot que de mettre le nom de la vue par defaut.
270
void cairo_dock_set_desklet_renderer (CairoDesklet *pDesklet, CairoDeskletRenderer *pRenderer, cairo_t *pSourceContext, gboolean bLoadIcons, CairoDeskletRendererConfigPtr pConfig)
272
g_return_if_fail (pDesklet != NULL);
274
if (pDesklet->pRenderer != NULL && pDesklet->pRenderer->free_data != NULL) // meme si pDesklet->pRendererData == NULL.
276
pDesklet->pRenderer->free_data (pDesklet);
277
pDesklet->pRendererData = NULL;
280
pDesklet->pRenderer = pRenderer;
281
gtk_widget_set_double_buffered (pDesklet->container.pWidget, ! (g_bUseOpenGL && pRenderer != NULL && pRenderer->render_opengl != NULL));
282
pDesklet->container.iAnimationDeltaT = (g_bUseOpenGL && pRenderer != NULL && pRenderer->render_opengl != NULL ? mySystem.iGLAnimationDeltaT : mySystem.iCairoAnimationDeltaT);
284
if (pRenderer != NULL)
286
cairo_t *pCairoContext = (pSourceContext != NULL ? pSourceContext : cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDesklet)));
288
if (pRenderer->configure != NULL)
289
pDesklet->pRendererData = pRenderer->configure (pDesklet, pCairoContext, pConfig);
291
if (bLoadIcons && pRenderer->load_icons != NULL)
292
pRenderer->load_icons (pDesklet, pCairoContext);
294
if (pRenderer->load_data != NULL)
295
pRenderer->load_data (pDesklet, pCairoContext);
297
if (pSourceContext == NULL)
298
cairo_destroy (pCairoContext);
302
void cairo_dock_set_desklet_renderer_by_name (CairoDesklet *pDesklet, const gchar *cRendererName, cairo_t *pSourceContext, gboolean bLoadIcons, CairoDeskletRendererConfigPtr pConfig)
304
cd_message ("%s (%s, %d)", __func__, cRendererName, bLoadIcons);
305
CairoDeskletRenderer *pRenderer = (cRendererName != NULL ? cairo_dock_get_desklet_renderer (cRendererName) : NULL);
307
cairo_dock_set_desklet_renderer (pDesklet, pRenderer, pSourceContext, bLoadIcons, pConfig);
311
void cairo_dock_set_dialog_renderer (CairoDialog *pDialog, CairoDialogRenderer *pRenderer, cairo_t *pSourceContext, CairoDialogRendererConfigPtr pConfig)
313
g_return_if_fail (pDialog != NULL);
315
if (pDialog->pRenderer != NULL && pDialog->pRenderer->free_data != NULL)
317
pDialog->pRenderer->free_data (pDialog);
318
pDialog->pRendererData = NULL;
321
pDialog->pRenderer = pRenderer;
323
if (pRenderer != NULL)
325
cairo_t *pCairoContext = (pSourceContext != NULL ? pSourceContext : cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDialog)));
327
if (pRenderer->configure != NULL)
328
pDialog->pRendererData = pRenderer->configure (pDialog, pCairoContext, pConfig);
330
if (pSourceContext == NULL)
331
cairo_destroy (pCairoContext);
335
void cairo_dock_set_dialog_renderer_by_name (CairoDialog *pDialog, const gchar *cRendererName, cairo_t *pSourceContext, CairoDialogRendererConfigPtr pConfig)
337
cd_message ("%s (%s)", __func__, cRendererName);
338
CairoDialogRenderer *pRenderer = (cRendererName != NULL ? cairo_dock_get_dialog_renderer (cRendererName) : NULL);
340
cairo_dock_set_dialog_renderer (pDialog, pRenderer, pSourceContext, pConfig);
344
void cairo_dock_render_desklet_with_new_data (CairoDesklet *pDesklet, CairoDeskletRendererDataPtr pNewData)
346
if (pDesklet->pRenderer != NULL && pDesklet->pRenderer->update != NULL)
347
pDesklet->pRenderer->update (pDesklet, pNewData);
349
gtk_widget_queue_draw (pDesklet->container.pWidget);
352
void cairo_dock_render_dialog_with_new_data (CairoDialog *pDialog, CairoDialogRendererDataPtr pNewData)
354
if (pDialog->pRenderer != NULL && pDialog->pRenderer->update != NULL)
355
pDialog->pRenderer->update (pDialog, pNewData);
357
if (pDialog->pInteractiveWidget != NULL)
358
cairo_dock_damage_interactive_widget_dialog (pDialog);
360
gtk_widget_queue_draw (pDialog->container.pWidget);
364
CairoDialogDecorator *cairo_dock_get_dialog_decorator (const gchar *cDecoratorName)
366
CairoDialogDecorator *pDecorator = NULL;
367
if (cDecoratorName != NULL)
368
pDecorator = g_hash_table_lookup (s_hDialogDecoratorTable, cDecoratorName);
372
void cairo_dock_register_dialog_decorator (const gchar *cDecoratorName, CairoDialogDecorator *pDecorator)
374
cd_message ("%s (%s)", __func__, cDecoratorName);
375
g_hash_table_insert (s_hDialogDecoratorTable, g_strdup (cDecoratorName), pDecorator);
378
void cairo_dock_remove_dialog_decorator (const gchar *cDecoratorName)
380
g_hash_table_remove (s_hDialogDecoratorTable, cDecoratorName);
383
void cairo_dock_set_dialog_decorator (CairoDialog *pDialog, CairoDialogDecorator *pDecorator)
385
pDialog->pDecorator = pDecorator;
387
void cairo_dock_set_dialog_decorator_by_name (CairoDialog *pDialog, const gchar *cDecoratorName)
389
cd_message ("%s (%s)", __func__, cDecoratorName);
390
CairoDialogDecorator *pDecorator = cairo_dock_get_dialog_decorator (cDecoratorName);
392
cairo_dock_set_dialog_decorator (pDialog, pDecorator);
396
void cairo_dock_update_renderer_list_for_gui (void)
398
cairo_dock_build_renderer_list_for_gui (s_hRendererTable);
401
void cairo_dock_update_desklet_decorations_list_for_gui (void)
403
cairo_dock_build_desklet_decorations_list_for_gui (s_hDeskletDecorationsTable);
406
void cairo_dock_update_desklet_decorations_list_for_applet_gui (void)
408
cairo_dock_build_desklet_decorations_list_for_applet_gui (s_hDeskletDecorationsTable);
411
void cairo_dock_update_animations_list_for_gui (void)
413
cairo_dock_build_animations_list_for_gui (s_hAnimationsTable);
416
void cairo_dock_update_dialog_decorator_list_for_gui (void)
418
cairo_dock_build_dialog_decorator_list_for_gui (s_hDialogDecoratorTable);
422
static int iNbAnimation = 0;
423
int cairo_dock_register_animation (const gchar *cAnimation, const gchar *cDisplayedName)
425
cd_message ("%s (%s)", __func__, cAnimation);
427
CairoDockAnimationRecord *pRecord = g_new (CairoDockAnimationRecord, 1);
428
pRecord->id = iNbAnimation;
429
pRecord->cDisplayedName = cDisplayedName;
430
g_hash_table_insert (s_hAnimationsTable, g_strdup (cAnimation), pRecord);
434
void cairo_dock_free_animation_record (CairoDockAnimationRecord *pRecord)
439
int cairo_dock_get_animation_id (const gchar *cAnimation)
441
g_return_val_if_fail (cAnimation != NULL, 0);
442
CairoDockAnimationRecord *pRecord = g_hash_table_lookup (s_hAnimationsTable, cAnimation);
443
return (pRecord ? pRecord->id : 0);
446
const gchar *cairo_dock_get_animation_displayed_name (const gchar *cAnimation)
448
g_return_val_if_fail (cAnimation != NULL, NULL);
449
CairoDockAnimationRecord *pRecord = g_hash_table_lookup (s_hAnimationsTable, cAnimation);
450
return (pRecord ? pRecord->cDisplayedName : NULL);
453
void cairo_dock_unregister_animation (const gchar *cAnimation)
455
g_hash_table_remove (s_hAnimationsTable, cAnimation);