source: titan/titan/skinselector.h @ 15272

Last change on this file since 15272 was 12501, checked in by obi, 10 years ago

[titan] change all textboxes ok/exit always allowed and change exit/ok to ok/exit

File size: 6.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/skin;/var/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(string_find("/swap/",list[j].name))
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);
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                                tmpstr1 = ostrcat("", selection->name, 0, 0);
204                                ret1 = strsplit(tmpstr1, " ", &count1);
205                                tmpstr = ostrcat((&ret1[0])->part, "", 0, 0);
206                                free(ret1), ret1 = NULL;
207                                free(tmpstr1), tmpstr1 = NULL;
208                               
209                                tmpstr = dirname(tmpstr);
210                                tmpstr = ostrcat(tmpstr, "/skinconfig", 1, 0);
211                                if(file_exist(tmpstr))
212                                {
213                                        addconfig("skinconfig", tmpstr);
214                                        free(tmpstr); tmpstr = NULL;
215                                }
216                                else
217                                {
218                                        textbox(_("Message"), _("No skinconfig found in skin.\nCan't chage to selected skin."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0);
219                                        drawscreen(screen, 0);
220                                        free(tmpstr); tmpstr = NULL;
221                                        continue;
222                                }
223
224                                addconfig("skinfile", selection->name);
225
226                                tmpstr = ostrcat(selection->name, "", 0, 0);
227                                addconfig("skinpath", dirname(tmpstr));
228
229                                skinchanged = 1;
230                                free(tmpstr); tmpstr = NULL;
231
232                                break;
233                        }
234                }
235                else if(rcret == getrcconfigint("rcup", NULL) || rcret == getrcconfigint("rcdown", NULL))
236                {
237                        struct ListType *selection = list + listbox->aktline - 1;
238                        char *pf=strdup(selection->name);
239                        strncpy(pf + strlen(pf) - 8, "prev.png", 8);
240                        changepic(png, pf);
241                        free(pf);
242                        drawscreen(screen,0);
243                }
244        }
245
246        delownerrc(screen);
247        delmarkedscreennodes(screen, 1);
248        clearscreen(screen);
249        --i; for(;i >= 0; --i)
250        {
251                free(list[i].displayname);
252                free(list[i].name);
253        }
254        free(skinpaths);
255        if(skinchanged) oshutdown(3, 1);
256}
257
258#endif
259
Note: See TracBrowser for help on using the repository browser.