/* totem-interface.c
*
* Copyright (C) 2005 Bastien Nocera
*
* The Gnome Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* The Gnome Library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with the Gnome Library; see the file COPYING.LIB. If not,
* see .
*
* Author: Bastien Nocera
*
* The Totem project hereby grant permission for non-gpl compatible GStreamer
* plugins to be used and distributed together with GStreamer and Totem. This
* permission are above and beyond the permissions granted by the GPL license
* Totem is covered by.
*
* Monday 7th February 2005: Christian Schaller: Add exception clause.
* See license_change file for details.
*
*/
/**
* SECTION:totem-interface
* @short_description: interface utility/loading/error functions
* @stability: Unstable
* @include: totem-interface.h
*
* A collection of interface utility functions, for loading interfaces and displaying errors.
**/
#include "config.h"
#include
#include
#include
#include
#include "totem-interface.h"
static GtkBuilder *
totem_interface_load_with_full_path (const char *filename, gboolean fatal,
GtkWindow *parent, gpointer user_data);
static char *totem_interface_get_full_path (const char *name);
static GtkWidget *
totem_interface_error_dialog (const char *title, const char *reason,
GtkWindow *parent)
{
GtkWidget *error_dialog;
if (reason == NULL)
g_warning ("%s called with reason == NULL", G_STRFUNC);
error_dialog =
gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"%s", title);
gtk_message_dialog_format_secondary_text
(GTK_MESSAGE_DIALOG (error_dialog), "%s", reason);
gtk_window_set_transient_for (GTK_WINDOW (error_dialog),
GTK_WINDOW (parent));
gtk_window_set_title (GTK_WINDOW (error_dialog), ""); /* as per HIG */
gtk_dialog_set_default_response (GTK_DIALOG (error_dialog),
GTK_RESPONSE_OK);
gtk_window_set_modal (GTK_WINDOW (error_dialog), TRUE);
return error_dialog;
}
/**
* totem_interface_error:
* @title: the error title
* @reason: the error reason (secondary text)
* @parent: the error dialogue's parent #GtkWindow
*
* Display a modal error dialogue with @title as its primary error text, and @reason
* as its secondary text.
**/
void
totem_interface_error (const char *title, const char *reason,
GtkWindow *parent)
{
GtkWidget *error_dialog;
error_dialog = totem_interface_error_dialog (title, reason, parent);
g_signal_connect (G_OBJECT (error_dialog), "response", G_CALLBACK
(gtk_widget_destroy), error_dialog);
gtk_window_present (GTK_WINDOW (error_dialog));
}
/**
* totem_interface_error_blocking:
* @title: the error title
* @reason: the error reason (secondary text)
* @parent: the error dialogue's parent #GtkWindow
*
* Display a modal error dialogue like totem_interface_error() which blocks until the user has
* dismissed it.
**/
void
totem_interface_error_blocking (const char *title, const char *reason,
GtkWindow *parent)
{
GtkWidget *error_dialog;
error_dialog = totem_interface_error_dialog (title, reason, parent);
gtk_dialog_run (GTK_DIALOG (error_dialog));
gtk_widget_destroy (error_dialog);
}
/**
* totem_interface_load:
* @name: the #GtkBuilder UI file to load
* @fatal: %TRUE if errors loading the file should be fatal, %FALSE otherwise
* @parent: (allow-none): the parent window to use when displaying error dialogues, or %NULL
* @user_data: (allow-none): the user data to pass to gtk_builder_connect_signals(), or %NULL
*
* Load a #GtkBuilder UI file with the given name and return the #GtkBuilder instance for it. If loading the file fails, an error dialogue is shown.
*
* Return value: (transfer full): the loaded #GtkBuilder object, or %NULL
*/
GtkBuilder *
totem_interface_load (const char *name, gboolean fatal, GtkWindow *parent, gpointer user_data)
{
GtkBuilder *builder = NULL;
char *filename;
filename = totem_interface_get_full_path (name);
if (filename == NULL) {
char *msg;
msg = g_strdup_printf (_("Couldn’t load the “%s” interface. %s"), name, _("The file does not exist."));
if (fatal == FALSE)
totem_interface_error (msg, _("Make sure that Totem is properly installed."), parent);
else
totem_interface_error_blocking (msg, _("Make sure that Totem is properly installed."), parent);
g_free (msg);
return NULL;
}
builder = totem_interface_load_with_full_path (filename, fatal, parent,
user_data);
g_free (filename);
return builder;
}
/*
* totem_interface_load_with_full_path:
* @filename: the #GtkBuilder UI file path to load
* @fatal: %TRUE if errors loading the file should be fatal, %FALSE otherwise
* @parent: (allow-none): the parent window to use when displaying error dialogues, or %NULL
* @user_data: (allow-none): the user data to pass to gtk_builder_connect_signals(), or %NULL
*
* Load a #GtkBuilder UI file from the given path and return the #GtkBuilder instance for it. If loading the file fails, an error dialogue is shown.
*
* Return value: (transfer full): the loaded #GtkBuilder object, or %NULL
*/
static GtkBuilder *
totem_interface_load_with_full_path (const char *filename, gboolean fatal,
GtkWindow *parent, gpointer user_data)
{
GtkBuilder *builder = NULL;
GError *error = NULL;
if (filename != NULL) {
builder = gtk_builder_new ();
gtk_builder_set_translation_domain (builder, GETTEXT_PACKAGE);
}
if (builder == NULL || gtk_builder_add_from_file (builder, filename, &error) == FALSE) {
char *msg;
msg = g_strdup_printf (_("Couldn’t load the “%s” interface. %s"), filename, error->message);
if (fatal == FALSE)
totem_interface_error (msg, _("Make sure that Totem is properly installed."), parent);
else
totem_interface_error_blocking (msg, _("Make sure that Totem is properly installed."), parent);
g_free (msg);
g_error_free (error);
return NULL;
}
gtk_builder_connect_signals (builder, user_data);
return builder;
}
static char *
totem_interface_get_full_path (const char *name)
{
char *filename;
filename = g_build_filename (DATADIR,
"totem", name, NULL);
return filename;
}
/**
* totem_interface_create_header_button:
* @header: The header widget to put the button in
* @button: The button to use in the header
* @icon_name: The icon name for the button image
* @pack_type: A #GtkPackType to tell us where to include the button
*
* Put the given @icon_name into @button, and pack @button into @header
* according to @pack_type.
*
* Return value: (transfer none): the button passed as input
*/
GtkWidget *
totem_interface_create_header_button (GtkWidget *header,
GtkWidget *button,
const char *icon_name,
GtkPackType pack_type)
{
GtkWidget *image;
GtkStyleContext *context;
image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
gtk_button_set_image (GTK_BUTTON (button), image);
context = gtk_widget_get_style_context (button);
gtk_style_context_add_class (context, "image-button");
g_object_set (G_OBJECT (button), "valign", GTK_ALIGN_CENTER, NULL);
if (GTK_IS_MENU_BUTTON (button))
g_object_set (G_OBJECT (button), "use-popover", TRUE, NULL);
if (pack_type == GTK_PACK_END)
gtk_header_bar_pack_end (GTK_HEADER_BAR (header), button);
else
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), button);
gtk_widget_show_all (button);
return button;
}