diff options
author | Colomban Wendling <[email protected]> | 2020-08-04 16:51:35 +0200 |
---|---|---|
committer | Robert Antoni Buj Gelonch <[email protected]> | 2020-08-04 18:19:56 +0200 |
commit | 7d706e9fe1f53ef73f644eb1a6488239541d6714 (patch) | |
tree | 35aab9ac7d67fa0227bebb32b4ca3ade6e79564b | |
parent | ecfe8a9e7ed519b11bd1d13f5e7e8d29ef71512d (diff) | |
download | mate-panel-7d706e9fe1f53ef73f644eb1a6488239541d6714.tar.bz2 mate-panel-7d706e9fe1f53ef73f644eb1a6488239541d6714.tar.xz |
Ask the user what to do when receiving an image drop
Instead of unconditionally setting the panel's background when an image
file URI gets dropped on a panel, ask the user whether to create a
launcher for that URI (like for non-image URIs) or to use the image as
the panel's background.
A number of users have seen their panel's background changed
unexpectedly due to unwanted drop of an image file over the panel,
sometimes seeing this as a panel's bug.
Also, this behavior is inconsistent with dropping a URI pointing to any
other type of file, where it would create a launcher for it.
Consequently, and as setting the panel's background doesn't seem like a
so common task it ought to be super fast, ask the user what to do when
receiving an image URI drop.
-rw-r--r-- | mate-panel/panel.c | 106 |
1 files changed, 104 insertions, 2 deletions
diff --git a/mate-panel/panel.c b/mate-panel/panel.c index 8bd84acd..7a2d80fe 100644 --- a/mate-panel/panel.c +++ b/mate-panel/panel.c @@ -598,6 +598,109 @@ drop_caja_desktop_uri (PanelWidget *panel, return success; } +enum { + RESPONSE_SET_BACKGROUND, + RESPONSE_CREATE_LAUNCHER +}; + +static void +image_drop_dialog_response (GtkWidget *dialog, + int response, + PanelWidget *panel) +{ + if (response == RESPONSE_SET_BACKGROUND) { + const gchar *uri = g_object_get_data (G_OBJECT (dialog), "uri"); + + set_background_image_from_uri (panel->toplevel, uri); + } else if (response == RESPONSE_CREATE_LAUNCHER) { + const gchar *uri = g_object_get_data (G_OBJECT (dialog), "uri"); + gint pos = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), "pos")); + + drop_uri (panel, pos, uri, PANEL_ICON_UNKNOWN); + } + + gtk_widget_destroy (dialog); +} + +static GtkWidget * +image_drop_dialog (PanelToplevel *toplevel, + const gchar *uri) +{ + GtkWidget *dialog; + GFile *file; + GFileInfo *info; + gchar *display_name; + + file = g_file_new_for_uri (uri); + info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, + G_FILE_QUERY_INFO_NONE, NULL, NULL); + if (info) { + display_name = g_strdup (g_file_info_get_display_name (info)); + g_object_unref (info); + } else { + display_name = g_file_get_basename (file); + } + g_object_unref (file); + + dialog = gtk_message_dialog_new ( + GTK_WINDOW (toplevel), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("You dropped an image on the panel, what do you want to do?")); + + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("You dropped the image \"%s\" on the panel. " + "Do you want to create a launcher for it or use it " + "as the panel's background?"), display_name); + + g_free (display_name); + + panel_dialog_add_button (GTK_DIALOG (dialog), + _("_Cancel"), "process-stop", + GTK_RESPONSE_CANCEL); + panel_dialog_add_button (GTK_DIALOG (dialog), + _("Create _Launcher"), "mate-panel-launcher", + RESPONSE_CREATE_LAUNCHER); + panel_dialog_add_button (GTK_DIALOG (dialog), + _("Set _Background Image"), "background", + RESPONSE_SET_BACKGROUND); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); + + gtk_window_set_screen (GTK_WINDOW (dialog), + gtk_window_get_screen (GTK_WINDOW (toplevel))); + + gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); + + g_signal_connect_swapped (dialog, "destroy", + G_CALLBACK (panel_toplevel_pop_autohide_disabler), + toplevel); + + panel_toplevel_push_autohide_disabler (toplevel); + + return dialog; +} + +static void +ask_about_image_drop (PanelWidget *panel, + int pos, + const char *uri) +{ + GtkWidget *dialog; + + dialog = image_drop_dialog (panel->toplevel, uri); + + g_object_set_data (G_OBJECT (dialog), "pos", GINT_TO_POINTER (pos)); + g_object_set_data_full (G_OBJECT (dialog), "uri", g_strdup (uri), g_free); + + g_signal_connect (dialog, "response", + G_CALLBACK (image_drop_dialog_response), panel); + + gtk_widget_show (dialog); +} + static gboolean drop_urilist (PanelWidget *panel, int pos, @@ -661,8 +764,7 @@ drop_urilist (PanelWidget *panel, if (n_uris == 1 && mime && g_str_has_prefix (mime, "image")) { - if (!set_background_image_from_uri (panel->toplevel, uri)) - success = FALSE; + ask_about_image_drop (panel, pos, uri); } else if (mime && (!strcmp (mime, "application/x-mate-app-info") || !strcmp (mime, "application/x-desktop") || |