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);