Compile .gtkh header files from .desc files.
[doldaconnect.git] / common / makegdesc
CommitLineData
d3372da9 1#!/usr/bin/perl
2
4dda7bfa
FT
3use Getopt::Long;
4use IO::File;
5
6GetOptions(\%args, "h=s") || exit 1;
7
d3372da9 8$tempvar = 0;
9
10sub printwidgets
11{
12 my($widget, $sl, $p, $sig, $cb, $data, $pf, $cpf, $mod, $key, @delayedlines);
13 $sl = $_[1];
14 $p = " " . (" " x $sl);
15 $cpf = $_[2];
16 @delayedlines = ();
17 foreach $widget (@{$_[0]})
18 {
19 if($widget->{"type"} eq "wnd")
20 {
21 print "${p}stack[$sl] = gtk_window_new(GTK_WINDOW_TOPLEVEL);\n";
22 if($options{"hasaccels"}) {
23 print "${p}gtk_window_add_accel_group(GTK_WINDOW(stack[$sl]), accel_group);\n";
24 }
25 if($widget->{"title"}) {
26 print "${p}gtk_window_set_title(GTK_WINDOW(stack[$sl]), \"" . $widget->{"title"} . "\");\n";
27 }
28 $pf = sub
29 {
30 my($widget, $p, $sl) = @_;
31 print "${p}gtk_container_add(GTK_CONTAINER(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
32 }
4e3cd270 33 } elsif($widget->{"type"} eq "assistant") {
34 print "${p}stack[$sl] = gtk_assistant_new();\n";
4b4f9fc7 35 if(defined($widget->{"title"})) {
36 print "${p}gtk_window_set_title(GTK_WINDOW(stack[$sl]), \"" . $widget->{"title"} . "\");\n";
37 }
4e3cd270 38 $pf = sub
39 {
40 my($widget, $p, $sl) = @_;
41 print "${p}gtk_assistant_append_page(GTK_ASSISTANT(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
42 if(defined($widget->{"title"})) {
43 print "${p}gtk_assistant_set_page_title(GTK_ASSISTANT(stack[" . ($sl - 1) . "]), stack[" . $sl . "], _(\"" . $widget->{"title"} . "\"));\n";
44 }
45 if(defined($widget->{"ptype"})) {
46 print "${p}gtk_assistant_set_page_type(GTK_ASSISTANT(stack[" . ($sl - 1) . "]), stack[" . $sl . "], GTK_ASSISTANT_PAGE_" . $widget->{"ptype"} . ");\n";
47 }
48 if(defined($widget->{"cmpl"})) {
ca2d6377 49 print "${p}gtk_assistant_set_page_complete(GTK_ASSISTANT(stack[" . ($sl - 1) . "]), stack[" . $sl . "], " . $widget->{"cmpl"} . ");\n";
4e3cd270 50 }
51 }
d3372da9 52 } elsif($widget->{"type"} =~ /[hv]box/) {
53 print "${p}stack[$sl] = gtk_" . $widget->{"type"} . "_new(";
54 print $widget->{"homo"}?"TRUE, ":"FALSE, ";
55 print $widget->{"spacing"} || "0";
56 print ");\n";
57 $pf = sub
58 {
59 my($widget, $p, $sl) = @_;
60 print "${p}gtk_box_pack_start(GTK_BOX(stack[" . ($sl - 1) . "]), stack[$sl], ";
61 print (($widget->{"expand"} || $widget->{"parent"}->{"dexpand"})?"TRUE, ":"FALSE, ");
62 print (($widget->{"fill"} || $widget->{"parent"}->{"dfill"})?"TRUE, ":"FALSE, ");
63 print $widget->{"pad"} || "0";
64 print ");\n";
65 }
66 } elsif($widget->{"type"} eq "table") {
67 print "${p}stack[$sl] = gtk_table_new(" . $widget->{"rows"} . ", " . $widget->{"cols"};
68 print ", " . (($widget->{"homo"} eq "TRUE")?"TRUE":"FALSE");
69 print ");\n";
70 $pf = sub
71 {
72 my($widget, $p, $sl) = @_;
73 print "${p}gtk_table_attach(GTK_TABLE(stack[" . ($sl - 1) . "]), stack[$sl]";
74 print ", " . $widget->{"tx"};
75 print ", " . ($widget->{"tx"} + (defined($widget->{"tw"})?$widget->{"tw"}:1));
76 print ", " . $widget->{"ty"};
77 print ", " . ($widget->{"ty"} + (defined($widget->{"th"})?$widget->{"th"}:1));
78 if($widget->{"fill"} eq "y") {
79 $widget->{"fillx"} = "y";
80 $widget->{"filly"} = "y";
81 }
82 if($widget->{"shrink"} eq "y") {
83 $widget->{"shrinkx"} = "y";
84 $widget->{"shrinky"} = "y";
85 }
86 if($widget->{"expand"} eq "y") {
87 $widget->{"expandx"} = "y";
88 $widget->{"expandy"} = "y";
89 }
90 print ", 0";
91 print " | GTK_FILL" if $widget->{"fillx"} eq "y";
92 print " | GTK_SHRINK" if $widget->{"shrinkx"} eq "y";
93 print " | GTK_EXPAND" if $widget->{"expandx"} eq "y";
94 print ", 0";
95 print " | GTK_FILL" if $widget->{"filly"} eq "y";
96 print " | GTK_SHRINK" if $widget->{"shrinky"} eq "y";
97 print " | GTK_EXPAND" if $widget->{"expandy"} eq "y";
98 print ", " . (defined($widget->{"padx"})?$widget->{"padx"}:"0");
99 print ", " . (defined($widget->{"pady"})?$widget->{"pady"}:"0");
100 print ");\n";
101 }
102 } elsif($widget->{"type"} eq "btn") {
103 $widget->{"label"} || die("Can't have button without label\n");
104 print "${p}stack[$sl] = gtk_button_new_with_mnemonic(_(\"" . $widget->{"label"} . "\"));\n";
105 } elsif($widget->{"type"} eq "chk") {
106 $widget->{"label"} || die("Can't have check button without label\n");
107 print "${p}stack[$sl] = gtk_check_button_new_with_mnemonic(_(\"" . $widget->{"label"} . "\"));\n";
9b081644 108 } elsif($widget->{"type"} eq "radio") {
109 $widget->{"label"} || die("Can't have check button without label\n");
110 if(defined($widget->{"group"})) {
111 print "${p}stack[$sl] = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(" . $options{"prefix"} . $widget->{"group"} . "), _(\"" . $widget->{"label"} . "\"));\n";
112 } else {
113 print "${p}stack[$sl] = gtk_radio_button_new_with_mnemonic(NULL, _(\"" . $widget->{"label"} . "\"));\n";
114 }
d3372da9 115 } elsif($widget->{"type"} eq "sbtn") {
116 $widget->{"stock"} || die("Can't have button without stock\n");
117 print "${p}stack[$sl] = gtk_button_new_from_stock(GTK_STOCK_" . $widget->{"stock"} . ");\n";
118 } elsif($widget->{"type"} eq "simg") {
119 $widget->{"stock"} || die("Can't have image without stock\n");
120 $widget->{"size"} || die("Can't have image without size\n");
121 print "${p}stack[$sl] = gtk_image_new_from_stock(GTK_STOCK_" . $widget->{"stock"} . ", GTK_ICON_SIZE_" . $widget->{"size"} . ");\n";
122 } elsif($widget->{"type"} eq "lbl") {
55c6add0 123 $widget->{"label"} || $widget->{"markup"} || die("Can't have label without label\n");
124 if($widget->{"label"}) {
125 print "${p}stack[$sl] = gtk_label_new(_(\"" . $widget->{"label"} . "\"));\n";
126 } else {
127 print "${p}stack[$sl] = gtk_label_new(NULL);\n";
bf9a1919 128 print "${p}gtk_label_set_markup(GTK_LABEL(stack[$sl]), _(\"" . $widget->{"markup"} . "\"));\n";
55c6add0 129 }
8345a394 130 if($widget->{"wrap"} eq "y") {
131 print "${p}gtk_label_set_line_wrap(GTK_LABEL(stack[$sl]), TRUE);\n";
132 }
d3372da9 133 } elsif($widget->{"type"} eq "mlbl") {
134 $widget->{"label"} || die("Can't have label without label\n");
135 print "${p}stack[$sl] = gtk_label_new_with_mnemonic(_(\"" . $widget->{"label"} . "\"));\n";
136 if(defined($widget->{"mwidget"}))
137 {
138 if($widget->{"var"} ne "y") {
139 $widget->{"var"} = "l";
140 }
141 if(!defined($widget->{"name"})) {
142 $widget->{"name"} = "temp" . $tempvar++;
143 }
144 $str = "gtk_label_set_mnemonic_widget(GTK_LABEL(";
145 if($widget->{"var"} eq "y") {
146 $str .= $options{"prefix"};
147 }
148 $str .= $widget->{"name"};
149 $str .= "), " . $options{"prefix"} . $widget->{"mwidget"} . ");";
150 push @delayedlines, ($str);
151 }
152 } elsif($widget->{"type"} eq "text") {
153 print "${p}stack[$sl] = gtk_entry_new();\n";
154 if($widget->{"default"}) {
155 print "${p}gtk_entry_set_text(GTK_ENTRY(stack[$sl]), \"" . $widget->{"default"} . "\");\n";
156 }
157 } elsif($widget->{"type"} eq "menubar") {
158 print "${p}stack[$sl] = gtk_menu_bar_new();\n";
159 $pf = sub
160 {
161 my($widget, $p, $sl) = @_;
162 print "${p}gtk_menu_shell_append(GTK_MENU_SHELL(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
163 }
164 } elsif($widget->{"type"} eq "menuitem") {
165 print "${p}stack[$sl] = gtk_menu_item_new_with_mnemonic(_(\"" . $widget->{"label"} . "\"));\n";
166 $pf = sub
167 {
168 my($widget, $p, $sl) = @_;
169 print "${p}gtk_menu_item_set_submenu(GTK_MENU_ITEM(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
170 }
171 } elsif($widget->{"type"} eq "smenuitem") {
172 print "${p}stack[$sl] = gtk_image_menu_item_new_from_stock(GTK_STOCK_" . $widget->{"stock"} . ", accel_group);\n";
173 $pf = sub
174 {
175 my($widget, $p, $sl) = @_;
176 print "${p}gtk_menu_item_set_submenu(GTK_MENU_ITEM(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
177 }
178 } elsif($widget->{"type"} eq "menusep") {
179 print "${p}stack[$sl] = gtk_separator_menu_item_new();\n";
180 } elsif($widget->{"type"} eq "menu") {
181 print "${p}stack[$sl] = gtk_menu_new();\n";
182 if($options{"hasaccels"}) {
183 print "${p}gtk_menu_set_accel_group(GTK_MENU(stack[$sl]), accel_group);\n";
184 }
185 $pf = sub
186 {
187 my($widget, $p, $sl) = @_;
188 print "${p}gtk_menu_shell_append(GTK_MENU_SHELL(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
189 };
190 $widget->{"noshow"} = 1;
191 } elsif($widget->{"type"} =~ /^[hv]paned$/) {
192 print "${p}stack[$sl] = gtk_" . $widget->{"type"} . "_new();\n";
193 $widget->{"cur"} = 1;
194 $pf = sub
195 {
196 my($widget, $p, $sl) = @_;
197 print "${p}gtk_paned_pack" . ($widget->{"parent"}->{"cur"}) . "(GTK_PANED(stack[" . ($sl - 1) . "]), stack[$sl]";
198 print ", " . ((index($widget->{"parent"}->{"resize"}, $widget->{"parent"}->{"cur"}) < 0)?"FALSE":"TRUE");
199 print ", " . ((index($widget->{"parent"}->{"shrink"}, $widget->{"parent"}->{"cur"}) < 0)?"FALSE":"TRUE");
200 print ");\n";
201 $widget->{"parent"}->{"cur"}++;
202 }
203 } elsif($widget->{"type"} eq "notebook") {
204 print "${p}stack[$sl] = gtk_notebook_new();\n";
bf565de3 205 if(defined($widget->{"pos"})) {
f44e64ee 206 print "${p}gtk_notebook_set_tab_pos(GTK_NOTEBOOK(stack[$sl]), GTK_POS_" . $widget->{"pos"} . ");\n";
bf565de3 207 }
d3372da9 208 $pf = sub
209 {
210 my($widget, $p, $sl) = @_;
211 print "${p}gtk_notebook_append_page(GTK_NOTEBOOK(stack[" . ($sl - 1) . "]), stack[$sl]";
212 print ", gtk_label_new_with_mnemonic(_(\"" . $widget->{"nblabel"} . "\"))";
213 print ");\n";
214 }
215 } elsif($widget->{"type"} eq "sw") {
216 print "${p}stack[$sl] = gtk_scrolled_window_new(NULL, NULL);\n";
217 $pf = sub
218 {
219 my($widget, $p, $sl) = @_;
220 print "${p}gtk_container_add(GTK_CONTAINER(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
221 }
222 } elsif($widget->{"type"} eq "frame") {
223 print "${p}stack[$sl] = gtk_frame_new(_(\"" . $widget->{"label"} . "\"));\n";
224 $pf = sub
225 {
226 my($widget, $p, $sl) = @_;
227 print "${p}gtk_container_add(GTK_CONTAINER(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
228 }
229 } elsif($widget->{"type"} eq "exp") {
230 print "${p}stack[$sl] = gtk_expander_new_with_mnemonic(_(\"" . $widget->{"label"} . "\"));\n";
231 $pf = sub
232 {
233 my($widget, $p, $sl) = @_;
234 print "${p}gtk_container_add(GTK_CONTAINER(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
235 }
9b081644 236 } elsif($widget->{"type"} eq "align") {
237 print "${p}stack[$sl] = gtk_alignment_new(";
238 if(defined($widget->{"xa"})) {
239 print $widget->{"xa"};
240 } else {
241 print "0.5";
242 }
b699c67f 243 print ", ";
9b081644 244 if(defined($widget->{"ya"})) {
245 print $widget->{"ya"};
246 } else {
247 print "0.5";
248 }
b699c67f 249 print ", ";
9b081644 250 if(defined($widget->{"xs"})) {
251 print $widget->{"xs"};
252 } else {
253 print "1.0";
254 }
b699c67f 255 print ", ";
9b081644 256 if(defined($widget->{"ys"})) {
257 print $widget->{"ys"};
258 } else {
259 print "1.0";
260 }
261 print ");\n";
262 $pf = sub
263 {
264 my($widget, $p, $sl) = @_;
265 print "${p}gtk_container_add(GTK_CONTAINER(stack[" . ($sl - 1) . "]), stack[$sl]);\n";
266 }
d3372da9 267 } elsif($widget->{"type"} eq "treeview") {
268 print "${p}stack[$sl] = gtk_tree_view_new();\n";
269 if(defined($widget->{"hvis"})) {
270 print "${p}gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(stack[$sl]), " . $widget->{"hvis"} . ");\n";
271 }
272 if(defined($widget->{"rules"})) {
273 print "${p}gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(stack[$sl]), " . $widget->{"rules"} . ");\n";
274 }
275 if(defined($widget->{"searchcol"})) {
276 print "${p}gtk_tree_view_set_search_column(GTK_TREE_VIEW(stack[$sl]), " . $widget->{"searchcol"} . ");\n";
277 print "${p}gtk_tree_view_set_enable_search(GTK_TREE_VIEW(stack[$sl]), TRUE);\n";
278 }
279 $pf = sub
280 {
281 my($widget, $p, $sl) = @_;
282 print "${p}gtk_tree_view_append_column(GTK_TREE_VIEW(stack[" . ($sl - 1) . "]), column);\n";
283 if($widget->{"expander"} eq "y") {
284 print "${p}gtk_tree_view_set_expander_column(GTK_TREE_VIEW(stack[" . ($sl - 1) . "]), column);\n";
285 }
286 }
287 } elsif($widget->{"type"} eq "tvcol") {
288 if(!defined($widget->{"subwidgets"}))
289 {
290 print "${p}column = gtk_tree_view_column_new_with_attributes(";
291 print "_(\"" . $widget->{"title"} . "\")";
292 print ", gtk_cell_renderer_text_new()";
293 if(defined($widget->{"text"})) {
294 print ", \"text\", " . $widget->{"text"};
295 }
296 print ", NULL);\n";
297 } else {
298 print "${p}column = gtk_tree_view_column_new();\n";
299 print "${p}gtk_tree_view_column_set_title(column, _(\"" . $widget->{"title"} . "\"));\n";
300 }
301 if(defined($widget->{"sortcol"})) {
302 print "${p}gtk_tree_view_column_set_sort_column_id(column, " . $widget->{"sortcol"} . ");\n";
303 }
304 if(defined($widget->{"resizable"})) {
305 print "${p}gtk_tree_view_column_set_resizable(column, " . $widget->{"resizable"} . ");\n";
306 }
307 $widget->{"noshow"} = 1;
308 $pf = sub
309 {
310 }
311 } elsif($widget->{"type"} eq "textrend") {
312 print "${p}renderer = gtk_cell_renderer_text_new();\n";
313 print "${p}gtk_tree_view_column_pack_start(column, renderer, " . (defined($widget->{"expand"})?$widget->{"expand"}:"TRUE") . ");\n";
314 if(defined($widget->{"text"})) {
315 print "${p}gtk_tree_view_column_add_attribute(column, renderer, \"text\", " . $widget->{"text"} . ");\n";
316 }
317 if(defined($widget->{"func"})) {
318 print "${p}gtk_tree_view_column_set_cell_data_func(column, renderer, " . $widget->{"func"} . ", " . ($widget->{"funcdata"} || "NULL") . ", NULL);\n";
319 }
320 $widget->{"noshow"} = 1;
321 } elsif($widget->{"type"} eq "custrend") {
322 print "${p}renderer = GTK_CELL_RENDERER(" . $widget->{"newfunc"} . "());\n";
323 print "${p}gtk_tree_view_column_pack_start(column, renderer, " . (defined($widget->{"expand"})?$widget->{"expand"}:"FALSE") . ");\n";
324 foreach $attr (keys %{$widget})
325 {
326 if($attr =~ /attr\((\S+)\)/)
327 {
328 print "${p}gtk_tree_view_column_add_attribute(column, renderer, \"" . $1 . "\", " . $widget->{$attr} . ");\n";
329 }
330 }
331 $widget->{"noshow"} = 1;
332 } elsif($widget->{"type"} eq "pixbufrend") {
333 print "${p}renderer = gtk_cell_renderer_pixbuf_new();\n";
334 print "${p}gtk_tree_view_column_pack_start(column, renderer, FALSE);\n";
335 if(defined($widget->{"stock_id"})) {
336 print "${p}gtk_tree_view_column_add_attribute(column, renderer, \"stock_id\", " . $widget->{"stock_id"} . ");\n";
337 }
338 $widget->{"noshow"} = 1;
339 } elsif($widget->{"type"} eq "textview") {
340 print "${p}stack[$sl] = gtk_text_view_new();\n";
341 if(defined($widget->{"editable"})) {
342 print "${p}gtk_text_view_set_editable(GTK_TEXT_VIEW(stack[$sl]), " . $widget->{"editable"} . ");\n";
343 }
b37ddeb6 344 } elsif($widget->{"type"} eq "pbar") {
345 print "${p}stack[$sl] = gtk_progress_bar_new();\n";
d3372da9 346 } elsif($widget->{"type"} eq "hr") {
347 print "${p}stack[$sl] = gtk_hseparator_new();\n";
348 } elsif($widget->{"type"} eq "sbar") {
349 print "${p}stack[$sl] = gtk_statusbar_new();\n";
350 if($widget->{"grip"} eq "n") {
351 print "${p}gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(stack[$sl]), FALSE);\n";
352 }
79138dda 353 } elsif($widget->{"type"} eq "filechooser") {
354 print "${p}stack[$sl] = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_" . (defined($widget->{"action"})?$widget->{"action"}:"OPEN") . ");\n";
d3372da9 355 } else {
356 print STDERR "Unknown widget: " . $widget->{"type"} ."\n";
357 }
358 if($widget->{"sensitive"}) {
359 print "${p}gtk_widget_set_sensitive(stack[$sl], " . $widget->{"sensitive"} . ");\n";
360 }
55c6add0 361 if($widget->{"rqsz"} =~ /(\d+)x(\d+)/) {
362 print "${p}gtk_widget_set_size_request(stack[$sl], $1, $2);\n";
363 }
364 if($widget->{"align"} =~ /([\d\.]+):([\d\.]+)/) {
365 print "${p}gtk_misc_set_alignment(GTK_MISC(stack[$sl]), $1, $2);\n";
366 }
bf9a1919 367 if($widget->{"wpad"} =~ /([\d\.]+):([\d\.]+)/) {
368 print "${p}gtk_misc_set_padding(GTK_MISC(stack[$sl]), $1, $2);\n";
369 }
d3372da9 370 if($widget->{"var"} eq "y") {
371 print $p . $options{"prefix"} . $widget->{"name"} . " = stack[$sl];\n";
372 }
373 if($widget->{"var"} eq "l") {
374 print $p . "GtkWidget *" . $widget->{"name"} . " = stack[$sl];\n";
375 }
376 if($widget->{"sig"})
377 {
378 while($widget->{"sig"} =~ /\G([\w_]+),?/g) {
379 print "${p}g_signal_connect(G_OBJECT(stack[$sl]), \"$1\", G_CALLBACK(cb_" . $options{"prefix"} . $widget->{"name"} . "_" . $1 . "), (gpointer)NULL);\n";
380 }
381 }
382 if($widget->{"accel"})
383 {
384 $mod = "";
385 while($widget->{"accel"} =~ /\G(\w+)\+/gc)
386 {
387 $mod .= " | " if($mod);
388 $mod = $mod . "GDK_" . $1 . "_MASK";
389 }
390 $mod || ($mod = "0");
391 $widget->{"accel"} =~ /\G(\w+)/g;
392 $key = $1;
393 print "${p}gtk_widget_add_accelerator(stack[$sl], \"activate\", accel_group, GDK_$key, $mod, GTK_ACCEL_VISIBLE);\n";
394 }
395 foreach $attr (keys %{$widget})
396 {
397 if($attr =~ /^sig\((\S+)\)/)
398 {
399 $sig = $1;
400 if($widget->{$attr} =~ /([^,]*),(.*)/)
401 {
402 $cb = $1;
403 $data = $2;
404 } else {
405 $cb = $widget->{$attr};
406 $data = "NULL";
407 }
34f4de8b 408 print "${p}g_signal_connect(G_OBJECT(stack[$sl]), \"$sig\", G_CALLBACK($cb), (gpointer)$data);\n";
d3372da9 409 }
410 }
411 if($widget->{"subwidgets"})
412 {
413 print "$p\n";
414 printwidgets($widget->{"subwidgets"}, $sl + 1, $pf);
415 }
416 if($sl > 0)
417 {
418 &$cpf($widget, $p, $sl);
419 if(!$widget->{"noshow"}) {
420 print "${p}gtk_widget_show(stack[$sl]);\n";
421 }
422 }
423 print "$p\n";
424 }
425 foreach $line (@delayedlines)
426 {
427 print $p . $line . "\n";
428 }
429}
430
4dda7bfa
FT
431sub printheader
432{
433 my($widget, $handle);
434 $handle = $_[1];
435 foreach $widget (@{$_[0]})
436 {
437 if($widget->{"var"})
438 {
439 $handle->print("extern GtkWidget *" . $options{"prefix"} . $widget->{"name"} .";\n");
440 }
441 printheader($widget->{"subwidgets"}, $handle) if($widget->{"subwidgets"});
442 }
443}
444
d3372da9 445sub printvars
446{
447 my($widget);
448 foreach $widget (@{$_[0]})
449 {
450 if($widget->{"var"})
451 {
452 print "GtkWidget *" . $options{"prefix"} . $widget->{"name"} .";\n";
453 }
454 printvars($widget->{"subwidgets"}) if($widget->{"subwidgets"});
455 }
456}
457
458sub dequote
459{
460 my($text);
461 ($text) = @_;
462 $text =~ s/([^\\]|^)\"/$1/g;
463 $text =~ s/\\(.)/$1/g;
464 return $text;
465}
466
467$rootwidgets = [];
468@estack = ($rootwidgets);
469@wstack = ();
470$curwidget = 0;
471$maxstack = 1;
472
473while(<>)
474{
475 chomp;
476 s/(^|\s+)\#.*$//;
477 s/^\s*//;
478 if(/^;\s*(\w+)\s*:\s*(\w.*)/)
479 {
480 $options{$1} = $2;
481 } elsif(/^([:\$])\s*(\w+)/g) {
482 $curwidget = {"type" => $2};
483 push @{$estack[0]}, $curwidget;
484 if((scalar @wstack) > 0) {
485 $curwidget->{"parent"} = $wstack[0];
486 }
487 if($1 eq ":")
488 {
489 unshift @estack, ($curwidget->{"subwidgets"} = []);
490 unshift @wstack, $curwidget;
491 }
492 $maxstack = (scalar @estack) if((scalar @estack) > $maxstack);
493 while(/\G\s*(\S+)\s*:\s*((\w+|\"([^\\\"]+|\\.)*([^\\]|)\"|\\.)+)/g)
494 {
495 $curwidget->{$1} = dequote($2);
496 }
497 } elsif(/^%\s*(\S+)\s*:\s*((\w+|\"([^\\\"]+|\\.)*([^\\]|)\"|\\.)+)/) {
498 $curwidget || die("No current widget\n");
499 $curwidget->{$1} = dequote($2);
500 } elsif(/^end/) {
501 shift @estack;
502 shift @wstack;
503 $curwidget = $wstack[0] if((scalar @wstack) > 0);
504 } elsif(!$_) {
505 } else {
506 print STDERR "Invalid construct: $_\n";
507 }
508}
509
4dda7bfa
FT
510if($args{"h"})
511{
512 $hfile = IO::File->new($args{"h"}, "w") || die;
513 printheader $rootwidgets, $hfile;
514 $hfile->close();
515}
516
d3372da9 517printvars $rootwidgets;
518print "\n";
519print "GtkWidget *create_" . $options{"prefix"} . "wnd(void)\n";
520print "{\n";
521print " GtkWidget *stack[$maxstack];\n";
522print " GtkAccelGroup *accel_group;\n" if $options{"hasaccels"};
523print " GtkTreeViewColumn *column;\n" if $options{"hascolumns"};
524print " GtkCellRenderer *renderer;\n" if $options{"hasrenderers"};
525print " \n";
526print " accel_group = gtk_accel_group_new();\n" if $options{"hasaccels"};
527printwidgets $rootwidgets, 0;
528print " return(stack[0]);\n";
529print "}\n";