]>
Commit | Line | Data |
---|---|---|
35ea0a63 | 1 | --- menu.c.orig 2004-04-22 00:37:31.000000000 +0200 |
2 | +++ menu.c 2004-05-13 18:33:08.000000000 +0200 | |
3 | @@ -55,6 +55,43 @@ | |
4 | RET(); | |
5 | } | |
6 | ||
7 | +static FILE * | |
8 | +read_include(FILE *fp) | |
9 | +{ | |
10 | + FILE *fi; | |
11 | + line s; | |
12 | + gchar *name; | |
13 | + | |
14 | + ENTER; | |
15 | + s.len = 256; | |
16 | + name = 0; | |
17 | + while (get_line(fp, &s) != LINE_BLOCK_END) { | |
18 | + if (s.type == LINE_VAR) { | |
19 | + if (!g_ascii_strcasecmp(s.t[0], "name")) | |
20 | + name = expand_tilda(s.t[1]); | |
21 | + else { | |
22 | + ERR( "menu/include: unknown var %s\n", s.t[0]); | |
23 | + goto error; | |
24 | + } | |
25 | + } | |
26 | + } | |
27 | + | |
28 | + if ((fi = fopen(name, "r"))) { | |
29 | + ERR("Including %s\n", name); | |
30 | + g_free(name); | |
31 | + } | |
32 | + else { | |
33 | + ERR("Can't include %s\n", name); | |
34 | + goto error; | |
35 | + } | |
36 | + | |
37 | + RET(fi); | |
38 | + | |
39 | + error: | |
40 | + g_free(name); | |
41 | + RET(NULL); | |
42 | +} | |
43 | + | |
44 | static GtkWidget * | |
45 | read_item(plugin *p) | |
46 | { | |
47 | @@ -126,6 +163,8 @@ | |
48 | GtkWidget *mi, *menu; | |
49 | gchar *name, *fname; | |
50 | menup *m = (menup *)p->priv; | |
51 | + FILE *fbackup; | |
52 | + int isinclude; | |
53 | ||
54 | ENTER; | |
55 | s.len = 256; | |
56 | @@ -135,15 +174,31 @@ | |
57 | //gtk_rc_parse_string(menu_rc); | |
58 | ||
59 | name = fname = 0; | |
60 | + isinclude = 0; | |
61 | + fbackup = 0; | |
62 | while (get_line(p->fp, &s) != LINE_BLOCK_END) { | |
63 | if (s.type == LINE_BLOCK_START) { | |
64 | mi = NULL; | |
65 | if (!g_ascii_strcasecmp(s.t[0], "item")) { | |
66 | mi = read_item(p); | |
67 | } else if (!g_ascii_strcasecmp(s.t[0], "separator")) { | |
68 | - mi= read_separator(p); | |
69 | + mi = read_separator(p); | |
70 | } else if (!g_ascii_strcasecmp(s.t[0], "menu")) { | |
71 | - mi= read_submenu(p, level+1); | |
72 | + mi = read_submenu(p, level+1); | |
73 | + } else if (!g_ascii_strcasecmp(s.t[0], "include")) { | |
74 | + if (isinclude) | |
75 | + { | |
76 | + ERR("menu: illegal include in this context\n"); | |
77 | + goto error; | |
78 | + } | |
79 | + fbackup = p->fp; | |
80 | + if ((p->fp = read_include(p->fp))) { | |
81 | + isinclude = 1; | |
82 | + continue; | |
83 | + } else { | |
84 | + p->fp = fbackup; | |
85 | + goto error; | |
86 | + } | |
87 | } else { | |
88 | ERR("menu: unknown block %s\n", s.t[0]); | |
89 | goto error; | |
90 | @@ -158,12 +213,16 @@ | |
91 | fname = expand_tilda(s.t[1]); | |
92 | else if (!g_ascii_strcasecmp(s.t[0], "name")) | |
93 | name = g_strdup(s.t[1]); | |
94 | - else { | |
95 | + else { | |
96 | ERR("menu: unknown var %s\n", s.t[0]); | |
97 | goto error; | |
98 | } | |
99 | + } else if (s.type == LINE_NONE && isinclude) { | |
100 | + isinclude = 0; | |
101 | + fclose(p->fp); | |
102 | + p->fp = fbackup; | |
103 | } else { | |
104 | - ERR( "menu: illegal in this context %s\n", s.str); | |
105 | + ERR("menu: illegal in this context %s\n", s.str); | |
106 | goto error; | |
107 | } | |
108 | } |