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