source: titan/titan/skinselector.h @ 38490

Last change on this file since 38490 was 38463, checked in by obi, 8 years ago

fix some textboxes

File size: 7.1 KB
Line 
1/*
2 * =======================================================================
3 *
4 *       Filename:  skinselector.h
5 *
6 *    Description: 
7 *
8 *        Version:  1.0
9 *        Created:  17.06.2011 15:16:11
10 *       Revision:  none
11 *       Compiler:  gcc
12 *
13 *         Author:  dvboxer
14 *        Company:  AAF
15 *
16 * =======================================================================
17 */
18
19
20#ifndef SKINSELECTOR_H
21#define SKINSELECTOR_H
22
23
24void screenskinselect(void)
25{
26        const int max_list_size=50;
27        char *tmpstr = NULL, *token, *saveptr, *cur_skin=getconfig("skinfile",NULL), *skinpaths;
28
29        if(getconfig("skins", NULL) == NULL)
30                skinpaths=strdup("/var/swap/usr/local/share/titan/skin;/mnt/swapextension/usr/local/share/titan/skin;/var/usr/local/share/titan/skin");
31        else
32                skinpaths=strdup(getconfig("skins", NULL));
33
34        struct ListType
35        {
36                char *name;
37                char *displayname;
38                dev_t dev_id;
39                ino_t inode;
40                int is_cur;
41        } list[max_list_size];
42
43        int i = 0, j, skinchanged = 0;
44        DIR *dp;
45        struct dirent *ep;
46
47        if(cur_skin == NULL)
48        {
49                err("skin not defined. This should not happen");
50        }
51        struct stat cur_skin_stat;
52        stat(cur_skin, &cur_skin_stat);
53
54        //make sure that current skin is listed
55        skinpaths=(char *)realloc(skinpaths, strlen(skinpaths) + strlen(cur_skin) + 3);
56        strcat(strcat(skinpaths, ";"), cur_skin);
57        j = strlen(cur_skin);
58        if(j > 8) j = 9;
59        skinpaths[strlen(skinpaths) - j] = '\0';
60
61        token = strtok_r(skinpaths, ";" , &saveptr);
62        while(token != NULL)
63        {
64                dp = opendir(token);
65                if(dp != NULL)
66                {
67                        while((ep = readdir(dp)))
68                        {
69                                if(!strcmp(ep->d_name, "..")) continue; //skip search in parent dir
70                                char *dn = strdup(ep->d_name);
71                                if(dn == NULL) continue;
72                                list[i].name=(char*)malloc(strlen(token) + strlen(dn) + 20);
73                                list[i].displayname=strdup(dn);
74                                if(list[i].name == NULL || list[i].displayname == NULL )
75                                {
76                                        free(list[i].displayname);
77                                        free(list[i].name);
78                                        free(dn);
79                                        break;
80                                }
81                                if(!strcmp(ep->d_name, "."))
82                                        sprintf(list[i].name, "%s/skin.xml", token);
83                                else
84                                        sprintf(list[i].name, "%s/%s/skin.xml", token, dn);
85                                free(dn);
86
87                                struct stat ss;
88                                if(stat(list[i].name, &ss)) //file doesn't exist
89                                {
90                                        free(list[i].displayname);
91                                        free(list[i].name);
92                                        continue;
93                                }
94                                list[i].dev_id = ss.st_dev;
95                                list[i].inode = ss.st_ino;
96
97                                for(j = 0; j < i; ++j)
98                                {
99                                        if(list[j].dev_id == list[i].dev_id && list[j].inode == list[i].inode) // same file already registered
100                                        {
101                                                j = -1; break;
102                                        }
103                                }
104                                if(j == -1) //file already seen
105                                {
106                                        free(list[i].displayname);
107                                        free(list[i].name);
108                                        continue;
109                                }
110                                list[i].is_cur = (list[i].dev_id == cur_skin_stat.st_dev && list[i].inode == cur_skin_stat.st_ino);
111
112                                if(++i == max_list_size) break;
113                        }
114                        if(i == max_list_size) break;
115                        closedir(dp);
116                }
117                else
118                {
119                        err("reading skin directory %s", "x");
120                }
121       
122                token=strtok_r(NULL, ";", &saveptr);
123        }
124
125
126        int rcret = 0;
127        struct skin* screen = getscreen("skinselect");
128        struct skin* listbox = getscreennode(screen, "listbox");
129        struct skin* png = getscreennode(screen, "png");
130        struct skin* tmp=NULL;
131
132        for(j = 0; j < i; ++j)
133        {
134                tmp = addlistbox(screen, listbox, tmp, 1);
135                if(tmp != NULL)
136                {
137                        if(ostrcmp(list[j].displayname, ".") == 0)
138                                changetext(tmp, _("unknown")); //skin.xml is in main dir
139                        else
140                        {
141                                if(ostrstr(list[j].name, "/swap/") != NULL)
142                                {
143                                        char* tmpname = NULL;
144                                        tmpname = ostrcat("", list[j].displayname, 0, 0);
145                                        tmpname = ostrcat(tmpname,  " (swap)", 1, 0);
146                                        changetext(tmp, tmpname);
147                                        free(tmpname),tmpname = NULL;
148                                }
149                                else
150                                        changetext(tmp, list[j].displayname);
151                        }
152                        tmp->del = 1;
153                        tmp->handle = (char *)(list + j);
154                        if(list[j].is_cur)
155                        {
156                                listbox->aktline = j + 1;
157                                char *pf = strdup(list[j].name);
158                                strncpy(pf + strlen(pf)-8, "prev.png", 8);
159                                changepic(png, pf);
160                                free(pf);
161                        }
162                }
163                else
164                {
165                        err("tmp is NULL");
166                }
167        }
168       
169        listbox->aktpage = -1;
170       
171        drawscreen(screen, 0, 0);
172        addscreenrc(screen, listbox);
173
174        while (1)
175        {
176                addscreenrc(screen, tmp);
177                rcret = waitrc(screen, 0, 0);
178                tmp = listbox->select;
179                if(rcret == getrcconfigint("rcexit", NULL))  //user pressed exit so no change
180                {
181                        debug(100, "no change of skin");
182                        break;
183                }
184                else if(rcret == getrcconfigint("rcok",NULL)) //ok means "use that skin"
185                {
186                        struct ListType *selection=((struct ListType *)listbox->select->handle);
187                        if(selection != NULL)
188                        {
189                                debug(10,"skin file selected: %s", selection->name);
190                                if(selection->is_cur) break; //same file chosen again
191                               
192                                //write old skinconfig on change and set write flag to 0
193                                //so new skinconfig is not overwritten with old
194                                if(status.writeskinconfig == 1)
195                                {
196                                        writeskinconfig(getconfig("skinconfig", NULL));
197                                        status.writeskinconfig = 0;
198                                }
199                               
200                                struct splitstr* ret1 = NULL;
201                                int count1 = 0;
202                                char* tmpstr1 = NULL;
203                                //char* cmd = NULL; not used, one warning less
204                                tmpstr1 = ostrcat(selection->name, NULL, 0, 0);
205                                ret1 = strsplit(tmpstr1, " ", &count1);
206                                tmpstr = ostrcat((&ret1[0])->part, NULL, 0, 0);
207                                free(ret1), ret1 = NULL;
208                                free(tmpstr1), tmpstr1 = NULL;
209                               
210                                tmpstr = dirname(tmpstr);
211                                tmpstr = ostrcat(tmpstr, "/skinconfig", 1, 0);
212
213                                debug(10,"skin tmpstr: %s", tmpstr);
214                                debug(10,"skin skinpath: %s", getconfig("skinpath", NULL));
215
216                                if(file_exist(tmpstr))
217                                {
218                                        if(ostrcmp(tmpstr, "/var/usr/local/share/titan/skin/default/skinconfig") == 0)                         
219                                        {
220                                                debug(10,"found default skin use=/mnt/config/skinconfig");
221                                                addconfig("skinconfig", "/mnt/config/skinconfig");
222                                        }
223                                        else
224                                        {
225                                                debug(10,"found external skin use=%s", tmpstr);
226                                                addconfig("skinconfig", tmpstr);
227                                        }
228                                }
229                                else
230                                {
231                                        textbox(_("Message"), _("No skinconfig found in skin.\nCan't change to selected skin."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1000, 200, 0, 0);
232                                        drawscreen(screen, 0, 0);
233                                        free(tmpstr); tmpstr = NULL;
234                                        continue;
235                                }
236                                free(tmpstr), tmpstr = NULL;
237                               
238                                addconfig("skinfile", selection->name);
239
240                                tmpstr = ostrcat(selection->name, NULL, 0, 0);
241                                addconfig("skinpath", dirname(tmpstr));
242
243                                debug(10, "-----------------------------------------------------------------");
244                                debug(10, "write: skinpath=%s", getconfig("skinpath", NULL));
245                                debug(10, "write: skinfile=%s", getconfig("skinfile", NULL));
246                                debug(10, "write: skinconfig=%s", getconfig("skinconfig", NULL));
247                                debug(10, "-----------------------------------------------------------------");
248
249                                skinchanged = 1;
250                                free(tmpstr); tmpstr = NULL;
251
252                                break;
253                        }
254                }
255                else if(rcret == getrcconfigint("rcup", NULL) || rcret == getrcconfigint("rcdown", NULL))
256                {
257                        struct ListType *selection = list + listbox->aktline - 1;
258                        char *pf=strdup(selection->name);
259                        strncpy(pf + strlen(pf) - 8, "prev.png", 8);
260                        changepic(png, pf);
261                        free(pf);
262                        drawscreen(screen, 0, 0);
263                }
264        }
265
266        delownerrc(screen);
267        delmarkedscreennodes(screen, 1);
268        clearscreen(screen);
269        --i; for(;i >= 0; --i)
270        {
271                free(list[i].displayname);
272                free(list[i].name);
273        }
274        free(skinpaths);
275        if(skinchanged)
276        {
277                resettvpic();
278                oshutdown(3, 1);
279        }
280}
281
282#endif
283
Note: See TracBrowser for help on using the repository browser.