~cairo-dock-team/cairo-dock-plug-ins/experimental

« back to all changes in this revision

Viewing changes to Toons/src/applet-theme.c

  • Committer: fabounet
  • Date: 2009-04-05 00:40:29 UTC
  • Revision ID: svn-v4:620951bb-bb42-0410-82c3-830e739ed170:trunk/plug-ins:1638
ajout de l'applet Toons, qui vient concurrencer Cairo-Penguin dans le créneau des applets indispensables :o) 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************************************
 
2
 
 
3
This file is a part of the cairo-dock program, 
 
4
released under the terms of the GNU General Public License.
 
5
 
 
6
Written by Fabrice Rey (for any bug report, please mail me to fabounet@users.berlios.de)
 
7
 
 
8
******************************************************************************/
 
9
 
 
10
#include <stdlib.h>
 
11
#include <string.h>
 
12
 
 
13
#include "applet-struct.h"
 
14
#include "applet-theme.h"
 
15
 
 
16
#define _print_error(erreur) \
 
17
        if (erreur != NULL) {\
 
18
                cd_warning (erreur->message);\
 
19
                g_error_free (erreur);\
 
20
                erreur = NULL; }
 
21
 
 
22
static gchar *group[2] = {"Left eye", "Right eye"};
 
23
 
 
24
gboolean cd_xeyes_load_theme (CairoDockModuleInstance *myApplet)
 
