]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blame - src/install+setup/setup/keymap.c
Installer:
[people/teissler/ipfire-2.x.git] / src / install+setup / setup / keymap.c
CommitLineData
cd1a2927
MT
1/* SmoothWall setup program.\r
2 *\r
3 * This program is distributed under the terms of the GNU General Public\r
4 * Licence. See the file COPYING for details.\r
5 *\r
6 * (c) Lawrence Manning, 2001\r
7 * Stuff for setting the keymap.\r
8 * \r
9 * $Id: keymap.c,v 1.9.2.1 2004/04/14 22:05:41 gespinasse Exp $\r
10 * \r
11 */\r
12 \r
13#include "setup.h"\r
14 \r
15extern FILE *flog;\r
16extern char *mylog;\r
17\r
18extern char **ctr;\r
19\r
20extern int automode;\r
21\r
22#define MAX_FILENAMES 5000\r
23#define KEYMAPROOT "/usr/share/kbd/keymaps/i386/"\r
24\r
25static int filenamecount;\r
26static char *filenames[MAX_FILENAMES];\r
27static char *displaynames[MAX_FILENAMES];\r
28\r
29static int process(char *prefix, char *path);\r
30static int cmp(const void *s1, const void *s2);\r
31\r
32int handlekeymap(void)\r
33{\r
34 int c;\r
35 int choice;\r
36 char *temp;\r
37 struct keyvalue *kv = initkeyvalues(); \r
38 int rc;\r
39 int result;\r
40 char keymap[STRING_SIZE];\r
41 char commandstring[STRING_SIZE];\r
42\r
43 filenamecount = 0; \r
44\r
45 process(KEYMAPROOT "azerty", ""); \r
46 process(KEYMAPROOT "dvorak", "");\r
47 process(KEYMAPROOT "fgGIod", ""); \r
48 process(KEYMAPROOT "qwerty", "");\r
49 process(KEYMAPROOT "qwertz", "");\r
50 filenames[filenamecount] = NULL;\r
51 qsort(filenames, filenamecount, sizeof(char *), cmp);\r
52 \r
53 for (c = 0; filenames[c]; c++)\r
54 {\r
55 displaynames[c] = malloc(STRING_SIZE);\r
56 if ((temp = strrchr(filenames[c], '/')))\r
57 strcpy(displaynames[c], temp + 1);\r
58 else\r
59 strcpy(displaynames[c], filenames[c]);\r
60 if ((temp = strstr(displaynames[c], ".map.gz")))\r
61 *temp = '\0';\r
62 }\r
63 displaynames[c] = NULL;\r
64 \r
65 if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))\r
66 {\r
67 freekeyvalues(kv);\r
68 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
69 return 0;\r
70 } \r
71 \r
1217aa01 72 strcpy(keymap, "/usr/share/kbd/keymaps/i386/qwertz/de.map.gz");\r
cd1a2927
MT
73 findkey(kv, "KEYMAP", keymap);\r
74 \r
75 choice = 0;\r
76 for (c = 0; filenames[c]; c++)\r
77 {\r
78 if (strcmp(keymap, filenames[c]) == 0)\r
79 choice = c;\r
80 }\r
81 \r
82 rc = newtWinMenu(ctr[TR_KEYBOARD_MAPPING], ctr[TR_KEYBOARD_MAPPING_LONG], 50, 5, 5, 6, displaynames, &choice,\r
83 ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
84\r
85 strcpy(keymap, filenames[choice]);\r
86 \r
87 if (rc != 2)\r
88 {\r
89 replacekeyvalue(kv, "KEYMAP", keymap);\r
90 writekeyvalues(kv, CONFIG_ROOT "/main/settings");\r
91 sprintf(commandstring, "/bin/loadkeys %s", keymap);\r
92 mysystem(commandstring);\r
93 result = 1;\r
94 }\r
95 else\r
96 result = 0; \r
97 \r
98 for (c = 0; filenames[c]; c++)\r
99 {\r
100 free(filenames[c]);\r
101 free(displaynames[c]);\r
102 }\r
103 freekeyvalues(kv); \r
104 \r
105 return result;\r
106}\r
107\r
108static int process(char *prefix, char *path)\r
109{\r
110 DIR *dir;\r
111 struct dirent *de;\r
112 char newpath[PATH_MAX];\r
113 \r
114 snprintf(newpath, PATH_MAX, "%s%s", prefix, path);\r
115 \r
116 if (!(dir = opendir(newpath)))\r
117 {\r
118 if (filenamecount > MAX_FILENAMES)\r
119 return 1;\r
120 \r
121 filenames[filenamecount] = (char *) strdup(newpath);\r
122 filenamecount++;\r
123 return 0;\r
124 }\r
125 \r
126 while ((de = readdir(dir)))\r
127 {\r
128 if (de->d_name[0] == '.') continue;\r
129 snprintf(newpath, PATH_MAX, "%s/%s", path, de->d_name);\r
130 process(prefix, newpath);\r
131 }\r
132 closedir(dir);\r
133 \r
134 return 1;\r
135}\r
136\r
137/* Small wrapper for use with qsort() to sort filename part. */ \r
138static int cmp(const void *s1, const void *s2)\r
139{\r
140 /* c1 and c2 are copies. */\r
141 char *c1 = strdup(* (char **) s1);\r
142 char *c2 = strdup(* (char **) s2);\r
143 /* point to somewhere in cN. */\r
144 char *f1, *f2;\r
145 char *temp;\r
146 int res;\r
147 \r
148 if ((temp = strrchr(c1, '/')))\r
149 f1 = temp + 1;\r
150 else\r
151 f1 = c1;\r
152 if ((temp = strrchr(c2, '/')))\r
153 f2 = temp + 1;\r
154 else\r
155 f2 = c2;\r
156 /* bang off the . */\r
157 if ((temp = strchr(f1, '.')))\r
158 *temp = '\0';\r
159 if ((temp = strchr(f2, '.')))\r
160 *temp = '\0';\r
161 \r
162 res = strcmp(f1, f2);\r
163 \r
164 free(c1); free(c2);\r
165 \r
166 return res;\r
167}\r