diff --git a/src/ghtml-webkit.c b/src/ghtml-webkit.c index dde8492..5351ce6 100644 --- a/src/ghtml-webkit.c +++ b/src/ghtml-webkit.c @@ -44,10 +44,13 @@ static void _on_load_progress_changed(WebKitWebView * view, gint progress, gpointer data); static void _on_load_started(WebKitWebView * view, WebKitWebFrame * frame, gpointer data); -static void _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame, - gchar * message, gpointer data); +static gboolean _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame, + const gchar * message, gpointer data); static gboolean _on_script_confirm(WebKitWebView * view, WebKitWebFrame * frame, - gchar * message, gboolean confirmed, gpointer data); + const gchar * message, gboolean * confirmed, gpointer data); +static gboolean _on_script_prompt(WebKitWebView * view, WebKitWebFrame * frame, + const gchar * message, const gchar * default_value, + gchar ** value, gpointer data); static void _on_status_bar_text_changed(WebKitWebView * view, gchar * arg1, gpointer data); static void _on_title_changed(WebKitWebView * view, WebKitWebFrame * frame, @@ -89,6 +92,8 @@ GtkWidget * ghtml_new(Surfer * surfer) _on_script_alert), widget); g_signal_connect(G_OBJECT(view), "script-confirm", G_CALLBACK( _on_script_confirm), widget); + g_signal_connect(G_OBJECT(view), "script-prompt", G_CALLBACK( + _on_script_prompt), widget); g_signal_connect(G_OBJECT(view), "status-bar-text-changed", G_CALLBACK( _on_status_bar_text_changed), widget); g_signal_connect(G_OBJECT(view), "title-changed", G_CALLBACK( @@ -464,23 +469,39 @@ static void _on_load_started(WebKitWebView * view, WebKitWebFrame * frame, /* on_script_alert */ -static void _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame, - gchar * message, gpointer data) +static gboolean _on_script_alert(WebKitWebView * view, WebKitWebFrame * frame, + const gchar * message, gpointer data) { Surfer * surfer; surfer = g_object_get_data(G_OBJECT(data), "surfer"); surfer_warning(surfer, message); + return TRUE; } static gboolean _on_script_confirm(WebKitWebView * view, WebKitWebFrame * frame, - gchar * message, gboolean confirmed, gpointer data) + const gchar * message, gboolean * confirmed, gpointer data) { Surfer * surfer; surfer = g_object_get_data(G_OBJECT(data), "surfer"); - return surfer_confirm(surfer, message); + if(surfer_confirm(surfer, message, confirmed) != 0) + *confirmed = FALSE; + return TRUE; +} + +static gboolean _on_script_prompt(WebKitWebView * view, WebKitWebFrame * frame, + const gchar * message, const gchar * default_value, + gchar ** value, gpointer data) +{ + Surfer * surfer; + + surfer = g_object_get_data(G_OBJECT(data), "surfer"); + if(surfer_prompt(surfer, message, default_value, value) == 0) + return TRUE; + *value = NULL; + return TRUE; } diff --git a/src/surfer.c b/src/surfer.c index 032d5b0..90db2a3 100644 --- a/src/surfer.c +++ b/src/surfer.c @@ -543,10 +543,11 @@ int surfer_config_save(Surfer * surfer) /* surfer_confirm */ -int surfer_confirm(Surfer * surfer, char const * message) +int surfer_confirm(Surfer * surfer, char const * message, gboolean * confirmed) { - int ret; + int ret = 0; GtkWidget * dialog; + int res; dialog = gtk_message_dialog_new((surfer != NULL) ? GTK_WINDOW(surfer->window) : NULL, @@ -556,11 +557,15 @@ int surfer_confirm(Surfer * surfer, char const * message) gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", message); gtk_window_set_title(GTK_WINDOW(dialog), _("Question")); - g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK( - gtk_widget_destroy), NULL); - ret = gtk_dialog_run(GTK_DIALOG(dialog)); + res = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); - return (ret == GTK_RESPONSE_YES) ? 1 : 0; + if(res == GTK_RESPONSE_YES) + *confirmed = TRUE; + else if(res == GTK_RESPONSE_NO) + *confirmed = FALSE; + else + ret = 1; + return ret; } @@ -607,9 +612,8 @@ int surfer_error(Surfer * surfer, char const * message, int ret) gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", (message != NULL) ? message : _("Unknown error")); gtk_window_set_title(GTK_WINDOW(dialog), _("Error")); - g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK( - gtk_widget_destroy), NULL); - gtk_widget_show(dialog); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); return ret; } @@ -843,6 +847,39 @@ void surfer_print(Surfer * surfer) } +/* surfer_prompt */ +int surfer_prompt(Surfer * surfer, char const * message, + char const * default_value, char ** value) +{ + int ret = 0; + GtkWidget * dialog; + GtkWidget * vbox; + GtkWidget * entry; + int res; + + dialog = gtk_message_dialog_new((surfer != NULL) + ? GTK_WINDOW(surfer->window) : NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, "%s", + _("Question")); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), + "%s", message); + gtk_window_set_title(GTK_WINDOW(dialog), _("Question")); + vbox = GTK_DIALOG(dialog)->vbox; + entry = gtk_entry_new(); + if(default_value != NULL) + gtk_entry_set_text(GTK_ENTRY(entry), default_value); + gtk_widget_show(entry); + gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, TRUE, 0); + if((res = gtk_dialog_run(GTK_DIALOG(dialog))) == GTK_RESPONSE_OK) + *value = strdup(gtk_entry_get_text(GTK_ENTRY(entry))); + else + ret = 1; + gtk_widget_destroy(dialog); + return ret; +} + + /* surfer_refresh */ void surfer_refresh(Surfer * surfer) { @@ -1074,9 +1111,8 @@ void surfer_warning(Surfer * surfer, char const * message) gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", message); gtk_window_set_title(GTK_WINDOW(dialog), _("Warning")); - g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK( - gtk_widget_destroy), NULL); - gtk_widget_show(dialog); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); } diff --git a/src/surfer.h b/src/surfer.h index 141a6c0..91a238d 100644 --- a/src/surfer.h +++ b/src/surfer.h @@ -65,8 +65,10 @@ void surfer_set_title(Surfer * surfer, char const * title); int surfer_config_load(Surfer * surfer); int surfer_config_save(Surfer * surfer); -int surfer_confirm(Surfer * surfer, char const * message); +int surfer_confirm(Surfer * surfer, char const * message, gboolean * confirmed); int surfer_error(Surfer * surfer, char const * message, int ret); +int surfer_prompt(Surfer * surfer, char const * message, + char const * default_value, char ** value); void surfer_warning(Surfer * surfer, char const * message); void surfer_open(Surfer * surfer, char const * url);