From c51ef797a707f4e2c6f9688d4378f2b0e9898a66 Mon Sep 17 00:00:00 2001 From: Perberos Date: Thu, 1 Dec 2011 22:56:10 -0300 Subject: moving from https://github.com/perberos/mate-desktop-environment --- mate-panel/libpanel-util/panel-show.c | 283 ++++++++++++++++++++++++++++++++++ 1 file changed, 283 insertions(+) create mode 100644 mate-panel/libpanel-util/panel-show.c (limited to 'mate-panel/libpanel-util/panel-show.c') diff --git a/mate-panel/libpanel-util/panel-show.c b/mate-panel/libpanel-util/panel-show.c new file mode 100644 index 00000000..02ea2e63 --- /dev/null +++ b/mate-panel/libpanel-util/panel-show.c @@ -0,0 +1,283 @@ +/* + * panel-show.c: a helper around gtk_show_uri + * + * Copyright (C) 2008 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Authors: + * Vincent Untz + */ + +#include +#include +#include + +#include + +#include "panel-error.h" +#include "panel-glib.h" +#include "panel-launch.h" + +#include "panel-show.h" + +static void +_panel_show_error_dialog (const gchar *uri, + GdkScreen *screen, + const gchar *message) +{ + char *primary; + + primary = g_markup_printf_escaped (_("Could not open location '%s'"), + uri); + panel_error_dialog (NULL, screen, "cannot_show_url", TRUE, + primary, message); + g_free (primary); +} + +typedef struct { + GMountOperation *mount_op; + GdkScreen *screen; +} PanelShowMountOperationHandle; + +static void +_panel_show_mount_async_callback (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + GFile *file; + PanelShowMountOperationHandle *handle = user_data; + + file = G_FILE (source_object); + + error = NULL; + if (g_file_mount_enclosing_volume_finish (file, result, &error)) { + char *uri = g_file_get_uri (file); + + panel_show_uri (handle->screen, uri, + gtk_get_current_event_time (), NULL); + g_free (uri); + } else { + if (!g_error_matches (error, G_IO_ERROR, + G_IO_ERROR_PERMISSION_DENIED) && + !g_error_matches (error, G_IO_ERROR, + G_IO_ERROR_FAILED_HANDLED)) { + char *uri; + + uri = g_file_get_uri (file); + _panel_show_error_dialog (uri, handle->screen, + error->message); + g_free (uri); + } + g_error_free (error); + } + + if (handle->mount_op) + g_object_unref (handle->mount_op); + + g_slice_free (PanelShowMountOperationHandle, handle); +} + +static gboolean _panel_show_handle_error(const gchar* uri, GdkScreen* screen, GError* local_error, GError** error) +{ + if (local_error == NULL) + { + return TRUE; + } + + else if (g_error_matches (local_error, + G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_error_free (local_error); + return TRUE; + } + + else if (g_error_matches (local_error, + G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { + GFile *file; + PanelShowMountOperationHandle *handle; + + handle = g_slice_new (PanelShowMountOperationHandle); + file = g_file_new_for_uri (uri); + + /* If it's not mounted, try to mount it ourselves */ + handle->mount_op = gtk_mount_operation_new (NULL); + gtk_mount_operation_set_screen (GTK_MOUNT_OPERATION (handle->mount_op), + screen); + handle->screen = screen; + + g_file_mount_enclosing_volume (file, G_MOUNT_MOUNT_NONE, + handle->mount_op, NULL, + _panel_show_mount_async_callback, + handle); + g_object_unref (file); + + return TRUE; + } + + else if (error != NULL) + g_propagate_error (error, local_error); + + else { + _panel_show_error_dialog (uri, screen, local_error->message); + g_error_free (local_error); + } + + return FALSE; +} + +static gboolean panel_show_caja_search_uri(GdkScreen* screen, const gchar* uri, guint32 timestamp, GError** error) +{ + char* desktopfile; + GDesktopAppInfo* appinfo; + gboolean ret; + + desktopfile = panel_g_lookup_in_applications_dirs("caja-folder-handler.desktop"); + + if (desktopfile) + { + appinfo = g_desktop_app_info_new_from_filename(desktopfile); + g_free(desktopfile); + } + + if (!appinfo) + { + _panel_show_error_dialog (uri, screen, _("No application to handle search folders is installed.")); + return FALSE; + } + + ret = panel_app_info_launch_uri((GAppInfo*) appinfo, uri, screen, timestamp, error); + g_object_unref(appinfo); + + return ret; +} + +gboolean panel_show_uri(GdkScreen* screen, const gchar* uri, guint32 timestamp, GError** error) +{ + GError* local_error = NULL; + + g_return_val_if_fail(GDK_IS_SCREEN (screen), FALSE); + g_return_val_if_fail(uri != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + if (g_str_has_prefix(uri, "x-caja-search:")) + { + return panel_show_caja_search_uri(screen, uri, timestamp, error); + } + + gtk_show_uri(screen, uri, timestamp, &local_error); + + return _panel_show_handle_error(uri, screen, local_error, error); +} + +gboolean +panel_show_uri_force_mime_type (GdkScreen *screen, + const gchar *uri, + const gchar *mime_type, + guint32 timestamp, + GError **error) +{ + GFile *file; + GAppInfo *app; + gboolean ret; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + g_return_val_if_fail (mime_type != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + file = g_file_new_for_uri (uri); + app = g_app_info_get_default_for_type (mime_type, + !g_file_is_native (file)); + g_object_unref (file); + + if (app == NULL) { + /* no application for the mime type, so let's fallback on + * automatic detection */ + return panel_show_uri (screen, uri, timestamp, error); + } + + ret = panel_app_info_launch_uri (app, uri, screen, timestamp, error); + g_object_unref (app); + + return ret; +} + +static void +_panel_show_help_error_dialog (const gchar *doc, + GdkScreen *screen, + const gchar *message) +{ + char *primary; + + primary = g_markup_printf_escaped (_("Could not display help document '%s'"), + doc); + panel_error_dialog (NULL, screen, "cannot_show_help", TRUE, + primary, message); + g_free (primary); +} + +static gboolean +_panel_show_help_handle_error (const gchar *doc, + GdkScreen *screen, + GError *local_error, + GError **error) +{ + if (local_error == NULL) + return TRUE; + + else if (g_error_matches (local_error, + G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_error_free (local_error); + return TRUE; + } + + else if (error != NULL) + g_propagate_error (error, local_error); + + else { + _panel_show_help_error_dialog (doc, screen, + local_error->message); + g_error_free (local_error); + } + + return FALSE; +} + +gboolean +panel_show_help (GdkScreen *screen, + const gchar *doc, + const gchar *link, + GError **error) +{ + GError *local_error = NULL; + char *uri; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + g_return_val_if_fail (doc != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (link) + uri = g_strdup_printf ("ghelp:%s?%s", doc, link); + else + uri = g_strdup_printf ("ghelp:%s", doc); + + gtk_show_uri (screen, uri, gtk_get_current_event_time (), &local_error); + + g_free (uri); + + return _panel_show_help_handle_error (doc, screen, local_error, error); +} -- cgit v1.2.1