25
{
 
26
        GString *sPath = g_string_new ("");
 
27
        g_string_printf (sPath, "%s/theme.conf", myConfig.cThemePath);
 
28
        g_print ("theme conf : %s\n", sPath->str);
 
29
        
 
30
        GKeyFile *pKeyFile = cairo_dock_open_key_file (sPath->str);
 
31
        g_return_val_if_fail (pKeyFile != NULL, FALSE);
 
32
        GError *erreur = NULL;
 
33
        
 
34
        gboolean bEyeVisible[2] = {FALSE, FALSE};
 
35
        gint iPupilWidth[2], iPupilHeight[2];
 
36
        gint iEyesWidth[2], iEyesHeight[2];
 
37
        gint iXeyes[2], iYeyes[2];
 
38
        gint iXeyelid, iYeyelid;
 
39
        gint iEyelidWidth, iEyelidHeight;
 
40
        gint iXbg, iYbg;
 
41
        gint iToonWidth, iToonHeight;
 
42
        gint iBgWidth, iBgHeight;
 
43
        gchar *cBgImage, *cPupilImage, *cEyelidImage, *cToonImage;
 
44
        
 
45
        cBgImage = g_key_file_get_string (pKeyFile, "Files", "bg image", &erreur);
 
46
        _print_error(erreur);
 
47
        cPupilImage = g_key_file_get_string (pKeyFile, "Files", "pupil image", &erreur);
 
48
        _print_error(erreur);
 
49
        cEyelidImage = g_key_file_get_string (pKeyFile, "Files", "eyelid image", &erreur);
 
50
        _print_error(erreur);
 
51
        cToonImage = g_key_file_get_string (pKeyFile, "Files", "toon image", &erreur);
 
52
        _print_error(erreur);
 
53
        
 
54
        const gchar *cGroupName;
 
55
        int i;
 
56
        for (i = 0; i < 2; i ++)
 
57
        {
 
58
                cGroupName = group[i];
 
59
                if (! g_key_file_has_group (pKeyFile, cGroupName))
 
60
                        continue;
 
61
                
 
62
                bEyeVisible[i] = TRUE;
 
63
                
 
64
                iXeyes[i] = g_key_file_get_integer (pKeyFile, cGroupName, "x center", &erreur);
 
65
                _print_error(erreur);
 
66
                iYeyes[i] = g_key_file_get_integer (pKeyFile, cGroupName, "y center", &erreur);
 
67
                _print_error(erreur);
 
68
                
 
69
                iEyesWidth[i] = g_key_file_get_integer (pKeyFile, cGroupName, "eye width", &erreur);
 
70
                _print_error(erreur);
 
71
                iEyesHeight[i] = g_key_file_get_integer (pKeyFile, cGroupName, "eye height", &erreur);
 
72
                _print_error(erreur);
 
73
                
 
74
                iPupilWidth[i] = g_key_file_get_integer (pKeyFile, cGroupName, "pupil width", &erreur);
 
75
                _print_error(erreur);
 
76
                iPupilHeight[i] = g_key_file_get_integer (pKeyFile, cGroupName, "pupil height", &erreur);
 
77
                _print_error(erreur);
 
78
        }
 
79
        
 
80
        iXeyelid = g_key_file_get_integer (pKeyFile, "Eyelid", "x", &erreur);
 
81
        _print_error(erreur);
 
82
        iYeyelid = g_key_file_get_integer (pKeyFile, "Eyelid", "y", &erreur);
 
83
        _print_error(erreur);
 
84
        iEyelidWidth = g_key_file_get_integer (pKeyFile, "Eyelid", "width", &erreur);
 
85
        _print_error(erreur);
 
86
        iEyelidHeight = g_key_file_get_integer (pKeyFile, "Eyelid", "height", &erreur);
 
87
        _print_error(erreur);
 
88
        
 
89
        iXbg = g_key_file_get_integer (pKeyFile, "Background", "x", &erreur);
 
90
        _print_error(erreur);
 
91
        iYbg = g_key_file_get_integer (pKeyFile, "Background", "y", &erreur);
 
92
        _print_error(erreur);
 
93
        iBgWidth = g_key_file_get_integer (pKeyFile, "Background", "width", &erreur);
 
94
        _print_error(erreur);
 
95
        iBgHeight = g_key_file_get_integer (pKeyFile, "Background", "height", &erreur);
 
96
        _print_error(erreur);
 
97
        
 
98
        int iWidth, iHeight;
 
99
        CD_APPLET_GET_MY_ICON_EXTENT (&iWidth, &iHeight);
 
100
        
 
101
        double fImageWidth, fImageHeight;
 
102
        double fZoomX = 1., fZoomY = 1.;
 
103
        g_string_printf (sPath, "%s/%s", myConfig.cThemePath, cToonImage);
 
104
        myData.pToonSurface = cairo_dock_create_surface_from_image (sPath->str,
 
105
                myDrawContext,
 
106
                1.,
 
107
                iWidth, iHeight,
 
108
                myConfig.iLoadingModifier,
 
109
                &fImageWidth, &fImageHeight,
 
110
                &fZoomX, &fZoomY);
 
111
        myData.iToonWidth = fImageWidth;
 
112
        myData.iToonHeight = fImageHeight;
 
113
        
 
114
        double dx = .5*(iWidth - myData.iToonWidth);  // offset du au 'keep ratio'.
 
115
        double dy = .5*(iHeight - myData.iToonHeight);
 
116
        
 
117
        g_string_printf (sPath, "%s/%s", myConfig.cThemePath, cPupilImage);
 
118
        for (i = 0; i < 2; i ++)
 
119
        {
 
120
                if (bEyeVisible[i])
 
121
                {
 
122
                        myData.pPupilSurface[i] = cairo_dock_create_surface_from_image (sPath->str,
 
123
                                myDrawContext,
 
124
                                1.,
 
125
                                iPupilWidth[i] * fZoomX, iPupilHeight[i] * fZoomY,
 
126
                                myConfig.iLoadingModifier,
 
127
                                &fImageWidth, &fImageHeight,
 
128
                                NULL, NULL);
 
129
                        myData.iPupilWidth[i] = fImageWidth;
 
130
                        myData.iPupilHeight[i] = fImageHeight;
 
131
                        
 
132
                        myData.iXeyes[i] = iXeyes[i] * fZoomX + dx;
 
133
                        myData.iYeyes[i] = iYeyes[i] * fZoomY + dy;
 
134
                        
 
135
                        myData.iEyesWidth[i] = iEyesWidth[i] * fZoomX;
 
136
                        myData.iEyesHeight[i] = iEyesHeight[i] * fZoomY;
 
137
                }
 
138
        }
 
139
        
 
140
        g_string_printf (sPath, "%s/%s", myConfig.cThemePath, cEyelidImage);
 
141
        myData.pEyelidSurface = cairo_dock_create_surface_from_image (sPath->str,
 
142
                myDrawContext,
 
143
                1.,
 
144
                iEyelidWidth * fZoomX, iEyelidHeight * fZoomY,
 
145
                myConfig.iLoadingModifier,
 
146
                &fImageWidth, &fImageHeight,
 
147
                NULL, NULL);
 
148
        g_print ("eyelid : %.2fx%.2f\n", fImageWidth, fImageHeight);
 
149
        myData.iEyelidWidth = fImageWidth;
 
150
        myData.iEyelidHeight = fImageHeight;
 
151
        myData.iXeyelid = iXeyelid * fZoomX + dx;
 
152
        myData.iYeyelid = iYeyelid * fZoomY + dy;
 
153
        //g_print ("eyelid : %dx%d ; (%d;%d)\n", myData.iEyelidWidth, myData.iEyelidHeight, myData.iXeyelid, myData.iYeyelid);
 
154
        
 
155
        if (cBgImage != NULL && *cBgImage != '\0')
 
156
        {
 
157
                g_string_printf (sPath, "%s/%s", myConfig.cThemePath, cBgImage);
 
158
                myData.pBgSurface = cairo_dock_create_surface_from_image (sPath->str,
 
159
                        myDrawContext,
 
160
                        1.,
 
161
                        iBgWidth * fZoomX, iBgHeight * fZoomY,
 
162
                        myConfig.iLoadingModifier,
 
163
                        &fImageWidth, &fImageHeight,
 
164
                        NULL, NULL);
 
165
                myData.iBgWidth = fImageWidth;
 
166
                myData.iBgHeight = fImageHeight;
 
167
                myData.iXbg = iXbg * fZoomX + dx;
 
168
                myData.iYbg = iYbg * fZoomY + dy;
 
169
        }
 
170
        
 
171
        if (g_bUseOpenGL)
 
172
        {
 
173
                myData.iBgTexture = cairo_dock_create_texture_from_surface (myData.pBgSurface);
 
174
                if (myData.pPupilSurface[0])
 
175
                        myData.iPupilTexture[0] = cairo_dock_create_texture_from_surface (myData.pPupilSurface[0]);
 
176
                if (myData.pPupilSurface[1])
 
177
                        myData.iPupilTexture[1] = cairo_dock_create_texture_from_surface (myData.pPupilSurface[1]);
 
178
                myData.iEyelidTexture = cairo_dock_create_texture_from_surface (myData.pEyelidSurface);
 
179
                if (myData.pToonSurface)
 
180
                        myData.iToonTexture = cairo_dock_create_texture_from_surface (myData.pToonSurface);
 
181
        }
 
182
        
 
183
        g_free (cBgImage);
 
184
        g_free (cPupilImage);
 
185
        g_free (cEyelidImage);
 
186
        g_free (cToonImage);
 
187
        g_string_free (sPath, TRUE);
 
188
        g_key_file_free (pKeyFile);
 
189
        
 
190
        return TRUE;
 
191
}
 
