1 #ifndef _GTKMM_ABOUTDIALOG_H
2 #define _GTKMM_ABOUTDIALOG_H
5 // This was copied from gtkmm 2.10.6 and hacked up a bit, so
6 // that we have a dialog class for systems using older
7 // versions of gtkmm24. Debian stable, I'm looking at you...
9 // Chris Frey <cdfrey@foursquare.net>
16 * Copyright (C) 2004 The gtkmm Development Team
18 * This library is free software; you can redistribute it and/or
19 * modify it under the terms of the GNU Library General Public
20 * License as published by the Free Software Foundation; either
21 * version 2 of the License, or (at your option) any later version.
23 * This library is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 * Library General Public License for more details.
28 * You should have received a copy of the GNU Library General Public
29 * License along with this library; if not, write to the Free
30 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 #include <gtkmm/dialog.h>
34 //#include <glibmm/listhandle.h>
37 #ifndef DOXYGEN_SHOULD_SKIP_THIS
38 typedef struct _GtkAboutDialog GtkAboutDialog
;
39 typedef struct _GtkAboutDialogClass GtkAboutDialogClass
;
40 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
44 { class AboutDialog_Class
; } // namespace Gtk
48 /** The AboutDialog offers a simple way to display information about a program like its logo, name, copyright,
49 * website and license. It is also possible to give credits to the authors, documenters, translators and artists
50 * who have worked on the program. An about dialog is typically opened when the user selects the About option
51 * from the Help menu. All parts of the dialog are optional.
53 * About dialogs often contain links and email addresses. Gtk::AboutDialog supports this by offering global
54 * hooks, which are called when the user clicks on a link or email address, see set_email_hook() and
55 * set_url_hook(). Email addresses in the authors, documenters and artists properties are recognized by looking
56 * for <user@host>, URLs are recognized by looking for http://url, with the URL extending to the next space,
62 class AboutDialog
: public Dialog
65 #ifndef DOXYGEN_SHOULD_SKIP_THIS
66 typedef AboutDialog CppObjectType
;
67 typedef AboutDialog_Class CppClassType
;
68 typedef GtkAboutDialog BaseObjectType
;
69 typedef GtkAboutDialogClass BaseClassType
;
70 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
72 virtual ~AboutDialog();
74 #ifndef DOXYGEN_SHOULD_SKIP_THIS
77 friend class AboutDialog_Class
;
78 static CppClassType aboutdialog_class_
;
81 AboutDialog(const AboutDialog
&);
82 AboutDialog
& operator=(const AboutDialog
&);
85 explicit AboutDialog(const Glib::ConstructParams
& construct_params
);
86 explicit AboutDialog(GtkAboutDialog
* castitem
);
88 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
91 #ifndef DOXYGEN_SHOULD_SKIP_THIS
92 static GType
get_type() G_GNUC_CONST
;
93 static GType
get_base_type() G_GNUC_CONST
;
96 ///Provides access to the underlying C GtkObject.
97 GtkAboutDialog
* gobj() { return reinterpret_cast<GtkAboutDialog
*>(gobject_
); }
99 ///Provides access to the underlying C GtkObject.
100 const GtkAboutDialog
* gobj() const { return reinterpret_cast<GtkAboutDialog
*>(gobject_
); }
104 //C++ methods used to invoke GTK+ virtual functions:
105 #ifdef GLIBMM_VFUNCS_ENABLED
106 #endif //GLIBMM_VFUNCS_ENABLED
109 //GTK+ Virtual Functions (override these to change behaviour):
110 #ifdef GLIBMM_VFUNCS_ENABLED
111 #endif //GLIBMM_VFUNCS_ENABLED
113 //Default Signal Handlers::
114 #ifdef GLIBMM_DEFAULT_SIGNAL_HANDLERS_ENABLED
115 #endif //GLIBMM_DEFAULT_SIGNAL_HANDLERS_ENABLED
125 /** Returns the program name displayed in the about dialog.
126 * @return The program name. The string is owned by the about
127 * dialog and must not be modified.
131 Glib::ustring
get_name() const;
133 /** Sets the name to display in the about dialog.
134 * If this is not set, it defaults to Glib::get_application_name().
137 * @param name The program name.
139 void set_name(const Glib::ustring
& name
);
141 /** Returns the version string.
142 * @return The version string. The string is owned by the about
143 * dialog and must not be modified.
147 Glib::ustring
get_version() const;
149 /** Sets the version string to display in the about dialog.
152 * @param version The version string.
154 void set_version(const Glib::ustring
& version
);
156 /** Returns the copyright string.
157 * @return The copyright string. The string is owned by the about
158 * dialog and must not be modified.
162 Glib::ustring
get_copyright() const;
164 /** Sets the copyright string to display in the about dialog.
165 * This should be a short string of one or two lines.
168 * @param copyright The copyright string.
170 void set_copyright(const Glib::ustring
& copyright
);
172 /** Returns the comments string.
173 * @return The comments. The string is owned by the about
174 * dialog and must not be modified.
178 Glib::ustring
get_comments() const;
180 /** Sets the comments string to display in the about
181 * dialog. This should be a short string of one or
185 * @param comments A comments string.
187 void set_comments(const Glib::ustring
& comments
);
189 /** Returns the license information.
190 * @return The license information. The string is owned by the about
191 * dialog and must not be modified.
195 Glib::ustring
get_license() const;
197 /** Sets the license information to be displayed in the secondary
198 * license dialog. If @a license is <tt>0</tt>, the license button is
202 * @param license The license information or <tt>0</tt>.
204 void set_license(const Glib::ustring
& license
);
206 /** Returns the website URL.
207 * @return The website URL. The string is owned by the about
208 * dialog and must not be modified.
212 Glib::ustring
get_website() const;
214 /** Sets the URL to use for the website link.
217 * @param website A URL string starting with "http://".
219 void set_website(const Glib::ustring
& website
);
221 /** Returns the label used for the website link.
222 * @return The label used for the website link. The string is owned by the about
223 * dialog and must not be modified.
227 Glib::ustring
get_website_label() const;
229 /** Sets the label to be used for the website link.
230 * It defaults to the website URL.
233 * @param website_label The label used for the website link.
235 void set_website_label(const Glib::ustring
& website_label
);
238 /** Returns the string which are displayed in the authors tab
239 * of the secondary credits dialog.
240 * @return A <tt>0</tt>-terminated string array containing
241 * the authors. The array is owned by the about dialog
242 * and must not be modified.
246 Glib::StringArrayHandle
get_authors() const;
249 /** Sets the strings which are displayed in the authors tab
250 * of the secondary credits dialog.
253 * @param authors A <tt>0</tt>-terminated array of strings.
255 void set_authors(const Glib::StringArrayHandle
& authors
) const;
258 /** Returns the string which are displayed in the documenters
259 * tab of the secondary credits dialog.
260 * @return A <tt>0</tt>-terminated string array containing
261 * the documenters. The array is owned by the about dialog
262 * and must not be modified.
266 Glib::StringArrayHandle
get_documenters() const;
269 /** Sets the strings which are displayed in the documenters tab
270 * of the secondary credits dialog.
273 * @param documenters A <tt>0</tt>-terminated array of strings.
275 void set_documenters(const Glib::StringArrayHandle
& documenters
);
277 /** Returns the string which are displayed in the artists tab
278 * of the secondary credits dialog.
279 * @return A <tt>0</tt>-terminated string array containing
280 * the artists. The array is owned by the about dialog
281 * and must not be modified.
285 Glib::StringArrayHandle
get_artists() const;
287 /** Sets the strings which are displayed in the artists tab
288 * of the secondary credits dialog.
291 * @param artists A <tt>0</tt>-terminated array of strings.
293 void set_artists(const Glib::StringArrayHandle
& artists
);
295 /** Returns the translator credits string which is displayed
296 * in the translators tab of the secondary credits dialog.
297 * @return The translator credits string. The string is
298 * owned by the about dialog and must not be modified.
302 Glib::ustring
get_translator_credits() const;
304 /** Sets the translator credits string which is displayed in
305 * the translators tab of the secondary credits dialog.
307 * The intended use for this string is to display the translator
308 * of the language which is currently used in the user interface.
309 * Using gettext(), a simple way to achieve that is to mark the
310 * string for translation:
312 * gtk_about_dialog_set_translator_credits (about, _("translator-credits"));
314 * It is a good idea to use the customary msgid "translator-credits" for this
315 * purpose, since translators will already know the purpose of that msgid, and
316 * since Gtk::AboutDialog will detect if "translator-credits" is untranslated
320 * @param translator_credits The translator credits.
322 void set_translator_credits(const Glib::ustring
& translator_credits
);
325 /** Returns the pixbuf displayed as logo in the about dialog.
326 * @return The pixbuf displayed as logo. The pixbuf is
327 * owned by the about dialog. If you want to keep a reference
328 * to it, you have to call Glib::object_ref() on it.
332 Glib::RefPtr
<Gdk::Pixbuf
> get_logo();
334 /** Returns the pixbuf displayed as logo in the about dialog.
335 * @return The pixbuf displayed as logo. The pixbuf is
336 * owned by the about dialog. If you want to keep a reference
337 * to it, you have to call Glib::object_ref() on it.
341 Glib::RefPtr
<const Gdk::Pixbuf
> get_logo() const;
344 /** Sets the pixbuf to be displayed as logo in
345 * the about dialog. If it is <tt>0</tt>, the default
346 * window icon set with Gtk::Window::set_default_icon()
350 * @param logo A Gdk::Pixbuf, or <tt>0</tt>.
352 void set_logo(const Glib::RefPtr
<Gdk::Pixbuf
>& logo
);
355 /** Returns the icon name displayed as logo in the about dialog.
356 * @return The icon name displayed as logo. The string is
357 * owned by the dialog. If you want to keep a reference
358 * to it, you have to call Glib::strdup() on it.
362 Glib::ustring
get_logo_icon_name() const;
364 /** Sets the pixbuf to be displayed as logo in
365 * the about dialog. If it is <tt>0</tt>, the default
366 * window icon set with Gtk::Window::set_default_icon()
370 * @param icon_name An icon name, or <tt>0</tt>.
372 void set_logo_icon_name(const Glib::ustring
& icon_name
);
375 /** Returns whether the license text in @a about is
376 * automatically wrapped.
377 * @return <tt>true</tt> if the license text is wrapped
381 // bool get_wrap_license() const;
383 /** Sets whether the license text in @a about is
384 * automatically wrapped.
387 * @param wrap_license Whether to wrap the license.
389 // void set_wrap_license(bool wrap_license);
392 * void on_activate_link_url(AboutDialog& about_dialog, const Glib::ustring& link);
394 typedef sigc::slot
<void, AboutDialog
& /* about_dialog */, const Glib::ustring
& /* link */> SlotActivateLink
;
396 /** Installs a global callback to be called whenever the user activates an email link in an about dialog.
397 * @param slot A function or method to call when an email link is activated.
399 static void set_email_hook(const SlotActivateLink
& slot
);
402 /** Installs a global callback to be called whenever the user activates a URL link in an about dialog.
403 * @param slot A function or method to call when a URL link is activated.
405 static void set_url_hook(const SlotActivateLink
& slot
);
408 //TODO: Deprecate this, because it conflicts with the property in GtkWidget, which will be deprecated in GTK+ 2.12.
409 #ifdef GLIBMM_PROPERTIES_ENABLED
410 /** The name of the program. If this is not set
412 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
413 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
414 * the value of the property changes.
416 Glib::PropertyProxy
<Glib::ustring
> property_name() ;
417 #endif //#GLIBMM_PROPERTIES_ENABLED
419 #ifdef GLIBMM_PROPERTIES_ENABLED
420 /** The name of the program. If this is not set
422 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
423 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
424 * the value of the property changes.
426 Glib::PropertyProxy_ReadOnly
<Glib::ustring
> property_name() const;
427 #endif //#GLIBMM_PROPERTIES_ENABLED
430 #ifdef GLIBMM_PROPERTIES_ENABLED
431 /** The version of the program.
433 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
434 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
435 * the value of the property changes.
437 Glib::PropertyProxy
<Glib::ustring
> property_version() ;
438 #endif //#GLIBMM_PROPERTIES_ENABLED
440 #ifdef GLIBMM_PROPERTIES_ENABLED
441 /** The version of the program.
443 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
444 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
445 * the value of the property changes.
447 Glib::PropertyProxy_ReadOnly
<Glib::ustring
> property_version() const;
448 #endif //#GLIBMM_PROPERTIES_ENABLED
450 #ifdef GLIBMM_PROPERTIES_ENABLED
451 /** Copyright information for the program.
453 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
454 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
455 * the value of the property changes.
457 Glib::PropertyProxy
<Glib::ustring
> property_copyright() ;
458 #endif //#GLIBMM_PROPERTIES_ENABLED
460 #ifdef GLIBMM_PROPERTIES_ENABLED
461 /** Copyright information for the program.
463 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
464 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
465 * the value of the property changes.
467 Glib::PropertyProxy_ReadOnly
<Glib::ustring
> property_copyright() const;
468 #endif //#GLIBMM_PROPERTIES_ENABLED
470 #ifdef GLIBMM_PROPERTIES_ENABLED
471 /** Comments about the program.
473 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
474 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
475 * the value of the property changes.
477 Glib::PropertyProxy
<Glib::ustring
> property_comments() ;
478 #endif //#GLIBMM_PROPERTIES_ENABLED
480 #ifdef GLIBMM_PROPERTIES_ENABLED
481 /** Comments about the program.
483 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
484 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
485 * the value of the property changes.
487 Glib::PropertyProxy_ReadOnly
<Glib::ustring
> property_comments() const;
488 #endif //#GLIBMM_PROPERTIES_ENABLED
490 #ifdef GLIBMM_PROPERTIES_ENABLED
491 /** The URL for the link to the website of the program.
493 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
494 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
495 * the value of the property changes.
497 Glib::PropertyProxy
<Glib::ustring
> property_website() ;
498 #endif //#GLIBMM_PROPERTIES_ENABLED
500 #ifdef GLIBMM_PROPERTIES_ENABLED
501 /** The URL for the link to the website of the program.
503 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
504 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
505 * the value of the property changes.
507 Glib::PropertyProxy_ReadOnly
<Glib::ustring
> property_website() const;
508 #endif //#GLIBMM_PROPERTIES_ENABLED
510 #ifdef GLIBMM_PROPERTIES_ENABLED
511 /** The label for the link to the website of the program. If this is not set
513 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
514 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
515 * the value of the property changes.
517 Glib::PropertyProxy
<Glib::ustring
> property_website_label() ;
518 #endif //#GLIBMM_PROPERTIES_ENABLED
520 #ifdef GLIBMM_PROPERTIES_ENABLED
521 /** The label for the link to the website of the program. If this is not set
523 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
524 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
525 * the value of the property changes.
527 Glib::PropertyProxy_ReadOnly
<Glib::ustring
> property_website_label() const;
528 #endif //#GLIBMM_PROPERTIES_ENABLED
530 #ifdef GLIBMM_PROPERTIES_ENABLED
531 /** The license of the program.
533 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
534 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
535 * the value of the property changes.
537 Glib::PropertyProxy
<Glib::ustring
> property_license() ;
538 #endif //#GLIBMM_PROPERTIES_ENABLED
540 #ifdef GLIBMM_PROPERTIES_ENABLED
541 /** The license of the program.
543 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
544 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
545 * the value of the property changes.
547 Glib::PropertyProxy_ReadOnly
<Glib::ustring
> property_license() const;
548 #endif //#GLIBMM_PROPERTIES_ENABLED
550 #ifdef GLIBMM_PROPERTIES_ENABLED
551 /** List of authors of the program.
553 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
554 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
555 * the value of the property changes.
557 Glib::PropertyProxy
<Glib::StringArrayHandle
> property_authors() ;
558 #endif //#GLIBMM_PROPERTIES_ENABLED
560 #ifdef GLIBMM_PROPERTIES_ENABLED
561 /** List of authors of the program.
563 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
564 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
565 * the value of the property changes.
567 Glib::PropertyProxy_ReadOnly
<Glib::StringArrayHandle
> property_authors() const;
568 #endif //#GLIBMM_PROPERTIES_ENABLED
570 #ifdef GLIBMM_PROPERTIES_ENABLED
571 /** List of people documenting the program.
573 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
574 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
575 * the value of the property changes.
577 Glib::PropertyProxy
<Glib::StringArrayHandle
> property_documenters() ;
578 #endif //#GLIBMM_PROPERTIES_ENABLED
580 #ifdef GLIBMM_PROPERTIES_ENABLED
581 /** List of people documenting the program.
583 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
584 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
585 * the value of the property changes.
587 Glib::PropertyProxy_ReadOnly
<Glib::StringArrayHandle
> property_documenters() const;
588 #endif //#GLIBMM_PROPERTIES_ENABLED
590 #ifdef GLIBMM_PROPERTIES_ENABLED
591 /** Credits to the translators. This string should be marked as translatable.
593 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
594 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
595 * the value of the property changes.
597 Glib::PropertyProxy
<Glib::StringArrayHandle
> property_translator_credits() ;
598 #endif //#GLIBMM_PROPERTIES_ENABLED
600 #ifdef GLIBMM_PROPERTIES_ENABLED
601 /** Credits to the translators. This string should be marked as translatable.
603 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
604 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
605 * the value of the property changes.
607 Glib::PropertyProxy_ReadOnly
<Glib::StringArrayHandle
> property_translator_credits() const;
608 #endif //#GLIBMM_PROPERTIES_ENABLED
610 #ifdef GLIBMM_PROPERTIES_ENABLED
611 /** List of people who have contributed artwork to the program.
613 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
614 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
615 * the value of the property changes.
617 Glib::PropertyProxy
<Glib::StringArrayHandle
> property_artists() ;
618 #endif //#GLIBMM_PROPERTIES_ENABLED
620 #ifdef GLIBMM_PROPERTIES_ENABLED
621 /** List of people who have contributed artwork to the program.
623 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
624 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
625 * the value of the property changes.
627 Glib::PropertyProxy_ReadOnly
<Glib::StringArrayHandle
> property_artists() const;
628 #endif //#GLIBMM_PROPERTIES_ENABLED
630 #ifdef GLIBMM_PROPERTIES_ENABLED
631 /** A logo for the about box. If this is not set
633 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
634 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
635 * the value of the property changes.
637 Glib::PropertyProxy
< Glib::RefPtr
<Gdk::Pixbuf
> > property_logo() ;
638 #endif //#GLIBMM_PROPERTIES_ENABLED
640 #ifdef GLIBMM_PROPERTIES_ENABLED
641 /** A logo for the about box. If this is not set
643 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
644 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
645 * the value of the property changes.
647 Glib::PropertyProxy_ReadOnly
< Glib::RefPtr
<Gdk::Pixbuf
> > property_logo() const;
648 #endif //#GLIBMM_PROPERTIES_ENABLED
650 #ifdef GLIBMM_PROPERTIES_ENABLED
651 /** A named icon to use as the logo for the about box.
653 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
654 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
655 * the value of the property changes.
657 Glib::PropertyProxy
<Glib::ustring
> property_logo_icon_name() ;
658 #endif //#GLIBMM_PROPERTIES_ENABLED
660 #ifdef GLIBMM_PROPERTIES_ENABLED
661 /** A named icon to use as the logo for the about box.
663 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
664 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
665 * the value of the property changes.
667 Glib::PropertyProxy_ReadOnly
<Glib::ustring
> property_logo_icon_name() const;
668 #endif //#GLIBMM_PROPERTIES_ENABLED
670 #ifdef GLIBMM_PROPERTIES_ENABLED
671 /** Whether to wrap the license text.
673 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
674 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
675 * the value of the property changes.
677 // Glib::PropertyProxy<bool> property_wrap_license() ;
678 #endif //#GLIBMM_PROPERTIES_ENABLED
680 #ifdef GLIBMM_PROPERTIES_ENABLED
681 /** Whether to wrap the license text.
683 * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
684 * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
685 * the value of the property changes.
687 // Glib::PropertyProxy_ReadOnly<bool> property_wrap_license() const;
688 #endif //#GLIBMM_PROPERTIES_ENABLED
698 /** @relates Gtk::AboutDialog
699 * @param object The C instance
700 * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref.
701 * @result A C++ instance that wraps this C instance.
703 Gtk::AboutDialog
* wrap(GtkAboutDialog
* object
, bool take_copy
= false);
707 #endif /* _GTKMM_ABOUTDIALOG_H */