further work on the yet to come welcome page ...
[obnox/wireshark/wip.git] / gtk / main_welcome.c
1 /* main_welcome.c
2  *
3  * $Id$
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  */
24
25 #ifdef HAVE_CONFIG_H
26 # include "config.h"
27 #endif
28
29 #include <gtk/gtk.h>
30
31 #include <epan/prefs.h>
32
33 #include "../color.h"
34 #include "capture.h"
35 #include "capture-pcap-util.h"
36 #include "capture_opts.h"
37 #include "simple_dialog.h"
38
39 #include "gtk/gui_utils.h"
40 #include "gtk/color_utils.h"
41 #include "gtk/recent.h"
42 #include "gtk/gtkglobals.h"
43 #include "gtk/main.h"
44 #include "gtk/main_menu.h"
45 #include "gtk/main_welcome.h"
46 #include "gtk/capture_dlg.h"
47 #include "gtk/capture_file_dlg.h"
48 #include "gtk/help_dlg.h"
49 #include "gtk/stock_icons.h"
50
51
52
53
54 /* XXX - There seems to be some disagreement about if and how this feature should be implemented.
55    As I currently don't have the time to continue this, it's temporarily disabled. - ULFL */
56 /*#define SHOW_WELCOME_PAGE*/
57
58 #ifdef SHOW_WELCOME_PAGE
59 #include "../image/wssplash.xpm"
60 #endif
61
62
63 #ifdef SHOW_WELCOME_PAGE
64
65
66 /* XXX */
67 extern gint if_list_comparator_alph (const void *first_arg, const void *second_arg);
68
69
70 GdkColor topic_item_entered_bg;
71 GdkColor topic_content_bg;
72 GdkColor header_bar_bg;
73 GdkColor topic_header_bg;
74
75 GtkWidget *welcome_file_panel_vb = NULL;
76
77
78
79 /* mouse entered this widget - change background color */
80 static gboolean
81 welcome_item_enter_cb(GtkWidget *eb, GdkEventCrossing *event _U_, gpointer user_data _U_)
82 {
83     gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_item_entered_bg);
84
85     return FALSE;
86 }
87
88 /* mouse has left this widget - change background color  */
89 static gboolean
90 welcome_item_leave_cb(GtkWidget *eb, GdkEvent *event _U_, gpointer user_data _U_)
91 {
92     gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_content_bg);
93
94     return FALSE;
95 }
96
97
98 /* create a "button widget" */
99 GtkWidget *
100 welcome_button(const gchar *stock_item, const gchar * title, const gchar * subtitle,
101                          GtkSignalFunc callback, void *callback_data)
102 {
103     GtkWidget *eb, *w, *item_hb, *text_vb;
104     gchar *formatted_text;
105
106
107     item_hb = gtk_hbox_new(FALSE, 1);
108
109     /* event box (for background color and events) */
110     eb = gtk_event_box_new();
111     gtk_container_add(GTK_CONTAINER(eb), item_hb);
112     gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_content_bg);
113
114     g_signal_connect(eb, "enter-notify-event", G_CALLBACK(welcome_item_enter_cb), NULL);
115     g_signal_connect(eb, "leave-notify-event", G_CALLBACK(welcome_item_leave_cb), NULL);
116     g_signal_connect(eb, "button-press-event", G_CALLBACK(callback), callback_data);
117
118     /* icon */
119     w = gtk_image_new_from_stock(stock_item, GTK_ICON_SIZE_LARGE_TOOLBAR);
120     gtk_box_pack_start(GTK_BOX(item_hb), w, FALSE, FALSE, 5);
121     g_signal_connect(w, "clicked", G_CALLBACK(callback), callback_data);
122
123     text_vb = gtk_vbox_new(FALSE, 3);
124
125     /* title */
126     w = gtk_label_new(title);
127     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.5);
128     formatted_text = g_strdup_printf("<span weight=\"bold\" size=\"x-large\">%s</span>", title);
129     gtk_label_set_markup(GTK_LABEL(w), formatted_text);
130     g_free(formatted_text);
131     gtk_box_pack_start(GTK_BOX(text_vb), w, FALSE, FALSE, 1);
132     
133     /* subtitle */
134     w = gtk_label_new(subtitle);
135     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.5);
136     formatted_text = g_strdup_printf("<span size=\"small\">%s</span>", subtitle);
137     gtk_label_set_markup(GTK_LABEL(w), formatted_text);
138     g_free(formatted_text);
139     gtk_box_pack_start(GTK_BOX(text_vb), w, FALSE, FALSE, 1);
140     
141     gtk_box_pack_start(GTK_BOX(item_hb), text_vb, TRUE, TRUE, 5);
142
143     return eb;
144 }
145
146
147 /* create the banner "above our heads" */
148 GtkWidget *
149 welcome_header_new(void)
150 {
151     GtkWidget *item_vb;
152     GtkWidget *item_hb;
153     GtkWidget *eb;
154     GtkWidget *icon;
155     gchar *message;
156     GtkWidget *w;
157
158
159     item_vb = gtk_vbox_new(FALSE, 0);
160
161     /* colorize vbox */
162     eb = gtk_event_box_new();
163     gtk_container_add(GTK_CONTAINER(eb), item_vb);
164     gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &header_bar_bg);
165
166     item_hb = gtk_hbox_new(FALSE, 0);
167     gtk_box_pack_start(GTK_BOX(item_vb), item_hb, FALSE, FALSE, 10);
168
169     icon = xpm_to_widget_from_parent(top_level, wssplash_xpm);
170     gtk_box_pack_start(GTK_BOX(item_hb), icon, FALSE, FALSE, 10);
171
172     message = "<span weight=\"bold\" size=\"x-large\">" "The World's Most Popular Network Protocol Analyzer" "</span>";
173     w = gtk_label_new(message);
174     gtk_label_set_markup(GTK_LABEL(w), message);
175     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.5);
176     gtk_box_pack_start(GTK_BOX(item_hb), w, TRUE, TRUE, 5);
177
178     gtk_widget_show_all(eb);
179
180     return eb;
181 }
182
183
184 /* create a "topic header widget" */
185 GtkWidget *
186 welcome_topic_header_new(const char *header)
187 {
188     GtkWidget *w;
189     GtkWidget *eb;
190     gchar *formatted_message;
191
192
193     w = gtk_label_new(header);
194     formatted_message = g_strdup_printf("<span weight=\"bold\" size=\"x-large\">%s</span>", header);
195     gtk_label_set_markup(GTK_LABEL(w), formatted_message);
196     g_free(formatted_message);
197
198     /* colorize vbox */
199     eb = gtk_event_box_new();
200     gtk_container_add(GTK_CONTAINER(eb), w);
201     gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_header_bg);
202
203     return eb;
204 }
205
206
207 /* create a "topic widget" */
208 GtkWidget *
209 welcome_topic_new(const char *header, GtkWidget **to_fill)
210 {
211     GtkWidget *topic_vb;
212     GtkWidget *layout_vb;
213     GtkWidget *topic_eb;
214     GtkWidget *topic_header;
215
216
217     topic_vb = gtk_vbox_new(FALSE, 0);
218
219     topic_header = welcome_topic_header_new(header);
220     gtk_box_pack_start(GTK_BOX(topic_vb), topic_header, FALSE, FALSE, 0);
221
222     layout_vb = gtk_vbox_new(FALSE, 5);
223     gtk_container_border_width(GTK_CONTAINER(layout_vb), 10);
224     gtk_box_pack_start(GTK_BOX(topic_vb), layout_vb, FALSE, FALSE, 0);
225
226     /* colorize vbox (we need an event box for this!) */
227     topic_eb = gtk_event_box_new();
228     gtk_container_add(GTK_CONTAINER(topic_eb), topic_vb);
229     gtk_widget_modify_bg(topic_eb, GTK_STATE_NORMAL, &topic_content_bg);
230     *to_fill = layout_vb;
231
232     return topic_eb;
233 }
234
235
236 /* a file link was pressed */
237 static gboolean
238 welcome_filename_link_press_cb(GtkWidget *widget _U_, GdkEvent *event _U_, gpointer data)
239 {
240     menu_open_filename(data);
241
242     return FALSE;
243 }
244
245
246 /* create a "file link widget" */
247 GtkWidget *
248 welcome_filename_link_new(const gchar *filename, GtkWidget **label)
249 {
250     GtkWidget *w;
251     GtkWidget *eb;
252     GString             *str;
253     const unsigned int max = 60;
254
255
256     str = g_string_new(filename);
257
258     if(str->len > max) {
259         g_string_erase(str, 0, str->len-max /*cut*/);
260         g_string_prepend(str, "... ");
261     }
262
263     g_string_prepend(str, "<span foreground='blue'>");
264     g_string_append(str, "</span>");
265
266     w = gtk_label_new(str->str);
267     *label = w;
268     gtk_label_set_markup(GTK_LABEL(w), str->str);
269     gtk_misc_set_padding(GTK_MISC(w), 5, 2);
270
271         /* event box */
272     eb = gtk_event_box_new();
273     gtk_container_add(GTK_CONTAINER(eb), w);
274     
275     g_signal_connect(eb, "enter-notify-event", G_CALLBACK(welcome_item_enter_cb), w);
276     g_signal_connect(eb, "leave-notify-event", G_CALLBACK(welcome_item_leave_cb), w);
277     g_signal_connect(eb, "button-press-event", G_CALLBACK(welcome_filename_link_press_cb), (gchar *) filename);
278
279     g_string_free(str, TRUE);
280
281     return eb;
282 }
283
284
285 /* reset the list of recent files */
286 void
287 main_welcome_reset_recent_capture_files()
288 {
289     GList* child_list;
290     GList* child_list_item;
291     
292     child_list = gtk_container_get_children(GTK_CONTAINER(welcome_file_panel_vb));
293     child_list_item = child_list;
294
295     while(child_list_item) {
296         gtk_container_remove(GTK_CONTAINER(welcome_file_panel_vb), child_list_item->data);
297         child_list_item = g_list_next(child_list_item);
298     }
299
300     g_list_free(child_list);
301 }
302
303
304 /* add a new file to the list of recent files */
305 void
306 main_welcome_add_recent_capture_files(const char *widget_cf_name)
307 {
308     GtkWidget *w;
309     GtkWidget *label;
310
311     w = welcome_filename_link_new(widget_cf_name, &label);
312     gtk_widget_modify_bg(w, GTK_STATE_NORMAL, &topic_content_bg);
313     gtk_misc_set_alignment (GTK_MISC(label), 0.0, 0.0);
314     gtk_box_pack_start(GTK_BOX(welcome_file_panel_vb), w, FALSE, FALSE, 0);
315     gtk_widget_show_all(w);
316 }
317
318
319 #ifdef HAVE_LIBPCAP
320 /* user clicked on an interface button */
321 static gboolean
322 welcome_if_press_cb(GtkWidget *widget _U_, GdkEvent *event _U_, gpointer data)
323 {
324     if (capture_opts->iface)
325         g_free(capture_opts->iface);
326     if (capture_opts->iface_descr)
327         g_free(capture_opts->iface_descr);
328
329     capture_opts->iface = g_strdup(data);
330     capture_opts->iface_descr = NULL;
331     /* XXX - fix this */
332     /*capture_opts->iface_descr = get_interface_descriptive_name(capture_opts->iface);*/
333
334     /* XXX - remove this? */
335     if (capture_opts->save_file) {
336     g_free(capture_opts->save_file);
337     capture_opts->save_file = NULL;
338     }
339
340     capture_start_cb(NULL, NULL);
341
342     return FALSE;
343 }
344
345
346 /* create a single interface entry */
347 static GtkWidget *
348 welcome_if_new(const char *if_name, GdkColor *topic_bg, gpointer interf)
349 {
350     GtkWidget *interface_hb;
351     GtkWidget *w;
352     GString   *message;
353     GtkWidget *eb;
354
355
356     /* event box */
357     eb = gtk_event_box_new();
358     gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_content_bg);
359
360     g_signal_connect(eb, "enter-notify-event", G_CALLBACK(welcome_item_enter_cb), NULL);
361     g_signal_connect(eb, "leave-notify-event", G_CALLBACK(welcome_item_leave_cb), NULL);
362     g_signal_connect(eb, "button-press-event", G_CALLBACK(welcome_if_press_cb), interf);
363
364     interface_hb = gtk_hbox_new(FALSE, 5);
365     gtk_container_add(GTK_CONTAINER(eb), interface_hb);
366
367     /* icon */
368     w = gtk_image_new_from_stock(WIRESHARK_STOCK_CAPTURE_START, GTK_ICON_SIZE_SMALL_TOOLBAR);
369     gtk_box_pack_start(GTK_BOX(interface_hb), w, FALSE, FALSE, 5);
370
371     message = g_string_new(if_name);
372
373     /* truncate string if it's too long */
374     /* (the number of chars is a bit arbitrary, though) */
375     if(message->len > 48) {
376         g_string_truncate(message, 45);
377         g_string_append  (message, " ...");
378     }
379     g_string_prepend(message, "<span foreground='blue'>");
380     g_string_append (message, "</span>");
381     w = gtk_label_new(message->str);
382     gtk_label_set_markup(GTK_LABEL(w), message->str);
383     g_string_free(message, TRUE);
384
385     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.0);
386     gtk_box_pack_start(GTK_BOX(interface_hb), w, FALSE, FALSE, 0);
387
388     return eb;
389 }
390
391
392 /* create the list of interfaces */
393 GtkWidget *
394 welcome_if_panel_new(void)
395 {
396     GtkWidget *interface_hb;
397     GtkWidget *panel_vb;
398
399   if_info_t     *if_info;
400 GList           *if_list;
401 int err;
402   gchar         *err_str;
403   int           ifs;
404   GList         *curr;
405   /*if_dlg_data_t *if_dlg_data;*/
406
407     panel_vb = gtk_vbox_new(FALSE, 0);
408
409 #if 0
410 #ifdef _WIN32
411   /* Is WPcap loaded? */
412   if (!has_wpcap) {
413     char *detailed_err;
414
415     detailed_err = cant_load_winpcap_err("Wireshark");
416     simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", detailed_err);
417     g_free(detailed_err);
418     return;
419   }
420 #endif
421 #endif
422
423   /* LOAD THE INTERFACES */
424   if_list = capture_interface_list(&err, &err_str);
425   if_list = g_list_sort (if_list, if_list_comparator_alph);
426   if (if_list == NULL && err == CANT_GET_INTERFACE_LIST) {
427     simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
428     g_free(err_str);
429     return NULL;
430   }
431
432   /* List the interfaces */
433   for(ifs = 0; (curr = g_list_nth(if_list, ifs)); ifs++) {
434       /*g_string_assign(if_tool_str, "");*/
435       if_info = curr->data;
436
437       /* Continue if capture device is hidden */
438       if (prefs_is_capture_device_hidden(if_info->name)) {
439           continue;
440       }
441
442       /*if_dlg_data = g_malloc0(sizeof(if_dlg_data_t));*/
443       /*if_dlg_data->if_info = *if_info;*/
444
445       /* Kind of adaptor (icon) */
446       /*icon = xpm_to_widget(capture_ethernet_16_xpm);*/
447       /*gtk_table_attach_defaults(GTK_TABLE(if_tb), icon, 0, 1, row, row+1);*/
448
449       /* description */
450       /*if (if_info->description != NULL)*/
451         /*if_dlg_data->descr_lb = gtk_label_new(if_info->description);*/
452       /*else*/
453         /*if_dlg_data->descr_lb = gtk_label_new("");*/
454       /*gtk_misc_set_alignment(GTK_MISC(if_dlg_data->descr_lb), 0.0, 0.5);*/
455       /*gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->descr_lb, 2, 3, row, row+1);*/
456
457 #if 0
458       if (if_info->description) {
459         g_string_append(if_tool_str, "Description: ");
460         g_string_append(if_tool_str, if_info->description);
461         g_string_append(if_tool_str, "\n");
462       }
463 #endif
464
465     interface_hb = welcome_if_new(if_info->description, &topic_content_bg, g_strdup(if_info->name));
466     gtk_box_pack_start(GTK_BOX(panel_vb), interface_hb, FALSE, FALSE, 2);
467
468 #if 0
469       /* IP address */
470       /* only the first IP address will be shown */
471       g_string_append(if_tool_str, "IP: ");
472       curr_ip = g_slist_nth(if_info->ip_addr, 0);
473       if(curr_ip) {
474         ip_addr = (if_addr_t *)curr_ip->data;
475         switch (ip_addr->type) {
476
477         case AT_IPv4:
478           tmp_str = ip_to_str((guint8 *)&ip_addr->ip_addr.ip4_addr);
479           break;
480
481         case AT_IPv6:
482           tmp_str = ip6_to_str((struct e_in6_addr *)&ip_addr->ip_addr.ip6_addr);
483           break;
484
485         default:
486           g_assert_not_reached();
487           tmp_str = NULL;
488         }
489         if_dlg_data->ip_lb = gtk_label_new(tmp_str);
490         gtk_widget_set_sensitive(if_dlg_data->ip_lb, TRUE);
491         g_string_append(if_tool_str, tmp_str);
492       } else {
493         if_dlg_data->ip_lb = gtk_label_new("unknown");
494         gtk_widget_set_sensitive(if_dlg_data->ip_lb, FALSE);
495         g_string_append(if_tool_str, "unknown");
496       }
497 #endif
498   }
499
500     free_interface_list(if_list);
501
502     return panel_vb;
503 }
504 #endif  /* HAVE_LIBPCAP */
505
506
507 /* create the welcome page */
508 GtkWidget *
509 welcome_new(void)
510 {
511     GtkWidget *welcome_scrollw;
512     GtkWidget *welcome_vb;
513     GtkWidget *welcome_hb;
514     GtkWidget *column_vb;
515     GtkWidget *item_hb;
516     GtkWidget *w;
517     GtkWidget *header;
518     GtkWidget *topic_vb;
519     GtkWidget *topic_to_fill;
520
521
522     /* prepare colors */
523     /* header bar background color */
524     header_bar_bg.pixel = 0;
525     header_bar_bg.red = 154 * 255;
526     header_bar_bg.green = 210 * 255;
527     header_bar_bg.blue = 229 * 255;
528     get_color(&header_bar_bg);
529
530     /* topic header background color */
531     topic_header_bg.pixel = 0;
532     topic_header_bg.red = 24 * 255;
533     topic_header_bg.green = 151 * 255;
534     topic_header_bg.blue = 192 * 255;
535     get_color(&topic_header_bg);
536
537         /* topic content background color */
538     topic_content_bg.pixel = 0;
539     topic_content_bg.red = 221 * 255;
540     topic_content_bg.green = 226 * 255;
541     topic_content_bg.blue = 228 * 255;
542     get_color(&topic_content_bg);
543
544         /* topic item entered color */
545     topic_item_entered_bg.pixel = 0;
546     topic_item_entered_bg.red = 154 * 255;
547     topic_item_entered_bg.green = 210 * 255;
548     topic_item_entered_bg.blue = 229 * 255;
549     get_color(&topic_item_entered_bg);
550
551
552     welcome_scrollw = scrolled_window_new(NULL, NULL);
553
554     welcome_vb = gtk_vbox_new(FALSE, 0);
555
556     /* header */
557     header = welcome_header_new();
558     gtk_box_pack_start(GTK_BOX(welcome_vb), header, FALSE, FALSE, 0);
559
560     /* content */
561     welcome_hb = gtk_hbox_new(FALSE, 10);
562     gtk_container_border_width(GTK_CONTAINER(welcome_hb), 10);
563     gtk_box_pack_start(GTK_BOX(welcome_vb), welcome_hb, TRUE, TRUE, 0);
564
565
566     /* column capture */
567     column_vb = gtk_vbox_new(FALSE, 10);
568     gtk_box_pack_start(GTK_BOX(welcome_hb), column_vb, TRUE, TRUE, 0);
569
570     /* capture topic */
571     topic_vb = welcome_topic_new("Capture", &topic_to_fill);
572     gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);
573
574 #ifdef HAVE_LIBPCAP
575     item_hb = welcome_button(WIRESHARK_STOCK_CAPTURE_INTERFACES,
576         "Interface List",
577                 "Life list of the capture interfaces (counts incoming packets)",
578         GTK_SIGNAL_FUNC(capture_if_cb), NULL);
579     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
580
581     w = gtk_label_new("Start capture on interface:");
582     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.0);
583     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 5);
584
585     w = welcome_if_panel_new();
586     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 0);
587
588     item_hb = welcome_button(WIRESHARK_STOCK_CAPTURE_OPTIONS,
589         "Capture Options",
590                 "Start a capture with detailed options",
591         GTK_SIGNAL_FUNC(capture_prep_cb), NULL);
592     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
593
594     /* capture help topic */
595     topic_vb = welcome_topic_new("Capture Help", &topic_to_fill);
596     gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);
597
598     item_hb = welcome_button(WIRESHARK_STOCK_WIKI,
599                 "How to Capture",
600                 "Step by step to a successful capture setup",
601         GTK_SIGNAL_FUNC(topic_menu_cb), GINT_TO_POINTER(ONLINEPAGE_CAPTURE_SETUP));
602     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
603
604     item_hb = welcome_button(WIRESHARK_STOCK_WIKI,
605                 "Network Media",
606         "Specific infos for capturing on: Ethernet, WLAN, ...",
607         GTK_SIGNAL_FUNC(topic_menu_cb), GINT_TO_POINTER(ONLINEPAGE_NETWORK_MEDIA));
608     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
609 #else
610     /* place a note that capturing is not compiled in */
611     w = gtk_label_new("Capturing is not compiled into this version of Wireshark!");
612     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.0);
613     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 5);
614 #endif  /* HAVE_LIBPCAP */
615
616     /* fill bottom space */
617     w = gtk_label_new("");
618     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, TRUE, TRUE, 0);
619
620
621     /* column files */
622     topic_vb = welcome_topic_new("Files", &topic_to_fill);
623     gtk_box_pack_start(GTK_BOX(welcome_hb), topic_vb, TRUE, TRUE, 0);
624
625     item_hb = welcome_button(GTK_STOCK_OPEN,
626         "Open",
627                 "Open a previously captured file",
628         GTK_SIGNAL_FUNC(file_open_cmd_cb), NULL);
629     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
630
631     /* prepare list of recent files (will be filled in later) */
632     w = gtk_label_new("Open Recent:");
633     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.0);
634     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 5);
635
636     welcome_file_panel_vb = gtk_vbox_new(FALSE, 1);
637     gtk_box_pack_start(GTK_BOX(topic_to_fill), welcome_file_panel_vb, FALSE, FALSE, 0);
638
639     item_hb = welcome_button(WIRESHARK_STOCK_WIKI,
640         "Sample Captures",
641                 "A rich assortment of example capture files on the wiki",
642         GTK_SIGNAL_FUNC(topic_menu_cb), GINT_TO_POINTER(ONLINEPAGE_SAMPLE_CAPTURES));
643     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
644
645     /* fill bottom space */
646     w = gtk_label_new("");
647     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, TRUE, TRUE, 0);
648
649
650     /* column online */
651     column_vb = gtk_vbox_new(FALSE, 10);
652     gtk_box_pack_start(GTK_BOX(welcome_hb), column_vb, TRUE, TRUE, 0);
653
654     /* topic online */
655     topic_vb = welcome_topic_new("Online", &topic_to_fill);
656     gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);
657
658     item_hb = welcome_button(GTK_STOCK_HOME,
659         "Website",
660                 "Visit the project's website",
661         GTK_SIGNAL_FUNC(topic_menu_cb), GINT_TO_POINTER(ONLINEPAGE_HOME));
662     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
663
664     item_hb = welcome_button(GTK_STOCK_HELP,
665         "User's Guide",
666                 "The User's Guide (local version, if installed)",
667         GTK_SIGNAL_FUNC(topic_menu_cb), GINT_TO_POINTER(HELP_CONTENT));
668     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
669
670     item_hb = welcome_button(WIRESHARK_STOCK_WIKI,
671         "Security",
672                 "Work with Wireshark as secure as possible",
673         GTK_SIGNAL_FUNC(topic_menu_cb), GINT_TO_POINTER(ONLINEPAGE_SECURITY));
674     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
675
676 #if 0
677     /* XXX - add this, once the Windows update functionality is implemented */
678     /* topic updates */
679     topic_vb = welcome_topic_new("Updates", &topic_to_fill);
680     gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);
681
682     w = gtk_label_new("No updates available!");
683     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, TRUE, TRUE, 0);
684 #endif
685
686
687     /* the end */
688     gtk_widget_show_all(welcome_vb);
689
690     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(welcome_scrollw),
691                                           welcome_vb);
692     gtk_widget_show_all(welcome_scrollw);
693
694     return welcome_scrollw;
695 }
696 #else   /* SHOW_WELCOME_PAGE */
697
698 /* SOME DUMMY FUNCTIONS, UNTIL THE WELCOME PAGE GET'S LIVE */
699 void main_welcome_reset_recent_capture_files(void)
700 {
701 }
702
703 /* add a new file to the list of recently used files */
704 void main_welcome_add_recent_capture_files(const char *widget_cf_name _U_)
705 {
706 }
707
708 GtkWidget *
709 welcome_new(void)
710 {
711     /* this is just a dummy to fill up window space, simply showing nothing */
712     return scrolled_window_new(NULL, NULL);
713 }
714 #endif
715
716