7ede153f35b6c60067a446d6bd6992597b2de938
[obnox/wireshark/wip.git] / gtk / main_welcome.c
1 /* main_welcome.c\r
2  *\r
3  * $Id: main_welcome.c 24577 2008-03-06 18:26:09Z stig $\r
4  *\r
5  * Wireshark - Network traffic analyzer\r
6  * By Gerald Combs <gerald@wireshark.org>\r
7  * Copyright 1998 Gerald Combs\r
8  *\r
9  *\r
10  * This program is free software; you can redistribute it and/or\r
11  * modify it under the terms of the GNU General Public License\r
12  * as published by the Free Software Foundation; either version 2\r
13  * of the License, or (at your option) any later version.\r
14  *\r
15  * This program is distributed in the hope that it will be useful,\r
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
18  * GNU General Public License for more details.\r
19  *\r
20  * You should have received a copy of the GNU General Public License\r
21  * along with this program; if not, write to the Free Software\r
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
23  */\r
24 \r
25 \r
26 #include <gtk/gtk.h>\r
27 \r
28 #include "gui_utils.h"\r
29 #include "recent.h"\r
30 #include "main_welcome.h"\r
31 \r
32 \r
33 #ifdef SHOW_WELCOME_PAGE\r
34 #include "../image/wssplash.xpm"\r
35 #endif\r
36 \r
37 \r
38 /*#define SHOW_WELCOME_PAGE*/\r
39 #ifdef SHOW_WELCOME_PAGE\r
40 /* XXX - There seems to be some disagreement about if and how this feature should be implemented.\r
41    As I currently don't have the time to continue this, it's temporarily disabled. - ULFL */\r
42 GtkWidget *\r
43 welcome_item(const gchar *stock_item, const gchar * label, const gchar * message, const gchar * tooltip,\r
44                          GtkSignalFunc callback, void *callback_data)\r
45 {\r
46     GtkWidget *w, *item_hb;\r
47 #if GTK_MAJOR_VERSION >= 2\r
48     gchar *formatted_message;\r
49     GtkTooltips *tooltips;\r
50 \r
51     tooltips = gtk_tooltips_new();\r
52 #endif\r
53 \r
54     item_hb = gtk_hbox_new(FALSE, 1);\r
55 \r
56     w = BUTTON_NEW_FROM_STOCK(stock_item);\r
57     WIDGET_SET_SIZE(w, 80, 40);\r
58 #if GTK_MAJOR_VERSION >= 2\r
59     gtk_button_set_label(GTK_BUTTON(w), label);\r
60     gtk_tooltips_set_tip(tooltips, w, tooltip, NULL);\r
61 #endif\r
62     gtk_box_pack_start(GTK_BOX(item_hb), w, FALSE, FALSE, 0);\r
63     SIGNAL_CONNECT(w, "clicked", callback, callback_data);\r
64 \r
65     w = gtk_label_new(message);\r
66     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.5);\r
67 #if GTK_MAJOR_VERSION >= 2\r
68     formatted_message = g_strdup_printf("<span weight=\"bold\" size=\"x-large\">%s</span>", message);\r
69     gtk_label_set_markup(GTK_LABEL(w), formatted_message);\r
70     g_free(formatted_message);\r
71 #endif\r
72 \r
73     gtk_box_pack_start(GTK_BOX(item_hb), w, FALSE, FALSE, 10);\r
74 \r
75     return item_hb;\r
76 }\r
77 \r
78 \r
79 GtkWidget *\r
80 welcome_header_new(void)\r
81 {\r
82     GtkWidget *item_vb;\r
83     GtkWidget *item_hb;\r
84     GtkWidget *eb;\r
85     GdkColor bg;\r
86     GtkWidget *icon;\r
87     gchar *message;\r
88     GtkWidget *w;\r
89 \r
90 \r
91     /* background color of the header bar */\r
92     bg.pixel = 0;\r
93     bg.red = 154 * 255;\r
94     bg.green = 210 * 255;\r
95     bg.blue = 229 * 255;\r
96 \r
97     item_vb = gtk_vbox_new(FALSE, 0);\r
98 \r
99     /* colorize vbox */\r
100     get_color(&bg);\r
101     eb = gtk_event_box_new();\r
102     gtk_container_add(GTK_CONTAINER(eb), item_vb);\r
103 #if GTK_MAJOR_VERSION >= 2\r
104     gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &bg);\r
105 #endif\r
106 \r
107     item_hb = gtk_hbox_new(FALSE, 0);\r
108     gtk_box_pack_start(GTK_BOX(item_vb), item_hb, FALSE, FALSE, 10);\r
109 \r
110     icon = xpm_to_widget_from_parent(top_level, wssplash_xpm);\r
111     /*icon = xpm_to_widget_from_parent(top_level, wsicon64_xpm);*/\r
112     gtk_box_pack_start(GTK_BOX(item_hb), icon, FALSE, FALSE, 10);\r
113 \r
114 #if GTK_MAJOR_VERSION < 2\r
115     message = "The World's Most Popular Network Protocol Analyzer";\r
116 #else\r
117     message = "<span weight=\"bold\" size=\"x-large\">" "The World's Most Popular Network Protocol Analyzer" "</span>";\r
118 #endif\r
119     w = gtk_label_new(message);\r
120 #if GTK_MAJOR_VERSION >= 2\r
121     gtk_label_set_markup(GTK_LABEL(w), message);\r
122 #endif\r
123     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.5);\r
124     gtk_box_pack_start(GTK_BOX(item_hb), w, TRUE, TRUE, 5);\r
125 \r
126     gtk_widget_show_all(eb);\r
127 \r
128     return eb;\r
129 }\r
130 \r
131 GtkWidget *\r
132 welcome_topic_header_new(const char *header)\r
133 {\r
134     GtkWidget *w;\r
135     GdkColor bg;\r
136     GtkWidget *eb;\r
137 #if GTK_MAJOR_VERSION >= 2\r
138     gchar *formatted_message;\r
139 #endif\r
140 \r
141 \r
142     w = gtk_label_new(header);\r
143 #if GTK_MAJOR_VERSION >= 2\r
144     formatted_message = g_strdup_printf("<span weight=\"bold\" size=\"x-large\">%s</span>", header);\r
145     gtk_label_set_markup(GTK_LABEL(w), formatted_message);\r
146     g_free(formatted_message);\r
147 #endif\r
148 \r
149     /* topic header background color */\r
150     bg.pixel = 0;\r
151     bg.red = 24 * 255;\r
152     bg.green = 151 * 255;\r
153     bg.blue = 192 * 255;\r
154 \r
155     /* colorize vbox */\r
156     get_color(&bg);\r
157     eb = gtk_event_box_new();\r
158     gtk_container_add(GTK_CONTAINER(eb), w);\r
159 #if GTK_MAJOR_VERSION >= 2\r
160     gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &bg);\r
161 #endif\r
162 \r
163     return eb;\r
164 }\r
165 \r
166 \r
167 GtkWidget *\r
168 welcome_topic_new(const char *header, GtkWidget **to_fill)\r
169 {\r
170     GtkWidget *topic_vb;\r
171     GtkWidget *layout_vb;\r
172     GtkWidget *topic_eb;\r
173     GtkWidget *topic_header;\r
174     GdkColor bg;\r
175 \r
176     topic_vb = gtk_vbox_new(FALSE, 0);\r
177 \r
178         /* topic content background color */\r
179     bg.pixel = 0;\r
180     bg.red = 221 * 255;\r
181     bg.green = 226 * 255;\r
182     bg.blue = 228 * 255;\r
183 \r
184     topic_header = welcome_topic_header_new(header);\r
185     gtk_box_pack_start(GTK_BOX(topic_vb), topic_header, FALSE, FALSE, 0);\r
186 \r
187     layout_vb = gtk_vbox_new(FALSE, 5);\r
188     gtk_container_border_width(GTK_CONTAINER(layout_vb), 10);\r
189     gtk_box_pack_start(GTK_BOX(topic_vb), layout_vb, FALSE, FALSE, 0);\r
190 \r
191     /* colorize vbox (we need an event box for this!) */\r
192     get_color(&bg);\r
193     topic_eb = gtk_event_box_new();\r
194     gtk_container_add(GTK_CONTAINER(topic_eb), topic_vb);\r
195 #if GTK_MAJOR_VERSION >= 2\r
196     gtk_widget_modify_bg(topic_eb, GTK_STATE_NORMAL, &bg);\r
197 #endif\r
198     *to_fill = layout_vb;\r
199 \r
200     return topic_eb;\r
201 }\r
202 \r
203 \r
204 #if GTK_MAJOR_VERSION >= 2\r
205 static gboolean\r
206 welcome_link_enter_cb(GtkWidget *widget _U_, GdkEventCrossing *event _U_, gpointer user_data)\r
207 {\r
208     gchar *message;\r
209     GtkWidget *w = user_data;\r
210 \r
211     message = g_strdup_printf("<span foreground='blue' underline='single'>%s</span>", OBJECT_GET_DATA(w,"TEXT"));\r
212 #if GTK_MAJOR_VERSION >= 2\r
213     gtk_label_set_markup(GTK_LABEL(w), message);\r
214 #endif\r
215     g_free(message);\r
216 \r
217     return FALSE;\r
218 }\r
219 \r
220 static gboolean\r
221 welcome_link_leave_cb(GtkWidget *widget _U_, GdkEvent *event _U_, gpointer user_data)\r
222 {\r
223     gchar *message;\r
224     GtkWidget *w = user_data;\r
225 \r
226     message = g_strdup_printf("<span foreground='blue'>%s</span>", OBJECT_GET_DATA(w,"TEXT"));\r
227 #if GTK_MAJOR_VERSION >= 2\r
228     gtk_label_set_markup(GTK_LABEL(w), message);\r
229 #endif\r
230     g_free(message);\r
231 \r
232     return FALSE;\r
233 }\r
234 #endif\r
235 \r
236 \r
237 static gboolean\r
238 welcome_link_press_cb(GtkWidget *widget _U_, GdkEvent *event _U_, gpointer data _U_) {\r
239 \r
240     g_warning("TBD: link pressed");\r
241 \r
242     return FALSE;\r
243 }\r
244 \r
245 GtkWidget *\r
246 welcome_link_new(const gchar *text, GtkWidget **label /*, void *callback, void *private_data */)\r
247 {\r
248     gchar *message;\r
249     GtkWidget *w;\r
250     GtkWidget *eb;\r
251 \r
252 #if GTK_MAJOR_VERSION < 2\r
253     message = g_strdup(text);\r
254 #else\r
255     message = g_strdup_printf("<span foreground='blue'>%s</span>", text);\r
256 #endif\r
257     w = gtk_label_new(message);\r
258     *label = w;\r
259 #if GTK_MAJOR_VERSION >= 2\r
260     gtk_label_set_markup(GTK_LABEL(w), message);\r
261 #endif\r
262     g_free(message);\r
263 \r
264         /* event box */\r
265     eb = gtk_event_box_new();\r
266     gtk_container_add(GTK_CONTAINER(eb), w);\r
267 \r
268 #if GTK_MAJOR_VERSION >= 2\r
269     SIGNAL_CONNECT(eb, "enter-notify-event", welcome_link_enter_cb, w);\r
270     SIGNAL_CONNECT(eb, "leave-notify-event", welcome_link_leave_cb, w);\r
271 #endif\r
272     SIGNAL_CONNECT(eb, "button-press-event", welcome_link_press_cb, w);\r
273 \r
274     /* XXX - memleak */\r
275     OBJECT_SET_DATA(w, "TEXT", g_strdup(text));\r
276 \r
277     return eb;\r
278 }\r
279 \r
280 GtkWidget *\r
281 welcome_filename_link_new(const char *filename, GtkWidget **label)\r
282 {\r
283     GString             *str;\r
284     GtkWidget   *w;\r
285     const unsigned int max = 60;\r
286 \r
287 \r
288     str = g_string_new(filename);\r
289 \r
290     if(str->len > max) {\r
291         g_string_erase(str, 0, str->len-max /*cut*/);\r
292         g_string_prepend(str, "... ");\r
293     }\r
294 \r
295     w = welcome_link_new(str->str, label);\r
296 \r
297     g_string_free(str, TRUE);\r
298 \r
299     return w;\r
300 }\r
301 \r
302 \r
303 GtkWidget *\r
304 welcome_if_new(const char *if_name, GdkColor *topic_bg, gboolean active)\r
305 {\r
306     GtkWidget *interface_hb;\r
307     GtkWidget *w;\r
308     GtkWidget *label;\r
309     GtkTooltips *tooltips;\r
310     GString   *message;\r
311 \r
312 \r
313     tooltips = gtk_tooltips_new();\r
314 \r
315     interface_hb = gtk_hbox_new(FALSE, 5);\r
316 \r
317     w = welcome_link_new("START", &label);\r
318     gtk_tooltips_set_tip(tooltips, w, "Immediately start a capture on this interface", NULL);\r
319 #if GTK_MAJOR_VERSION >= 2\r
320     gtk_widget_modify_bg(w, GTK_STATE_NORMAL, topic_bg);\r
321 #endif\r
322     gtk_misc_set_alignment (GTK_MISC(label), 0.0, 0.0);\r
323     gtk_box_pack_start(GTK_BOX(interface_hb), w, FALSE, FALSE, 0);\r
324 \r
325     w = welcome_link_new("OPTIONS", &label);\r
326     gtk_tooltips_set_tip(tooltips, w, "Show the capture options of this interface", NULL);\r
327 #if GTK_MAJOR_VERSION >= 2\r
328     gtk_widget_modify_bg(w, GTK_STATE_NORMAL, topic_bg);\r
329 #endif\r
330     gtk_misc_set_alignment (GTK_MISC(label), 0.0, 0.0);\r
331     gtk_box_pack_start(GTK_BOX(interface_hb), w, FALSE, FALSE, 0);\r
332 \r
333     w = welcome_link_new("DETAILS", &label);\r
334     gtk_tooltips_set_tip(tooltips, w, "Show detailed information about this interface", NULL);\r
335 #if GTK_MAJOR_VERSION >= 2\r
336     gtk_widget_modify_bg(w, GTK_STATE_NORMAL, topic_bg);\r
337 #endif\r
338     gtk_misc_set_alignment (GTK_MISC(label), 0.0, 0.0);\r
339     gtk_box_pack_start(GTK_BOX(interface_hb), w, FALSE, FALSE, 0);\r
340 \r
341     message = g_string_new(if_name);\r
342 \r
343     /* truncate string if it's too long */\r
344     if(message->len > 38) {\r
345         g_string_truncate(message, 35);\r
346         g_string_append  (message, " ...");\r
347     }\r
348 #if GTK_MAJOR_VERSION >= 2\r
349     /* if this is the "active" interface, display it bold */\r
350     if(active) {\r
351         g_string_prepend(message, "<span weight=\"bold\">");\r
352         g_string_append (message, "</span>");\r
353         }\r
354 #endif\r
355     w = gtk_label_new(message->str);\r
356 #if GTK_MAJOR_VERSION >= 2\r
357     gtk_label_set_markup(GTK_LABEL(w), message->str);\r
358 #endif\r
359     g_string_free(message, TRUE);\r
360 \r
361     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.0);\r
362     gtk_box_pack_start(GTK_BOX(interface_hb), w, FALSE, FALSE, 0);\r
363 \r
364     return interface_hb;\r
365 }\r
366 \r
367 /* XXX - the layout has to be improved */\r
368 GtkWidget *\r
369 welcome_new(void)\r
370 {\r
371     GtkWidget *welcome_scrollw;\r
372     GtkWidget *welcome_vb;\r
373     GtkWidget *welcome_hb;\r
374     GtkWidget *column_vb;\r
375     GtkWidget *item_hb;\r
376     GtkWidget *w;\r
377     GtkWidget *label;\r
378     GtkWidget *header;\r
379     GtkWidget *topic_vb;\r
380     GtkWidget *topic_to_fill;\r
381     GtkWidget *interface_hb;\r
382     GdkColor  topic_bg;\r
383 \r
384 \r
385     /* topic content background color */\r
386     topic_bg.pixel = 0;\r
387     topic_bg.red = 221 * 255;\r
388     topic_bg.green = 226 * 255;\r
389     topic_bg.blue = 228 * 255;\r
390 \r
391     welcome_scrollw = scrolled_window_new(NULL, NULL);\r
392 \r
393     welcome_vb = gtk_vbox_new(FALSE, 0);\r
394 \r
395     /* header */\r
396     header = welcome_header_new();\r
397     gtk_box_pack_start(GTK_BOX(welcome_vb), header, FALSE, FALSE, 0);\r
398 \r
399     /* content */\r
400     welcome_hb = gtk_hbox_new(FALSE, 10);\r
401     gtk_container_border_width(GTK_CONTAINER(welcome_hb), 10);\r
402     gtk_box_pack_start(GTK_BOX(welcome_vb), welcome_hb, TRUE, TRUE, 0);\r
403 \r
404     /* column capture */\r
405     column_vb = gtk_vbox_new(FALSE, 10);\r
406     gtk_box_pack_start(GTK_BOX(welcome_hb), column_vb, TRUE, TRUE, 0);\r
407 \r
408     /* capture topic */\r
409     topic_vb = welcome_topic_new("Capture", &topic_to_fill);\r
410     gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);\r
411 \r
412 #ifdef HAVE_LIBPCAP\r
413     item_hb = welcome_item(WIRESHARK_STOCK_CAPTURE_INTERFACES,\r
414         "Interfaces...",\r
415         "Interface Life List",\r
416                 "Show a life list of the available capture interfaces",\r
417         GTK_SIGNAL_FUNC(capture_if_cb), NULL);\r
418     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);\r
419 #endif\r
420 \r
421     w = gtk_label_new("Available Interfaces:");\r
422     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.0);\r
423     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 5);\r
424 \r
425     interface_hb = welcome_if_new("Generic dialup adapter", &topic_bg, FALSE);\r
426     gtk_box_pack_start(GTK_BOX(topic_to_fill), interface_hb, FALSE, FALSE, 0);\r
427 \r
428     /* Marvell interface (currently "active") */\r
429     interface_hb = welcome_if_new("Marvell Gigabit Ethernet Controller", &topic_bg, TRUE);\r
430     gtk_box_pack_start(GTK_BOX(topic_to_fill), interface_hb, FALSE, FALSE, 0);\r
431 \r
432     /* Wireless interface */\r
433     interface_hb = welcome_if_new("Intel(R) PRO/Wireless 3945ABG Network Connection", &topic_bg, FALSE);\r
434     gtk_box_pack_start(GTK_BOX(topic_to_fill), interface_hb, FALSE, FALSE, 0);\r
435 \r
436 \r
437     /* capture help topic */\r
438     topic_vb = welcome_topic_new("Capture Help", &topic_to_fill);\r
439     gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);\r
440 \r
441 #ifdef HAVE_LIBPCAP\r
442     item_hb = welcome_item(WIRESHARK_STOCK_CAPTURE_START,\r
443         "Setup",\r
444                 "How To: Setup a Capture",\r
445                 "How To: Setup a Capture (online from the Wiki)",\r
446         GTK_SIGNAL_FUNC(topic_cb), GINT_TO_POINTER(ONLINEPAGE_USERGUIDE));\r
447     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);\r
448 \r
449     item_hb = welcome_item(WIRESHARK_STOCK_CAPTURE_START,\r
450         "Examples",\r
451                 "Capture Filter Examples",\r
452                 "Capture Filter Examples (online from the Wiki)",\r
453         GTK_SIGNAL_FUNC(topic_cb), GINT_TO_POINTER(ONLINEPAGE_USERGUIDE));\r
454     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);\r
455 #endif\r
456 \r
457     /* fill bottom space */\r
458     w = gtk_label_new("");\r
459     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, TRUE, TRUE, 0);\r
460 \r
461 \r
462     /* column files */\r
463     topic_vb = welcome_topic_new("Files", &topic_to_fill);\r
464     gtk_box_pack_start(GTK_BOX(welcome_hb), topic_vb, TRUE, TRUE, 0);\r
465 \r
466     item_hb = welcome_item(GTK_STOCK_OPEN,\r
467         "Open...",\r
468         "Open a Capture File",\r
469                 "Open a previously captured file",\r
470         GTK_SIGNAL_FUNC(file_open_cmd_cb), NULL);\r
471     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);\r
472 \r
473     item_hb = welcome_item(GTK_STOCK_OPEN,\r
474         "Examples",\r
475         "Download Examples",\r
476                 "Download Example Capture Files (from the Wiki)",\r
477         GTK_SIGNAL_FUNC(topic_cb), GINT_TO_POINTER(ONLINEPAGE_USERGUIDE));\r
478     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);\r
479 \r
480     w = gtk_label_new("Recent Files:");\r
481     gtk_misc_set_alignment (GTK_MISC(w), 0.0, 0.0);\r
482     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 5);\r
483 \r
484     w = welcome_link_new("C:\\Testfiles\\hello.pcap", &label);\r
485 #if GTK_MAJOR_VERSION >= 2\r
486     gtk_widget_modify_bg(w, GTK_STATE_NORMAL, &topic_bg);\r
487 #endif\r
488     gtk_misc_set_alignment (GTK_MISC(label), 0.0, 0.0);\r
489     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 0);\r
490 \r
491     w = welcome_filename_link_new("C:\\Testfiles\\hello2.pcap", &label);\r
492 #if GTK_MAJOR_VERSION >= 2\r
493     gtk_widget_modify_bg(w, GTK_STATE_NORMAL, &topic_bg);\r
494 #endif\r
495     gtk_misc_set_alignment (GTK_MISC(label), 0.0, 0.0);\r
496     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 0);\r
497 \r
498     w = welcome_filename_link_new(\r
499                 "C:\\Testfiles\\to avoid screen garbage\\Unfortunately this is a very long filename which had to be truncated.pcap",\r
500                 &label);\r
501 #if GTK_MAJOR_VERSION >= 2\r
502     gtk_widget_modify_bg(w, GTK_STATE_NORMAL, &topic_bg);\r
503 #endif\r
504     gtk_misc_set_alignment (GTK_MISC(label), 0.0, 0.0);\r
505     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 0);\r
506 \r
507     w = gtk_label_new("");\r
508     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, TRUE, TRUE, 0);\r
509 \r
510 \r
511     /* column online */\r
512     column_vb = gtk_vbox_new(FALSE, 10);\r
513     gtk_box_pack_start(GTK_BOX(welcome_hb), column_vb, TRUE, TRUE, 0);\r
514 \r
515     /* topic online */\r
516     topic_vb = welcome_topic_new("Online", &topic_to_fill);\r
517     gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);\r
518 \r
519 #if (GLIB_MAJOR_VERSION >= 2)\r
520     item_hb = welcome_item(WIRESHARK_STOCK_WEB_SUPPORT,\r
521         "Help",\r
522         "Show the User's Guide",\r
523                 "Show the User's Guide (local version, if available)",\r
524         GTK_SIGNAL_FUNC(topic_cb), GINT_TO_POINTER(ONLINEPAGE_USERGUIDE));\r
525     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);\r
526 \r
527     item_hb = welcome_item(GTK_STOCK_HOME,\r
528         "Home",\r
529         "Projects Home Page",\r
530                 "Visit www.wireshark.org, the project's home page",\r
531         GTK_SIGNAL_FUNC(topic_cb), GINT_TO_POINTER(ONLINEPAGE_HOME));\r
532     gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);\r
533 #endif\r
534 \r
535     /* topic updates */\r
536     topic_vb = welcome_topic_new("Updates", &topic_to_fill);\r
537     gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);\r
538 \r
539     w = gtk_label_new("No updates available!");\r
540     gtk_box_pack_start(GTK_BOX(topic_to_fill), w, TRUE, TRUE, 0);\r
541 \r
542 \r
543     /* the end */\r
544     gtk_widget_show_all(welcome_vb);\r
545 \r
546     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(welcome_scrollw),\r
547                                           welcome_vb);\r
548     gtk_widget_show_all(welcome_scrollw);\r
549 \r
550     return welcome_scrollw;\r
551 }\r
552 #else\r
553 GtkWidget *\r
554 welcome_new(void)\r
555 {\r
556     /* this is just a dummy to fill up window space, simply showing nothing */\r
557     return scrolled_window_new(NULL, NULL);\r
558 }\r
559 #endif\r
560 \r
561 \r