clear_button_clicked_cb (GtkWidget* button, GtkWidget* file_chooser)
{
gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (file_chooser), "");
- /* Emit "file-set" manually for Gtk doesn't emit it otherwise
- FIXME: file-set is Gtk+ >= 2.12 */
+ /* Emit signal manually for Gtk doesn't emit it otherwise */
+ #if GTK_CHECK_VERSION (2, 12, 0)
g_signal_emit_by_name (file_chooser, "file-set");
+ #else
+ g_signal_emit_by_name (file_chooser, "selection-changed");
+ #endif
}
static void
return GTK_WIDGET (preferences);
}
+static gboolean
+proxy_download_manager_icon_cb (GtkWidget* entry,
+ GdkEventFocus* event,
+ GtkImage* icon)
+{
+ const gchar* program;
+ gchar* path;
+
+ program = gtk_entry_get_text (GTK_ENTRY (entry));
+ path = g_find_program_in_path (program);
+
+ if (path)
+ {
+ if (gtk_icon_theme_has_icon (gtk_icon_theme_get_for_screen (
+ gtk_widget_get_screen (entry)), program))
+ gtk_image_set_from_icon_name (icon, program, GTK_ICON_SIZE_MENU);
+ else
+ gtk_image_set_from_stock (icon, GTK_STOCK_EXECUTE, GTK_ICON_SIZE_MENU);
+ g_free (path);
+ }
+ else if (program && *program)
+ gtk_image_set_from_stock (icon, GTK_STOCK_STOP, GTK_ICON_SIZE_MENU);
+ else
+ gtk_image_clear (icon);
+
+ return FALSE;
+}
+
/**
* midori_preferences_set_settings:
* @settings: the settings
midori_preferences_set_settings (MidoriPreferences* preferences,
MidoriWebSettings* settings)
{
+ GtkSizeGroup* sizegroup;
+ GtkWidget* page;
+ GtkWidget* frame;
+ GtkWidget* table;
+ GtkWidget* align;
+ GtkWidget* label;
+ GtkWidget* button;
+ GtkWidget* entry;
+ GtkWidget* hbox;
+ gint icon_width, icon_height;
+
g_return_if_fail (MIDORI_IS_PREFERENCES (preferences));
g_return_if_fail (MIDORI_IS_WEB_SETTINGS (settings));
preferences->notebook = gtk_notebook_new ();
gtk_container_set_border_width (GTK_CONTAINER (preferences->notebook), 6);
- GtkSizeGroup* sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
- GtkWidget* page; GtkWidget* frame; GtkWidget* table; GtkWidget* align;
- GtkWidget* label; GtkWidget* button;
- GtkWidget* entry; GtkWidget* hbox;
+ sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
#define PAGE_NEW(__label) page = gtk_vbox_new (FALSE, 0); \
gtk_container_set_border_width (GTK_CONTAINER (page), 5); \
gtk_notebook_append_page (GTK_NOTEBOOK (preferences->notebook), page, \
INDENTED_ADD (label, 0, 1, 0, 1);
button = katze_property_proxy (settings, "download-folder", "folder");
FILLED_ADD (button, 1, 2, 0, 1);
- button = katze_property_proxy (settings, "show-download-notification", "blurb");
- SPANNED_ADD (button, 0, 2, 1, 2);
+ label = katze_property_label (settings, "download-manager");
+ INDENTED_ADD (label, 0, 1, 1, 2);
+ hbox = gtk_hbox_new (FALSE, 4);
+ button = gtk_image_new ();
+ gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (button),
+ GTK_ICON_SIZE_MENU, &icon_width, &icon_height);
+ gtk_widget_set_size_request (button, icon_width, icon_height);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4);
+ entry = katze_property_proxy (settings, "download-manager", NULL);
+ gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+ proxy_download_manager_icon_cb (entry, NULL, GTK_IMAGE (button));
+ g_signal_connect (entry, "focus-out-event",
+ G_CALLBACK (proxy_download_manager_icon_cb), button);
+ FILLED_ADD (hbox, 1, 2, 1, 2);
/* Page "Appearance" */
PAGE_NEW (_("Appearance"));
FILLED_ADD (hbox, 1, 2, 0, 1);
label = katze_property_label (settings, "minimum-font-size");
INDENTED_ADD (label, 0, 1, 1, 2);
- hbox = gtk_hbox_new (FALSE, 4);
entry = katze_property_proxy (settings, "minimum-font-size", NULL);
INDENTED_ADD (entry, 1, 2, 1, 2);
label = katze_property_label (settings, "preferred-encoding");
MidoriStartup load_on_startup;
gchar* homepage;
gchar* download_folder;
- gboolean show_download_notification;
+ gchar* download_manager;
gchar* location_entry_search;
MidoriPreferredEncoding preferred_encoding;
PROP_LOAD_ON_STARTUP,
PROP_HOMEPAGE,
PROP_DOWNLOAD_FOLDER,
- PROP_SHOW_DOWNLOAD_NOTIFICATION,
+ PROP_DOWNLOAD_MANAGER,
PROP_LOCATION_ENTRY_SEARCH,
PROP_PREFERRED_ENCODING,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
- PROP_SHOW_DOWNLOAD_NOTIFICATION,
- g_param_spec_boolean (
- "show-download-notification",
- _("Show Download Notification"),
- _("Show a notification window for finished downloads"),
- TRUE,
- G_PARAM_READABLE));
+ PROP_DOWNLOAD_MANAGER,
+ g_param_spec_string (
+ "download-manager",
+ _("Download Manager"),
+ _("An external download manager"),
+ NULL,
+ flags));
g_object_class_install_property (gobject_class,
PROP_LOCATION_ENTRY_SEARCH,
case PROP_DOWNLOAD_FOLDER:
katze_assign (web_settings->download_folder, g_value_dup_string (value));
break;
- case PROP_SHOW_DOWNLOAD_NOTIFICATION:
- web_settings->show_download_notification = g_value_get_boolean (value);
+ case PROP_DOWNLOAD_MANAGER:
+ katze_assign (web_settings->download_manager, g_value_dup_string (value));
break;
case PROP_LOCATION_ENTRY_SEARCH:
katze_assign (web_settings->location_entry_search, g_value_dup_string (value));
case PROP_DOWNLOAD_FOLDER:
g_value_set_string (value, web_settings->download_folder);
break;
- case PROP_SHOW_DOWNLOAD_NOTIFICATION:
- g_value_set_boolean (value, web_settings->show_download_notification);
+ case PROP_DOWNLOAD_MANAGER:
+ g_value_set_string (value, web_settings->download_manager);
break;
case PROP_LOCATION_ENTRY_SEARCH:
g_value_set_string (value, web_settings->location_entry_search);
"load-on-startup", web_settings->load_on_startup,
"homepage", web_settings->homepage,
"download-folder", web_settings->download_folder,
- "show-download-notification", web_settings->show_download_notification,
+ "download-manager", web_settings->download_manager,
"location-entry-search", web_settings->location_entry_search,
"preferred-encoding", web_settings->preferred_encoding,
struct _MidoriWebSettingsClass
{
WebKitWebSettingsClass parent_class;
-
- /* Signals */
- void
- (*dummy) (MidoriWebSettings* web_settings);
};
GType
g_signal_emit (web_view, signals[NEW_WINDOW], 0, uri);
}
+static void
+midori_web_view_menu_download_activate_cb (GtkWidget* widget,
+ MidoriWebView* web_view)
+{
+ gchar* program;
+ const gchar* uri;
+
+ g_object_get (web_view->settings, "download-manager", &program, NULL);
+ uri = g_object_get_data (G_OBJECT (widget), "uri");
+ sokoke_spawn_program (program, uri);
+ g_free (program);
+}
+
static void
webkit_web_view_populate_popup_cb (GtkWidget* web_view,
GtkWidget* menu)
GtkWidget* icon;
gchar* text;
GList* items;
+ gchar* program;
uri = midori_web_view_get_link_uri (MIDORI_WEB_VIEW (web_view));
if (uri)
/* hack to disable non-functional Download File */
gtk_widget_set_sensitive (menuitem, FALSE);
g_list_free (items);
+ g_object_get (MIDORI_WEB_VIEW (web_view)->settings,
+ "download-manager", &program, NULL);
+ if (program && *program)
+ {
+ menuitem = gtk_image_menu_item_new_with_mnemonic (
+ _("Download Link with Download _Manager"));
+ icon = gtk_image_new_from_stock (GTK_STOCK_SAVE_AS,
+ GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon);
+ gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 4);
+ g_object_set_data (G_OBJECT (menuitem), "uri", (gchar*)uri);
+ g_signal_connect (menuitem, "activate",
+ G_CALLBACK (midori_web_view_menu_download_activate_cb), web_view);
+ gtk_widget_show (menuitem);
+ }
}
if (!uri && webkit_web_view_has_selection (WEBKIT_WEB_VIEW (web_view)))
#include <glib/gi18n.h>
#include <glib/gprintf.h>
+static void
+error_dialog (const gchar* short_message,
+ const gchar* detailed_message)
+{
+ GtkWidget* dialog = gtk_message_dialog_new (
+ NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, short_message);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", detailed_message);
+ gtk_widget_show (dialog);
+ g_signal_connect_swapped (dialog, "response",
+ G_CALLBACK (gtk_widget_destroy), dialog);
+
+
+}
+
+gboolean
+sokoke_spawn_program (const gchar* command,
+ const gchar* argument)
+{
+ gchar* argument_escaped;
+ gchar* command_ready;
+ gchar** argv;
+ GError* error;
+
+ argument_escaped = g_shell_quote (argument);
+ if (strstr (command, "%s"))
+ command_ready = g_strdup_printf (command, argument_escaped);
+ else
+ command_ready = g_strconcat (command, " ", argument_escaped, NULL);
+
+ error = NULL;
+ if (!g_shell_parse_argv (command_ready, NULL, &argv, &error))
+ {
+ error_dialog (_("Could not run external program."), error->message);
+ g_error_free (error);
+ g_free (command_ready);
+ g_free (argument_escaped);
+ return FALSE;
+ }
+
+ error = NULL;
+ if (!g_spawn_async (NULL, argv, NULL,
+ (GSpawnFlags)G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL, NULL, NULL, &error))
+ {
+ error_dialog (_("Could not run external program."), error->message);
+ g_error_free (error);
+ }
+
+ g_strfreev (argv);
+ g_free (command_ready);
+ g_free (argument_escaped);
+ return TRUE;
+}
+
gchar*
sokoke_magic_uri (const gchar* uri,
MidoriWebList* search_engines)
/* Many themes need this hack for small toolbars to work */
#define GTK_ICON_SIZE_SMALL_TOOLBAR GTK_ICON_SIZE_BUTTON
+gboolean
+sokoke_spawn_program (const gchar* command,
+ const gchar* argument);
+
gchar*
sokoke_magic_uri (const gchar* uri,
MidoriWebList* search_engines);