[7758] | 1 | /* |
---|
[8626] | 2 | * ======================================================================= |
---|
[7758] | 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 | * |
---|
[8626] | 16 | * ======================================================================= |
---|
[7758] | 17 | */ |
---|
| 18 | |
---|
| 19 | |
---|
| 20 | #ifndef SKINSELECTOR_H |
---|
| 21 | #define SKINSELECTOR_H |
---|
| 22 | |
---|
| 23 | |
---|
| 24 | void screenskinselect(void) |
---|
| 25 | { |
---|
[8626] | 26 | const int max_list_size=50; |
---|
| 27 | char *tmpstr = NULL, *token, *saveptr, *cur_skin=getconfig("skinfile",NULL), *skinpaths; |
---|
[7760] | 28 | |
---|
[8626] | 29 | if(getconfig("skins", NULL) == NULL) |
---|
| 30 | skinpaths=strdup("/var/swap/skin;/var/skin"); |
---|
| 31 | else |
---|
| 32 | skinpaths=strdup(getconfig("skins", NULL)); |
---|
[7760] | 33 | |
---|
[8626] | 34 | struct ListType |
---|
| 35 | { |
---|
| 36 | char *name; |
---|
[9046] | 37 | char *displayname; |
---|
[8626] | 38 | dev_t dev_id; |
---|
| 39 | ino_t inode; |
---|
| 40 | int is_cur; |
---|
| 41 | } list[max_list_size]; |
---|
[7760] | 42 | |
---|
[8626] | 43 | int i = 0, j, skinchanged = 0; |
---|
| 44 | DIR *dp; |
---|
| 45 | struct dirent *ep; |
---|
[7758] | 46 | |
---|
[8626] | 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); |
---|
[7758] | 53 | |
---|
[8626] | 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'; |
---|
[7760] | 60 | |
---|
[8626] | 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); |
---|
[9035] | 73 | list[i].displayname=strdup(dn); |
---|
| 74 | if(list[i].name == NULL || list[i].displayname == NULL ) |
---|
[8626] | 75 | { |
---|
[9606] | 76 | free(list[i].displayname); |
---|
| 77 | free(list[i].name); |
---|
[8626] | 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); |
---|
[7760] | 86 | |
---|
[8626] | 87 | struct stat ss; |
---|
| 88 | if(stat(list[i].name, &ss)) //file doesn't exist |
---|
| 89 | { |
---|
[9046] | 90 | free(list[i].displayname); |
---|
[8626] | 91 | free(list[i].name); |
---|
| 92 | continue; |
---|
| 93 | } |
---|
| 94 | list[i].dev_id = ss.st_dev; |
---|
| 95 | list[i].inode = ss.st_ino; |
---|
[7758] | 96 | |
---|
[8626] | 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 | { |
---|
[9046] | 106 | free(list[i].displayname); |
---|
[8626] | 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); |
---|
[7758] | 111 | |
---|
[8626] | 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 | } |
---|
[7758] | 121 | |
---|
[8626] | 122 | token=strtok_r(NULL, ";", &saveptr); |
---|
| 123 | } |
---|
[7758] | 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"); |
---|
[8626] | 130 | struct skin* tmp=NULL; |
---|
[7758] | 131 | |
---|
[8626] | 132 | for(j = 0; j < i; ++j) |
---|
| 133 | { |
---|
| 134 | tmp = addlistbox(screen, listbox, tmp, 1); |
---|
| 135 | if(tmp != NULL) |
---|
| 136 | { |
---|
[9606] | 137 | if(ostrcmp(list[j].displayname, ".") == 0) |
---|
[10227] | 138 | changetext(tmp, _("unknown")); //skin.xml is in main dir |
---|
[9606] | 139 | else |
---|
[10932] | 140 | { |
---|
[10994] | 141 | if(string_find("/swap/",list[j].name)) |
---|
[10932] | 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 | } |
---|
[8626] | 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 | } |
---|
[7758] | 168 | |
---|
[8626] | 169 | listbox->aktpage = -1; |
---|
[7758] | 170 | |
---|
| 171 | drawscreen(screen,0); |
---|
| 172 | addscreenrc(screen, listbox); |
---|
| 173 | |
---|
[8626] | 174 | while (1) |
---|
| 175 | { |
---|
[7758] | 176 | addscreenrc(screen, tmp); |
---|
[8249] | 177 | rcret = waitrc(screen, 0, 0); |
---|
[8626] | 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 |
---|
[10934] | 191 | |
---|
[11915] | 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 | |
---|
[10934] | 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 | |
---|
[9636] | 209 | tmpstr = dirname(tmpstr); |
---|
[9046] | 210 | tmpstr = ostrcat(tmpstr, "/skinconfig", 1, 0); |
---|
[8626] | 211 | if(file_exist(tmpstr)) |
---|
[9606] | 212 | { |
---|
[9046] | 213 | addconfig("skinconfig", tmpstr); |
---|
[9606] | 214 | free(tmpstr); tmpstr = NULL; |
---|
| 215 | } |
---|
[8626] | 216 | else |
---|
| 217 | { |
---|
[10255] | 218 | textbox(_("Message"), _("No skinconfig found in skin.\nCan't chage to selected skin."), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 0, 0); |
---|
[9606] | 219 | drawscreen(screen, 0); |
---|
[8626] | 220 | free(tmpstr); tmpstr = NULL; |
---|
[9606] | 221 | continue; |
---|
[8626] | 222 | } |
---|
[9606] | 223 | |
---|
| 224 | addconfig("skinfile", selection->name); |
---|
| 225 | |
---|
| 226 | tmpstr = ostrcat(selection->name, "", 0, 0); |
---|
| 227 | addconfig("skinpath", dirname(tmpstr)); |
---|
| 228 | |
---|
| 229 | skinchanged = 1; |
---|
[8626] | 230 | free(tmpstr); tmpstr = NULL; |
---|
[9606] | 231 | |
---|
[8626] | 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); |
---|
[9035] | 249 | --i; for(;i >= 0; --i) |
---|
[9606] | 250 | { |
---|
| 251 | free(list[i].displayname); |
---|
| 252 | free(list[i].name); |
---|
| 253 | } |
---|
[8626] | 254 | free(skinpaths); |
---|
[8665] | 255 | if(skinchanged) oshutdown(3, 1); |
---|
[7758] | 256 | } |
---|
| 257 | |
---|
| 258 | #endif |
---|
| 259 | |
---|