Mercurial > mplayer.hg
annotate gui/win32/skinload.c @ 36891:c5ee0fc2ec75
Print an information on deprecated skin config file entries.
There are several skin config file entries which oughtn't be used
any more, although they are still being supported.
Inform the user about these without being too annoying.
author | ib |
---|---|
date | Mon, 10 Mar 2014 17:15:24 +0000 |
parents | 8f38fea0b91b |
children | f50427ad9ff6 |
rev | line source |
---|---|
23077 | 1 /* |
23079 | 2 * MPlayer GUI for Win32 |
3 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de> | |
4 * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com> | |
5 * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it> | |
6 * | |
7 * This file is part of MPlayer. | |
8 * | |
9 * MPlayer is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * MPlayer is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
26457 | 19 * You should have received a copy of the GNU General Public License along |
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
23079 | 22 */ |
23077 | 23 |
33761 | 24 #include <string.h> |
23077 | 25 #include <stdlib.h> |
23796 | 26 #include <stdio.h> |
23077 | 27 #include <inttypes.h> |
28 #include <windows.h> | |
29 | |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
30 #include "mp_msg.h" |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
31 #include "help_mp.h" |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
32 #include "cpudetect.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
33 #include "libswscale/swscale.h" |
32833
c4891d10ddbb
Adjust #include paths after the merge of libavcore into libavutil in FFmpeg.
diego
parents:
32537
diff
changeset
|
34 #include "libavutil/imgutils.h" |
23077 | 35 #include "gui.h" |
33770 | 36 #include "gui/util/mem.h" |
33046 | 37 #include "gui/util/bitmap.h" |
23077 | 38 |
39 #define MAX_LINESIZE 256 | |
40 | |
41 typedef struct | |
42 { | |
43 int msg; | |
44 char *name; | |
45 } evName; | |
46 | |
47 static const evName evNames[] = | |
48 { | |
49 { evNone, "evNone" }, | |
50 { evPlay, "evPlay" }, | |
51 { evStop, "evStop" }, | |
52 { evPause, "evPause" }, | |
53 { evPrev, "evPrev" }, | |
54 { evNext, "evNext" }, | |
55 { evLoad, "evLoad" }, | |
34317 | 56 { evLoadPlay, "evLoadPlay" }, |
57 { evLoadAudioFile, "evLoadAudioFile" }, | |
58 { evLoadSubtitle, "evLoadSubtitle" }, | |
59 { evDropSubtitle, "evDropSubtitle" }, | |
34321
daebf766dea6
Cosmetic: Synchronize evPlaylist event and message names.
ib
parents:
34320
diff
changeset
|
60 { evPlaylist, "evPlaylist" }, |
34387 | 61 { evPlayCD, "evPlayCD" }, |
34317 | 62 { evPlayVCD, "evPlayVCD" }, |
63 { evPlayDVD, "evPlayDVD" }, | |
34324 | 64 { evLoadURL, "evSetURL" }, // legacy |
65 { evLoadURL, "evLoadURL" }, | |
36429 | 66 { evPlayTV, "evPlayTV" }, |
34317 | 67 { evPlaySwitchToPause, "evPlaySwitchToPause" }, |
68 { evPauseSwitchToPlay, "evPauseSwitchToPlay" }, | |
23077 | 69 { evBackward10sec, "evBackward10sec" }, |
70 { evForward10sec, "evForward10sec" }, | |
71 { evBackward1min, "evBackward1min" }, | |
72 { evForward1min, "evForward1min" }, | |
73 { evBackward10min, "evBackward10min" }, | |
74 { evForward10min, "evForward10min" }, | |
34317 | 75 { evSetMoviePosition, "evSetMoviePosition" }, |
34320 | 76 { evHalfSize, "evHalfSize" }, |
34317 | 77 { evDoubleSize, "evDoubleSize" }, |
78 { evFullScreen, "evFullScreen" }, | |
79 { evNormalSize, "evNormalSize" }, | |
34322 | 80 { evSetAspect, "evSetAspect" }, |
23077 | 81 { evIncVolume, "evIncVolume" }, |
82 { evDecVolume, "evDecVolume" }, | |
34317 | 83 { evSetVolume, "evSetVolume" }, |
23077 | 84 { evMute, "evMute" }, |
34317 | 85 { evSetBalance, "evSetBalance" }, |
86 { evEqualizer, "evEqualizer" }, | |
87 { evAbout, "evAbout" }, | |
88 { evPreferences, "evPreferences" }, | |
89 { evSkinBrowser, "evSkinBrowser" }, | |
34458 | 90 { evMenu, "evMenu" }, |
34317 | 91 { evIconify, "evIconify" }, |
34326 | 92 { evExit, "evExit" } |
23077 | 93 }; |
94 | |
95 static const int evBoxs = sizeof(evNames) / sizeof(evName); | |
96 | |
36890 | 97 static int linenumber; |
98 | |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
99 /** |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
100 * @brief Print a legacy information on an entry. |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
101 * |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
102 * @param old identifier (and deprecated entry) |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
103 * @param data pointer to additional data necessary for checking and |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
104 * to print the information on @a old |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
105 */ |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
106 static void skin_legacy (const char *old, const char *data) |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
107 { |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
108 const char *p; |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
109 |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
110 if (strcmp(old, "fontid") == 0) |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
111 { |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
112 p = strchr(data, ','); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
113 |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
114 if (p) mp_msg(MSGT_GPLAYER, MSGL_INFO, MSGTR_GUI_MSG_SkinLegacy, linenumber, p, "font = fontfile"); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
115 } |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
116 else if (strcmp(old, "$l") == 0) |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
117 { |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
118 p = strstr(old, data); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
119 |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
120 if (p && (p == data || p[-1] != '$')) mp_msg(MSGT_GPLAYER, MSGL_INFO, MSGTR_GUI_MSG_SkinLegacy, linenumber, old, "$p"); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
121 } |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
122 else if (strcmp(old, "evSetURL") == 0 && strcmp(data, old) == 0) |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
123 mp_msg(MSGT_GPLAYER, MSGL_INFO, MSGTR_GUI_MSG_SkinLegacy, linenumber, old, "evLoadURL"); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
124 else if (strcmp(old, "sub") == 0) |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
125 mp_msg(MSGT_GPLAYER, MSGL_INFO, MSGTR_GUI_MSG_SkinLegacy, linenumber, old, data); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
126 } |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
127 |
23077 | 128 static char *geteventname(int event) |
129 { | |
130 int i; | |
131 for(i=0; i<evBoxs; i++) | |
132 if(evNames[i].msg == event) | |
133 return evNames[i].name; | |
134 return NULL; | |
135 } | |
136 | |
137 /* reads a complete image as is into image buffer */ | |
33784 | 138 static image *pngRead(skin_t *skin, const char *fname) |
23077 | 139 { |
34996
ebcc17a3c165
Fix compiler warnings (comparison between signed and unsigned).
ib
parents:
34697
diff
changeset
|
140 unsigned int i; |
33555 | 141 guiImage bmp; |
23077 | 142 image *bf; |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
143 char *filename = NULL; |
23077 | 144 FILE *fp; |
145 | |
146 if(!stricmp(fname, "NULL")) return 0; | |
147 | |
148 /* find filename in order file file.png */ | |
149 if(!(fp = fopen(fname, "rb"))) | |
150 { | |
151 filename = calloc(1, strlen(skin->skindir) + strlen(fname) + 6); | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33784
diff
changeset
|
152 sprintf(filename, "%s/%s.png", skin->skindir, fname); |
23077 | 153 if(!(fp = fopen(filename, "rb"))) |
154 { | |
155 mp_msg(MSGT_GPLAYER, MSGL_ERR, "[png] cannot find image %s\n", filename); | |
156 free(filename); | |
157 return 0; | |
158 } | |
159 } | |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
160 fclose(fp); |
23077 | 161 |
162 for (i=0; i < skin->imagecount; i++) | |
163 if(!strcmp(fname, skin->images[i]->name)) | |
164 { | |
34450 | 165 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[png] skinfile %s already exists\n", fname); |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
166 free(filename); |
23077 | 167 return skin->images[i]; |
168 } | |
169 (skin->imagecount)++; | |
170 skin->images = realloc(skin->images, sizeof(image *) * skin->imagecount); | |
171 bf = skin->images[(skin->imagecount) - 1] = calloc(1, sizeof(image)); | |
172 bf->name = strdup(fname); | |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
173 bpRead(filename ? filename : fname, &bmp); |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
174 free(filename); |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
175 bf->width = bmp.Width; bf->height = bmp.Height; |
23077 | 176 |
177 bf->size = bf->width * bf->height * skin->desktopbpp / 8; | |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
178 if (skin->desktopbpp == 32) |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
179 bf->data = bmp.Image; |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
180 else { |
32028
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
181 const uint8_t *src[4] = { bmp.Image, NULL, NULL, NULL}; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
182 int src_stride[4] = { 4 * bmp.Width, 0, 0, 0 }; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
183 uint8_t *dst[4] = { NULL, NULL, NULL, NULL }; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
184 int dst_stride[4]; |
35707
4ba6b8d3197e
Replace PixelFormat and PIX_FMT_FOO by their AV_-prefixed counterparts.
diego
parents:
35501
diff
changeset
|
185 enum AVPixelFormat out_pix_fmt = PIX_FMT_NONE; |
32028
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
186 struct SwsContext *sws; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
187 if (skin->desktopbpp == 16) out_pix_fmt = PIX_FMT_RGB555; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
188 else if (skin->desktopbpp == 24) out_pix_fmt = PIX_FMT_RGB24; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
189 av_image_fill_linesizes(dst_stride, out_pix_fmt, bmp.Width); |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
190 sws = sws_getContext(bmp.Width, bmp.Height, PIX_FMT_RGB32, |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
191 bmp.Width, bmp.Height, out_pix_fmt, |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
192 SWS_POINT, NULL, NULL, NULL); |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
193 bf->data = malloc(bf->size); |
32028
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
194 dst[0] = bf->data; |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
195 sws_scale(sws, src, src_stride, 0, bmp.Height, dst, dst_stride); |
9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
ramiro
parents:
26457
diff
changeset
|
196 sws_freeContext(sws); |
23266
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
197 free(bmp.Image); |
6cd7f1c23d90
Reuse linux code for reading png images for windows Gui,
reimar
parents:
23091
diff
changeset
|
198 } |
23077 | 199 return bf; |
200 } | |
201 | |
202 /* frees all skin images */ | |
203 static void freeimages(skin_t *skin) | |
204 { | |
205 unsigned int i; | |
206 for (i=0; i<skin->imagecount; i++) | |
207 { | |
208 if(skin->images && skin->images[i]) | |
209 { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32028
diff
changeset
|
210 free(skin->images[i]->data); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32028
diff
changeset
|
211 free(skin->images[i]->name); |
23077 | 212 free(skin->images[i]); |
213 } | |
214 } | |
215 free(skin->images); | |
216 } | |
217 | |
33621
18b47d32b0d0
win32 gui: Mark debug function only used within the file as static.
diego
parents:
33620
diff
changeset
|
218 static void dumpwidgets(skin_t *skin) |
23077 | 219 { |
220 unsigned int i; | |
221 for (i=0; i<skin->widgetcount; i++) | |
34450 | 222 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "widget %p id %i\n", skin->widgets[i], skin->widgets[i]->id); |
23077 | 223 } |
224 | |
225 static int counttonextchar(const char *s1, char c) | |
226 { | |
227 unsigned int i; | |
228 for (i=0; i<strlen(s1); i++) | |
229 if(s1[i] == c) return i; | |
230 return 0; | |
231 } | |
232 | |
233 static char *findnextstring(char *temp, const char *desc, int *base) | |
234 { | |
235 int len = counttonextchar(*base + desc, ','); | |
236 memset(temp, 0, strlen(desc) + 1); | |
237 if(!len) len = strlen(desc); | |
238 memcpy(temp, *base + desc, len); | |
239 *base += (len+1); | |
240 return temp; | |
241 } | |
242 | |
243 static void freeskin(skin_t *skin) | |
244 { | |
245 unsigned int i; | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32028
diff
changeset
|
246 |
33770 | 247 nfree(skin->skindir); |
23077 | 248 |
249 for (i=1; i<=skin->lastusedid; i++) | |
250 skin->removewidget(skin, i); | |
251 | |
33770 | 252 nfree(skin->widgets); |
23077 | 253 |
254 freeimages(skin); | |
255 for(i=0; i<skin->windowcount; i++) | |
256 { | |
33770 | 257 nfree(skin->windows[i]->name); |
23077 | 258 free(skin->windows[i]); |
259 } | |
260 | |
33770 | 261 nfree(skin->windows); |
23077 | 262 |
263 for (i=0; i<skin->fontcount; i++) | |
264 { | |
265 unsigned int x; | |
266 | |
33770 | 267 nfree(skin->fonts[i]->name); |
23077 | 268 |
269 for (x=0; x<skin->fonts[i]->charcount; x++) | |
33770 | 270 nfree(skin->fonts[i]->chars[x]); |
271 | |
272 nfree(skin->fonts[i]->chars); | |
23077 | 273 |
33770 | 274 nfree(skin->fonts[i]); |
23077 | 275 } |
33770 | 276 nfree(skin->fonts); |
34450 | 277 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN FREE] skin freed\n"); |
33770 | 278 nfree(skin); |
23077 | 279 } |
280 | |
281 static void removewidget(skin_t *skin, int id) | |
282 { | |
283 unsigned int i; | |
284 unsigned int pos=0; | |
285 widget **temp = calloc(skin->widgetcount - 1, sizeof(widget *)); | |
286 | |
287 for (i=0; i<skin->widgetcount; i++) | |
288 { | |
289 if(skin->widgets[i]->id == id) | |
290 { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32028
diff
changeset
|
291 free(skin->widgets[i]->label); |
33770 | 292 nfree(skin->widgets[i]); |
23077 | 293 } |
294 else | |
295 { | |
296 temp[pos] = skin->widgets[i]; | |
297 pos++; | |
298 } | |
299 } | |
300 if (pos != i) | |
301 { | |
302 (skin->widgetcount)--; | |
303 free(skin->widgets); | |
304 skin->widgets = temp; | |
34450 | 305 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "removed widget %i\n", id); |
23077 | 306 return; |
307 } | |
308 free(temp); | |
309 mp_msg(MSGT_GPLAYER, MSGL_ERR, "widget %i not found\n", id); | |
310 } | |
311 | |
312 static void addwidget(skin_t *skin, window *win, const char *desc) | |
313 { | |
314 widget *mywidget; | |
315 char *temp = calloc(1, strlen(desc) + 1); | |
316 (skin->widgetcount)++; | |
317 (skin->lastusedid)++; | |
318 skin->widgets = realloc(skin->widgets, sizeof(widget *) * skin->widgetcount); | |
319 mywidget = skin->widgets[(skin->widgetcount) - 1] = calloc(1, sizeof(widget)); | |
320 mywidget->id = skin->lastusedid; | |
321 mywidget->window = win->type; | |
322 /* parse and fill widget specific info */ | |
323 if(!strncmp(desc, "base", 4)) | |
324 { | |
325 int base = counttonextchar(desc, '=') + 1; | |
326 mywidget->type = tyBase; | |
327 mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); | |
328 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
329 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
330 mywidget->wwidth = mywidget->width = atoi(findnextstring(temp, desc, &base)); | |
331 mywidget->wheight = mywidget->height = atoi(findnextstring(temp, desc, &base)); | |
332 win->base = mywidget; | |
34450 | 333 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [BASE] %s %i %i %i %i\n", |
23077 | 334 (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, |
335 mywidget->x, mywidget->y, mywidget->width, mywidget->height); | |
336 } | |
337 else if(!strncmp(desc, "button", 6)) | |
338 { | |
339 int base = counttonextchar(desc, '=') + 1; | |
340 int i; | |
341 mywidget->type = tyButton; | |
342 mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); | |
343 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
344 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
345 mywidget->wwidth = mywidget->width = atoi(findnextstring(temp, desc, &base)); | |
346 mywidget->wheight = mywidget->height = atoi(findnextstring(temp, desc, &base)); | |
347 findnextstring(temp, desc, &base); | |
348 | |
349 /* Assign corresponding event to the widget */ | |
350 mywidget->msg = evNone; | |
351 for (i=0; i<evBoxs; i++) | |
352 { | |
353 if(!strcmp(temp, evNames[i].name)) | |
354 { | |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
355 // legacy |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
356 skin_legacy("evSetURL", temp); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
357 |
23077 | 358 mywidget->msg = evNames[i].msg; |
359 break; | |
360 } | |
361 } | |
362 | |
34450 | 363 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [BUTTON] %s %i %i %i %i msg %i\n", |
23077 | 364 (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, |
365 mywidget->x, mywidget->y, mywidget->width, mywidget->height, mywidget->msg); | |
366 } | |
367 else if(!strncmp(desc, "hpotmeter", 9) || !strncmp(desc, "vpotmeter", 9)) | |
368 { | |
369 int base = counttonextchar(desc, '=') + 1; | |
370 int i; | |
371 /* hpotmeter = button, bwidth, bheight, phases, numphases, default, X, Y, width, height, message */ | |
372 if(!strncmp(desc, "hpotmeter", 9)) mywidget->type = tyHpotmeter; | |
373 else mywidget->type = tyVpotmeter; | |
374 mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); | |
375 mywidget->width = atoi(findnextstring(temp, desc, &base)); | |
376 mywidget->height = atoi(findnextstring(temp, desc, &base)); | |
377 mywidget->bitmap[1] = pngRead(skin, findnextstring(temp, desc, &base)); | |
378 mywidget->phases = atoi(findnextstring(temp, desc, &base)); | |
379 mywidget->value = atof(findnextstring(temp, desc, &base)); | |
380 mywidget->x = mywidget->wx = atoi(findnextstring(temp, desc, &base)); | |
381 mywidget->y = mywidget->wy = atoi(findnextstring(temp, desc, &base)); | |
382 mywidget->wwidth = atoi(findnextstring(temp, desc, &base)); | |
383 mywidget->wheight = atoi(findnextstring(temp, desc, &base)); | |
384 findnextstring(temp, desc, &base); | |
385 mywidget->msg = evNone; | |
386 for (i=0; i<evBoxs; i++) | |
387 { | |
388 if(!strcmp(temp, evNames[i].name)) | |
389 { | |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
390 // legacy |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
391 skin_legacy("evSetURL", temp); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
392 |
23077 | 393 mywidget->msg = evNames[i].msg; |
394 break; | |
395 } | |
396 } | |
34450 | 397 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] %s %s %i %i %s %i %f %i %i %i %i msg %i\n", |
23077 | 398 (mywidget->type == tyHpotmeter) ? "[HPOTMETER]" : "[VPOTMETER]", |
399 (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, | |
400 mywidget->width, mywidget->height, | |
401 (mywidget->bitmap[1]) ? mywidget->bitmap[1]->name : NULL, | |
402 mywidget->phases, mywidget->value, | |
403 mywidget->wx, mywidget->wy, mywidget->wwidth, mywidget->wwidth, | |
404 mywidget->msg); | |
405 } | |
406 else if(!strncmp(desc, "potmeter", 8)) | |
407 { | |
408 int base = counttonextchar(desc, '=') + 1; | |
409 int i; | |
410 /* potmeter = phases, numphases, default, X, Y, width, height, message */ | |
411 mywidget->type = tyPotmeter; | |
412 mywidget->bitmap[0] = pngRead(skin, findnextstring(temp, desc, &base)); | |
413 mywidget->phases = atoi(findnextstring(temp, desc, &base)); | |
414 mywidget->value = atof(findnextstring(temp, desc, &base)); | |
415 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
416 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
417 mywidget->wwidth = mywidget->width = atoi(findnextstring(temp, desc, &base)); | |
418 mywidget->wheight = mywidget->height = atoi(findnextstring(temp, desc, &base)); | |
419 findnextstring(temp, desc, &base); | |
420 mywidget->msg = evNone; | |
421 for (i=0; i<evBoxs; i++) | |
422 { | |
423 if(!strcmp(temp, evNames[i].name)) | |
424 { | |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
425 // legacy |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
426 skin_legacy("evSetURL", temp); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
427 |
23077 | 428 mywidget->msg=evNames[i].msg; |
429 break; | |
430 } | |
431 } | |
34450 | 432 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [POTMETER] %s %i %i %i %f %i %i msg %i\n", |
23077 | 433 (mywidget->bitmap[0]) ? mywidget->bitmap[0]->name : NULL, |
434 mywidget->width, mywidget->height, | |
435 mywidget->phases, mywidget->value, | |
436 mywidget->x, mywidget->y, | |
437 mywidget->msg); | |
438 } | |
439 else if(!strncmp(desc, "menu", 4)) | |
440 { | |
441 int base = counttonextchar(desc, '=') + 1; | |
442 int i; | |
443 mywidget->type = tyMenu; | |
444 mywidget->wx=atoi(findnextstring(temp, desc, &base)); | |
445 mywidget->x=0; | |
446 mywidget->wy=mywidget->y=atoi(findnextstring(temp, desc, &base)); | |
447 mywidget->wwidth=mywidget->width=atoi(findnextstring(temp, desc, &base)); | |
448 mywidget->wheight=mywidget->height=atoi(findnextstring(temp, desc, &base)); | |
449 findnextstring(temp, desc, &base); | |
450 mywidget->msg = evNone; | |
451 for (i=0; i<evBoxs; i++) | |
452 { | |
453 if(!strcmp(temp, evNames[i].name)) | |
454 { | |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
455 // legacy |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
456 skin_legacy("evSetURL", temp); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
457 |
23077 | 458 mywidget->msg = evNames[i].msg; |
459 break; | |
460 } | |
461 } | |
34450 | 462 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [MENU] %i %i %i %i msg %i\n", |
23077 | 463 mywidget->x, mywidget->y, mywidget->width, mywidget->height, mywidget->msg); |
464 } | |
465 else if(!strncmp(desc, "selected", 8)) | |
466 { | |
36840 | 467 win->base->bitmap[1] = pngRead(skin, desc + 9); |
34450 | 468 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [BASE] added image %s\n", win->base->bitmap[1]->name); |
23077 | 469 } |
470 else if(!strncmp(desc, "slabel",6)) | |
471 { | |
472 int base = counttonextchar(desc, '=') + 1; | |
473 unsigned int i; | |
474 mywidget->type = tySlabel; | |
475 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
476 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
477 findnextstring(temp, desc, &base); | |
478 mywidget->font = NULL; | |
479 for (i=0; i<skin->fontcount; i++) | |
480 { | |
481 if(!strcmp(temp, skin->fonts[i]->name)) | |
482 { | |
483 mywidget->font = skin->fonts[i]; | |
484 break; | |
485 } | |
486 } | |
487 mywidget->label = strdup(findnextstring(temp, desc, &base)); | |
34450 | 488 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [SLABEL] %i %i %s %s\n", |
23077 | 489 mywidget->x, mywidget->y, mywidget->font->name, mywidget->label); |
490 } | |
491 else if(!strncmp(desc, "dlabel", 6)) | |
492 { | |
493 int base = counttonextchar(desc, '=') + 1; | |
494 unsigned int i; | |
495 mywidget->type = tyDlabel; | |
496 mywidget->wx = mywidget->x = atoi(findnextstring(temp, desc, &base)); | |
497 mywidget->wy = mywidget->y = atoi(findnextstring(temp, desc, &base)); | |
498 mywidget->length = atoi(findnextstring(temp, desc, &base)); | |
499 mywidget->align = atoi(findnextstring(temp, desc, &base)); | |
500 findnextstring(temp, desc, &base); | |
501 mywidget->font = NULL; | |
502 for (i=0; i<skin->fontcount; i++) | |
503 { | |
504 if(!strcmp(temp, skin->fonts[i]->name)) | |
505 { | |
506 mywidget->font=skin->fonts[i]; | |
507 break; | |
508 } | |
509 } | |
510 mywidget->label=strdup(findnextstring(temp, desc, &base)); | |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
511 |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
512 // legacy |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
513 skin_legacy("$l", mywidget->label); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
514 |
34450 | 515 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [ITEM] [DLABEL] %i %i %i %i %s \"%s\"\n", |
23077 | 516 mywidget->x, mywidget->y, mywidget->length, mywidget->align, mywidget->font->name, mywidget->label); |
517 } | |
518 free(temp); | |
519 } | |
520 | |
521 static void loadfonts(skin_t* skin) | |
522 { | |
523 unsigned int x; | |
524 for (x=0; x<skin->fontcount; x++) | |
525 { | |
526 FILE *fp; | |
527 char *filename; | |
528 char *tmp = calloc(1, MAX_LINESIZE); | |
529 char *desc = calloc(1, MAX_LINESIZE); | |
530 filename = calloc(1, strlen(skin->skindir) + strlen(skin->fonts[x]->name) + 6); | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33784
diff
changeset
|
531 sprintf(filename, "%s/%s.fnt", skin->skindir, skin->fonts[x]->name); |
23077 | 532 if(!(fp = fopen(filename,"rb"))) |
533 { | |
534 mp_msg(MSGT_GPLAYER, MSGL_ERR, "[FONT LOAD] Font not found \"%s\"\n", skin->fonts[x]->name); | |
33783 | 535 free(tmp); |
536 free(desc); | |
537 free(filename); | |
23077 | 538 return; |
539 } | |
540 while(!feof(fp)) | |
541 { | |
542 int pos = 0; | |
543 unsigned int i; | |
544 fgets(tmp, MAX_LINESIZE, fp); | |
545 memset(desc, 0, MAX_LINESIZE); | |
546 for (i=0; i<strlen(tmp); i++) | |
547 { | |
548 /* remove spaces and linebreaks */ | |
549 if((tmp[i] == ' ') || (tmp[i] == '\n') || (tmp[i] == '\r')) continue; | |
550 /* remove comments */ | |
551 if((tmp[i] == ';') && ((i < 1) || (tmp[i-1] != '\"'))) | |
552 { | |
34450 | 553 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[FONT LOAD] Comment: %s", tmp + i + 1); |
23077 | 554 break; |
555 } | |
556 desc[pos] = tmp[i]; | |
557 pos++; | |
558 } | |
559 if(!strlen(desc)) continue; | |
560 /* now we have "readable" output -> parse it */ | |
561 if(!strncmp(desc, "image", 5)) | |
562 { | |
563 skin->fonts[x]->image = pngRead(skin, desc + 6); | |
34450 | 564 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[FONT] [IMAGE] \"%s\"\n", desc + 6); |
23077 | 565 } |
566 else | |
567 { | |
568 int base = 4; | |
569 if(*desc != '"') break; | |
570 if(*(desc + 1) == 0) break; | |
571 (skin->fonts[x]->charcount)++; | |
572 skin->fonts[x]->chars = realloc(skin->fonts[x]->chars, sizeof(char_t *) *skin->fonts[x]->charcount); | |
573 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]=calloc(1, sizeof(char_t)); | |
574 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->c = ((*(desc + 1) == '"') && (*(desc + 2) != '"')) ? ' ': *(desc + 1); | |
575 if((*(desc + 1) == '"') && (*(desc + 2) != '"')) base = 3; | |
576 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->x = atoi(findnextstring(tmp, desc, &base)); | |
577 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->y = atoi(findnextstring(tmp, desc, &base)); | |
578 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->width = atoi(findnextstring(tmp, desc, &base)); | |
579 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->height = atoi(findnextstring(tmp, desc, &base)); | |
34450 | 580 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[FONT] [CHAR] %c %i %i %i %i\n", |
23077 | 581 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->c, |
582 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->x, | |
583 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->y, | |
584 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->width, | |
585 skin->fonts[x]->chars[skin->fonts[x]->charcount - 1]->height); | |
586 } | |
587 } | |
588 free(desc); | |
589 free(filename); | |
590 free(tmp); | |
591 fclose(fp); | |
592 } | |
593 } | |
594 | |
595 skin_t* loadskin(char* skindir, int desktopbpp) | |
596 { | |
597 FILE *fp; | |
35501 | 598 int reachedendofwindow = FALSE; |
23077 | 599 skin_t *skin = calloc(1, sizeof(skin_t)); |
600 char *filename; | |
601 char *tmp = calloc(1, MAX_LINESIZE); | |
602 char *desc = calloc(1, MAX_LINESIZE); | |
603 window* mywindow = NULL; | |
604 | |
36890 | 605 linenumber = 0; |
606 | |
23077 | 607 /* setup funcs */ |
608 skin->freeskin = freeskin; | |
609 skin->pngRead = pngRead; | |
610 skin->addwidget = addwidget; | |
611 skin->removewidget = removewidget; | |
612 skin->geteventname = geteventname; | |
613 skin->desktopbpp = desktopbpp; | |
614 skin->skindir = strdup(skindir); | |
615 | |
616 filename = calloc(1, strlen(skin->skindir) + strlen("skin") + 2); | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33784
diff
changeset
|
617 sprintf(filename, "%s/skin", skin->skindir); |
23077 | 618 if(!(fp = fopen(filename, "rb"))) |
619 { | |
620 mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[SKIN LOAD] Skin \"%s\" not found\n", skindir); | |
621 skin->freeskin(skin); | |
33783 | 622 free(tmp); |
623 free(desc); | |
624 free(filename); | |
23077 | 625 return NULL; |
626 } | |
627 | |
628 while(!feof(fp)) | |
629 { | |
630 int pos = 0; | |
631 unsigned int i; | |
35501 | 632 int insidequote = FALSE; |
23077 | 633 fgets(tmp, MAX_LINESIZE, fp); |
634 linenumber++; | |
635 memset(desc, 0, MAX_LINESIZE); | |
636 for (i=0; i<strlen(tmp); i++) | |
637 { | |
35501 | 638 if((tmp[i] == '"') && !insidequote) { insidequote=TRUE; continue; } |
639 else if((tmp[i] == '"') && insidequote) { insidequote=FALSE ; continue; } | |
23077 | 640 /* remove spaces and linebreaks */ |
641 if((!insidequote && (tmp[i] == ' ')) || (tmp[i] == '\n') || (tmp[i] == '\r')) continue; | |
642 /* remove comments */ | |
643 else if(tmp[i] == ';') | |
644 { | |
34450 | 645 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN LOAD] Comment: %s", tmp + i + 1); |
23077 | 646 break; |
647 } | |
648 desc[pos] = tmp[i]; | |
649 pos++; | |
650 } | |
651 | |
652 if(!strlen(desc)) continue; | |
653 /* now we have "readable" output -> parse it */ | |
654 /* parse window specific info */ | |
655 if(!strncmp(desc, "section", 7)) | |
656 { | |
34450 | 657 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [SECTION] \"%s\"\n", desc + 8); |
23077 | 658 } |
659 else if(!strncmp(desc, "window", 6)) | |
660 { | |
34450 | 661 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [WINDOW] \"%s\"\n", desc + 7); |
35501 | 662 reachedendofwindow = FALSE; |
23077 | 663 (skin->windowcount)++; |
664 skin->windows = realloc(skin->windows, sizeof(window *) * skin->windowcount); | |
665 mywindow = skin->windows[(skin->windowcount) - 1] = calloc(1, sizeof(window)); | |
666 mywindow->name = strdup(desc + 7); | |
667 if(!strncmp(desc + 7, "main", 4)) mywindow->type = wiMain; | |
36885 | 668 else if(!strncmp(desc+7, "video", 5) || /* legacy */ !strncmp(desc+7, "sub", 3)) |
23077 | 669 { |
34697 | 670 mywindow->type = wiVideo; |
35501 | 671 mywindow->decoration = TRUE; |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
672 // legacy |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
673 if (desc[7] == 's') skin_legacy("sub", "video"); |
23077 | 674 } |
675 else if(!strncmp(desc + 7, "menu", 4)) mywindow->type = wiMenu; | |
676 else if(!strncmp(desc + 7, "playbar", 7)) mywindow->type = wiPlaybar; | |
677 else mp_msg(MSGT_GPLAYER, MSGL_V, "[SKIN] warning found unknown windowtype"); | |
678 } | |
679 else if(!strncmp(desc, "decoration", 10) && !strncmp(desc + 11, "enable", 6)) | |
680 { | |
35501 | 681 mywindow->decoration = TRUE; |
34450 | 682 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [DECORATION] enabled decoration for window \"%s\"\n", mywindow->name); |
23077 | 683 } |
684 else if(!strncmp(desc, "background", 10)) | |
685 { | |
686 int base = counttonextchar(desc, '=') + 1; | |
687 char temp[MAX_LINESIZE]; | |
688 mywindow->backgroundcolor[0] = atoi(findnextstring(temp, desc, &base)); | |
689 mywindow->backgroundcolor[1] = atoi(findnextstring(temp, desc, &base)); | |
690 mywindow->backgroundcolor[2] = atoi(findnextstring(temp, desc, &base)); | |
34450 | 691 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [BACKGROUND] window \"%s\" has backgroundcolor (%i,%i,%i)\n", mywindow->name, |
23077 | 692 mywindow->backgroundcolor[0], |
693 mywindow->backgroundcolor[1], | |
694 mywindow->backgroundcolor[2]); | |
695 } | |
696 else if(!strncmp(desc, "end", 3)) | |
697 { | |
698 if(reachedendofwindow) | |
699 { | |
34450 | 700 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [END] of section\n"); |
23077 | 701 } |
702 else | |
703 { | |
35501 | 704 reachedendofwindow = TRUE; |
34450 | 705 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [END] of window \"%s\"\n", mywindow->name); |
23077 | 706 } |
707 } | |
708 else if(!strncmp(desc, "font", 4)) | |
709 { | |
710 int id = 0; | |
711 char temp[MAX_LINESIZE]; | |
36888 | 712 int base = counttonextchar(desc, '=') + 1; |
713 findnextstring(temp, desc, &base); | |
714 id = skin->fontcount; | |
715 (skin->fontcount)++; | |
716 skin->fonts = realloc(skin->fonts, sizeof(font_t *) * skin->fontcount); | |
717 skin->fonts[id]=calloc(1, sizeof(font_t)); | |
718 skin->fonts[id]->name = strdup(temp); | |
36891
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
719 |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
720 // legacy |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
721 skin_legacy("fontid", desc); |
c5ee0fc2ec75
Print an information on deprecated skin config file entries.
ib
parents:
36890
diff
changeset
|
722 |
36887 | 723 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[SKIN] [FONT] name \"%s\"\n", skin->fonts[id]->name); |
23077 | 724 } |
725 else | |
726 skin->addwidget(skin, mywindow, desc); | |
727 } | |
728 | |
729 free(desc); | |
730 free(filename); | |
731 free(tmp); | |
732 fclose(fp); | |
733 loadfonts(skin); | |
734 mp_msg(MSGT_GPLAYER, MSGL_V, "[SKIN LOAD] loaded skin \"%s\"\n", skin->skindir); | |
34450 | 735 dumpwidgets(skin); |
23077 | 736 return skin; |
737 } |