192
 
 
193
 
 
194
void cd_xeyes_unload_theme (CairoDockModuleInstance *myApplet)
 
195
{
 
196
        int i;
 
197
        for (i = 0; i < 2; i ++)
 
198
        {
 
199
                if (myData.pPupilSurface[i])
 
200
                {
 
201
                        cairo_surface_destroy (myData.pPupilSurface[i]);
 
202
                        myData.pPupilSurface[i] = NULL;
 
203
                }
 
204
                if (myData.iPupilTexture[i])
 
205
                {
 
206
                        _cairo_dock_delete_texture (myData.iPupilTexture[i]);
 
207
                        myData.iPupilTexture[i] = 0;
 
208
                }
 
209
        }
 
210
        
 
211
        if (myData.pBgSurface)
 
212
        {
 
213
                cairo_surface_destroy (myData.pBgSurface);
 
214
                myData.pBgSurface = NULL;
 
215
        }
 
216
        if (myData.iBgTexture)
 
217
        {
 
218
                _cairo_dock_delete_texture (myData.iBgTexture);
 
219
                myData.iBgTexture = 0;
 
220
        }
 
221
        
 
222
        if (myData.pEyelidSurface)
 
223
        {
 
224
                cairo_surface_destroy (myData.pEyelidSurface);
 
225
                myData.pEyelidSurface = NULL;
 
226
        }
 
227
        if (myData.iEyelidTexture)
 
228
        {
 
229
                _cairo_dock_delete_texture (myData.iEyelidTexture);
 
230
                myData.iEyelidTexture = 0;
 
231
        }
 
232
        
 
233
        if (myData.pToonSurface)
 
234
        {
 
235
                cairo_surface_destroy (myData.pToonSurface);
 
236
                myData.pToonSurface = NULL;
 
237
        }
 
238
        if (myData.iToonTexture)
 
239
        {
 
240
                _cairo_dock_delete_texture (myData.iToonTexture);
 
241
                myData.iToonTexture = 0;
 
242
        }
 
243
}