Merge Irssi 0.8.16-rc1
[silc.git] / apps / irssi / src / perl / ui / Themes.xs
1 #include "module.h"
2
3 static void printformat_perl(TEXT_DEST_REC *dest, char *format, char **arglist)
4 {
5         char *module;
6         int formatnum;
7
8         module = g_strdup(perl_get_package());
9         formatnum = format_find_tag(module, format);
10         if (formatnum < 0) {
11                 die("printformat(): unregistered format '%s'", format);
12                 g_free(module);
13                 return;
14         }
15
16         printformat_module_dest_charargs(module, dest, formatnum, arglist);
17         g_free(module);
18 }
19
20 static void perl_unregister_theme(const char *package)
21 {
22         FORMAT_REC *formats;
23         int n;
24
25         formats = g_hash_table_lookup(default_formats, package);
26         if (formats == NULL) return;
27
28         for (n = 0; formats[n].def != NULL; n++) {
29                 g_free(formats[n].tag);
30                 g_free(formats[n].def);
31         }
32         g_free(formats);
33         theme_unregister_module(package);
34 }
35
36 static void sig_script_destroyed(PERL_SCRIPT_REC *script)
37 {
38         perl_unregister_theme(script->package);
39 }
40
41 void perl_themes_init(void)
42 {
43         signal_add("script destroyed", (SIGNAL_FUNC) sig_script_destroyed);
44 }
45
46 void perl_themes_deinit(void)
47 {
48         signal_remove("script destroyed", (SIGNAL_FUNC) sig_script_destroyed);
49 }
50
51 MODULE = Irssi::UI::Themes  PACKAGE = Irssi
52 PROTOTYPES: ENABLE
53
54 Irssi::UI::Theme
55 current_theme()
56 CODE:
57         RETVAL = current_theme;
58 OUTPUT:
59         RETVAL
60
61 int
62 EXPAND_FLAG_IGNORE_REPLACES()
63 CODE:
64         RETVAL = EXPAND_FLAG_IGNORE_REPLACES;
65 OUTPUT:
66         RETVAL
67
68 int
69 EXPAND_FLAG_IGNORE_EMPTY()
70 CODE:
71         RETVAL = EXPAND_FLAG_IGNORE_EMPTY;
72 OUTPUT:
73         RETVAL
74
75 int
76 EXPAND_FLAG_RECURSIVE_MASK()
77 CODE:
78         RETVAL = EXPAND_FLAG_RECURSIVE_MASK;
79 OUTPUT:
80         RETVAL
81
82 void
83 theme_register(formats)
84         SV *formats
85 PREINIT:
86         AV *av;
87         FORMAT_REC *formatrecs;
88         char *key, *value;
89         int len, n, fpos;
90 CODE:
91
92         if (!SvROK(formats))
93                 croak("formats is not a reference");
94
95         av = (AV *) SvRV(formats);
96         if (SvTYPE(av) != SVt_PVAV)
97                 croak("formats is not a reference to a list");
98
99         len = av_len(av)+1;
100         if (len == 0 || (len & 1) != 0)
101                 croak("formats list is invalid - not divisible by 2 (%d)", len);
102
103         formatrecs = g_new0(FORMAT_REC, len/2+2);
104         formatrecs[0].tag = g_strdup(perl_get_package());
105         formatrecs[0].def = g_strdup("Perl script");
106
107         for (fpos = 1, n = 0; n < len; n++, fpos++) {
108                 key = SvPV(*av_fetch(av, n, 0), PL_na); n++;
109                 value = SvPV(*av_fetch(av, n, 0), PL_na);
110
111                 formatrecs[fpos].tag = g_strdup(key);
112                 formatrecs[fpos].def = g_strdup(value);
113                 formatrecs[fpos].params = MAX_FORMAT_PARAMS;
114         }
115
116         theme_register_module(perl_get_package(), formatrecs);
117
118 void
119 printformat(level, format, ...)
120         int level
121         char *format
122 PREINIT:
123         TEXT_DEST_REC dest;
124         char *arglist[MAX_FORMAT_PARAMS+1];
125         int n;
126 CODE:
127         format_create_dest(&dest, NULL, NULL, level, NULL);
128         memset(arglist, 0, sizeof(arglist));
129         for (n = 2; n < items && n < MAX_FORMAT_PARAMS+2; n++) {
130                 arglist[n-2] = SvPV(ST(n), PL_na);
131         }
132
133         printformat_perl(&dest, format, arglist);
134
135 void
136 abstracts_register(abstracts)
137         SV *abstracts
138 PREINIT:
139         AV *av;
140         char *key, *value;
141         int i, len;
142 CODE:
143         if (!SvROK(abstracts))
144                 croak("abstracts is not a reference to list");
145         av = (AV *) SvRV(abstracts);
146         len = av_len(av)+1;
147         if (len == 0 || (len & 1) != 0)
148                 croak("abstracts list is invalid - not divisible by 2 (%d)", len);
149
150         for (i = 0; i < len; i++) {
151                 key = SvPV(*av_fetch(av, i, 0), PL_na); i++;
152                 value = SvPV(*av_fetch(av, i, 0), PL_na);
153
154                 theme_set_default_abstract(key, value);
155         }
156         themes_reload();
157
158 void
159 themes_reload()
160
161 #*******************************
162 MODULE = Irssi::UI::Themes  PACKAGE = Irssi::Server
163 #*******************************
164
165 void
166 printformat(server, target, level, format, ...)
167         Irssi::Server server
168         char *target
169         int level
170         char *format
171 PREINIT:
172         TEXT_DEST_REC dest;
173         char *arglist[MAX_FORMAT_PARAMS+1];
174         int n;
175 CODE:
176         format_create_dest(&dest, server, target, level, NULL);
177         memset(arglist, 0, sizeof(arglist));
178         for (n = 4; n < items && n < MAX_FORMAT_PARAMS+4; n++) {
179                 arglist[n-4] = SvPV(ST(n), PL_na);
180         }
181
182         printformat_perl(&dest, format, arglist);
183
184 #*******************************
185 MODULE = Irssi::UI::Themes  PACKAGE = Irssi::UI::Window
186 #*******************************
187
188 void
189 printformat(window, level, format, ...)
190         Irssi::UI::Window window
191         int level
192         char *format
193 PREINIT:
194         TEXT_DEST_REC dest;
195         char *arglist[MAX_FORMAT_PARAMS+1];
196         int n;
197 CODE:
198         format_create_dest(&dest, NULL, NULL, level, window);
199         memset(arglist, 0, sizeof(arglist));
200         for (n = 3; n < items && n < MAX_FORMAT_PARAMS+3; n++) {
201                 arglist[n-3] = SvPV(ST(n), PL_na);
202         }
203
204         printformat_perl(&dest, format, arglist);
205
206 #*******************************
207 MODULE = Irssi::UI::Themes  PACKAGE = Irssi::Windowitem
208 #*******************************
209
210 void
211 printformat(item, level, format, ...)
212         Irssi::Windowitem item
213         int level
214         char *format
215 PREINIT:
216         TEXT_DEST_REC dest;
217         char *arglist[MAX_FORMAT_PARAMS+1];
218         int n;
219 CODE:
220         format_create_dest(&dest, item->server, item->visible_name, level, NULL);
221         memset(arglist, 0, sizeof(arglist));
222         for (n = 3; n < items && n < MAX_FORMAT_PARAMS+3; n++) {
223                 arglist[n-3] = SvPV(ST(n), PL_na);
224         }
225
226         printformat_perl(&dest, format, arglist);
227
228 #*******************************
229 MODULE = Irssi::UI::Themes  PACKAGE = Irssi::UI::Theme  PREFIX = theme_
230 #*******************************
231
232 void
233 theme_format_expand(theme, format, flags=0)
234         Irssi::UI::Theme theme
235         char *format
236         int flags
237 PREINIT:
238         char *ret;
239 PPCODE:
240         if (flags == 0) {
241                 ret = theme_format_expand(theme, format);
242         } else {
243                 ret = theme_format_expand_data(theme, (const char **) &format, 'n', 'n',
244                                                NULL, NULL, EXPAND_FLAG_ROOT | flags);
245         }
246         XPUSHs(sv_2mortal(new_pv(ret)));
247         g_free_not_null(ret);
248
249 char *
250 theme_get_format(theme, module, tag)
251         Irssi::UI::Theme theme
252         char *module
253         char *tag
254 PREINIT:
255         MODULE_THEME_REC *modtheme;
256         FORMAT_REC *formats;
257         int i;
258 CODE:
259         formats = g_hash_table_lookup(default_formats, module);
260         if (formats == NULL)
261                 croak("Unknown module: %s", module);
262
263         for (i = 0; formats[i].def != NULL; i++) {
264                 if (formats[i].tag != NULL &&
265                     g_strcasecmp(formats[i].tag, tag) == 0)
266                         break;
267         }
268
269         if (formats[i].def == NULL)
270                 croak("Unknown format tag: %s", tag);
271
272         modtheme = g_hash_table_lookup(theme->modules, module);
273         RETVAL = modtheme == NULL ? NULL : modtheme->formats[i];
274         if (RETVAL == NULL)
275                 RETVAL = formats[i].def;
276 OUTPUT:
277         RETVAL