updates.
[silc.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 #*******************************
140 MODULE = Irssi::UI::Themes  PACKAGE = Irssi::Server
141 #*******************************
142
143 void
144 printformat(server, target, level, format, ...)
145         Irssi::Server server
146         char *target
147         int level
148         char *format
149 PREINIT:
150         TEXT_DEST_REC dest;
151         char *arglist[MAX_FORMAT_PARAMS+1];
152         int n;
153 CODE:
154         format_create_dest(&dest, server, target, level, NULL);
155         memset(arglist, 0, sizeof(arglist));
156         for (n = 4; n < items && n < MAX_FORMAT_PARAMS+4; n++) {
157                 arglist[n-4] = SvPV(ST(n), PL_na);
158         }
159
160         printformat_perl(&dest, format, arglist);
161
162 #*******************************
163 MODULE = Irssi::UI::Themes  PACKAGE = Irssi::UI::Window
164 #*******************************
165
166 void
167 printformat(window, level, format, ...)
168         Irssi::UI::Window window
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, NULL, NULL, level, window);
177         memset(arglist, 0, sizeof(arglist));
178         for (n = 3; n < items && n < MAX_FORMAT_PARAMS+3; n++) {
179                 arglist[n-3] = SvPV(ST(n), PL_na);
180         }
181
182         printformat_perl(&dest, format, arglist);
183
184 #*******************************
185 MODULE = Irssi::UI::Themes  PACKAGE = Irssi::Windowitem
186 #*******************************
187
188 void
189 printformat(item, level, format, ...)
190         Irssi::Windowitem item
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, item->server, item->name, level, NULL);
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::UI::Theme  PREFIX = theme_
208 #*******************************
209
210 void
211 theme_format_expand(theme, format, flags=0)
212         Irssi::UI::Theme theme
213         char *format
214         int flags
215 PREINIT:
216         char *ret;
217 PPCODE:
218         if (flags == 0) {
219                 ret = theme_format_expand(theme, format);
220         } else {
221                 ret = theme_format_expand_data(theme, (const char **) &format, 'n', 'n',
222                                                NULL, NULL, EXPAND_FLAG_ROOT | flags);
223         }
224         XPUSHs(sv_2mortal(new_pv(ret)));
225         g_free_not_null(ret);
226
227 char *
228 theme_get_format(theme, module, tag)
229         Irssi::UI::Theme theme
230         char *module
231         char *tag
232 PREINIT:
233         MODULE_THEME_REC *modtheme;
234         FORMAT_REC *formats;
235         int i;
236 CODE:
237         formats = g_hash_table_lookup(default_formats, module);
238         if (formats == NULL)
239                 croak("Unknown module: %s", module);
240
241         for (i = 0; formats[i].def != NULL; i++) {
242                 if (formats[i].tag != NULL &&
243                     g_strcasecmp(formats[i].tag, tag) == 0)
244                         break;
245         }
246
247         if (formats[i].def == NULL)
248                 croak("Unknown format tag: %s", tag);
249
250         modtheme = g_hash_table_lookup(theme->modules, module);
251         RETVAL = modtheme == NULL ? NULL : modtheme->formats[i];
252         if (RETVAL == NULL)
253                 RETVAL = formats[i].def;
254 OUTPUT:
255         RETVAL