/* * e-alert-sink.c * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the program; if not, see * */ /** * SECTION: e-alert-sink * @short_description: an interface to handle alerts * @include: e-util/e-alert-sink.h * * A widget that implements #EAlertSink means it can handle #EAlerts, * usually by displaying them to the user. **/ #include "e-alert-sink.h" #include "e-alert-dialog.h" G_DEFINE_INTERFACE ( EAlertSink, e_alert_sink, GTK_TYPE_WIDGET) static void alert_sink_fallback (GtkWidget *widget, EAlert *alert) { GtkWidget *dialog; gpointer parent; parent = gtk_widget_get_toplevel (widget); parent = gtk_widget_is_toplevel (parent) ? parent : NULL; dialog = e_alert_dialog_new (parent, alert); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } static void alert_sink_submit_alert (EAlertSink *alert_sink, EAlert *alert) { /* This is just a lame fallback handler. Implementors * are strongly encouraged to override this method. */ alert_sink_fallback (GTK_WIDGET (alert_sink), alert); } static void e_alert_sink_default_init (EAlertSinkInterface *interface) { interface->submit_alert = alert_sink_submit_alert; } /** * e_alert_sink_submit_alert: * @widget: a #GtkWidget, either itself an #EAlertSink or a child of one * @alert: an #EAlert * * This function is a place to pass #EAlert objects. Beyond that it has no * well-defined behavior. It's up to the widget implementing the #EAlertSink * interface to decide what to do with them. * * Either @widget or one of its ancestors must implement #EAlertSink. * * The default behavior is to display the @alert in a dialog. **/ void e_alert_sink_submit_alert (GtkWidget *widget, EAlert *alert) { GtkWidget *ancestor; g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (E_IS_ALERT (alert)); ancestor = gtk_widget_get_ancestor (widget, E_TYPE_ALERT_SINK); if (E_IS_ALERT_SINK (ancestor)) { EAlertSinkInterface *interface; interface = E_ALERT_SINK_GET_INTERFACE (ancestor); g_return_if_fail (interface->submit_alert != NULL); interface->submit_alert (E_ALERT_SINK (ancestor), alert); } else alert_sink_fallback (widget, alert); }