summaryrefslogtreecommitdiff
path: root/gtk/gtk_scaffolding.c
diff options
context:
space:
mode:
authorSean Fox <dyntryx@gmail.com>2009-01-30 21:23:10 +0000
committerSean Fox <dyntryx@gmail.com>2009-01-30 21:23:10 +0000
commit0de839335866f08fb8e781665593d20a1f54e864 (patch)
treead9fe9ab2299d3633e0b0cf8ccecd4458591544c /gtk/gtk_scaffolding.c
parent376ef0ca478eaf16d641de019b8e2e87672c4a3a (diff)
downloadnetsurf-0de839335866f08fb8e781665593d20a1f54e864.tar.gz
netsurf-0de839335866f08fb8e781665593d20a1f54e864.tar.bz2
Save page support on the context menu.
svn path=/trunk/netsurf/; revision=6305
Diffstat (limited to 'gtk/gtk_scaffolding.c')
-rw-r--r--gtk/gtk_scaffolding.c117
1 files changed, 98 insertions, 19 deletions
diff --git a/gtk/gtk_scaffolding.c b/gtk/gtk_scaffolding.c
index d1df660a4..7305bb96d 100644
--- a/gtk/gtk_scaffolding.c
+++ b/gtk/gtk_scaffolding.c
@@ -88,7 +88,7 @@ struct gtk_scaffolding {
GladeXML *xml;
GladeXML *popup_xml;
- GtkMenu *popup_menu;
+ GtkMenu *popup_menu;
struct gtk_history_window *history_window;
GtkDialog *preferences_dialog;
@@ -113,15 +113,21 @@ struct menu_events {
};
static int open_windows = 0; /**< current number of open browsers */
-static struct gtk_scaffolding *current_model; /**< current window for model dialogue use */
+static struct gtk_scaffolding *current_model; /**< current window for model
+ dialogue use */
+static struct box *current_menu_link_box; /**< pointer to the box containing a
+ link under the mouse, or 0 if none */
static gboolean nsgtk_window_delete_event(GtkWidget *, gpointer);
static void nsgtk_window_destroy_event(GtkWidget *, gpointer);
static void nsgtk_window_update_back_forward(struct gtk_scaffolding *);
static void nsgtk_throb(void *);
-static gboolean nsgtk_window_edit_menu_clicked(GtkWidget *widget, struct gtk_scaffolding *g);
-static gboolean nsgtk_window_edit_menu_hidden(GtkWidget *widget, struct gtk_scaffolding *g);
-static gboolean nsgtk_window_popup_menu_hidden(GtkWidget *widget, struct gtk_scaffolding *g);
+static gboolean nsgtk_window_edit_menu_clicked(GtkWidget *widget,
+ struct gtk_scaffolding *g);
+static gboolean nsgtk_window_edit_menu_hidden(GtkWidget *widget,
+ struct gtk_scaffolding *g);
+static gboolean nsgtk_window_popup_menu_hidden(GtkWidget *widget,
+ struct gtk_scaffolding *g);
static gboolean nsgtk_window_back_button_clicked(GtkWidget *, gpointer);
static gboolean nsgtk_window_forward_button_clicked(GtkWidget *, gpointer);
static gboolean nsgtk_window_stop_button_clicked(GtkWidget *, gpointer);
@@ -130,13 +136,20 @@ static gboolean nsgtk_window_home_button_clicked(GtkWidget *, gpointer);
static gboolean nsgtk_window_url_activate_event(GtkWidget *, gpointer);
static gboolean nsgtk_window_url_changed(GtkWidget *, GdkEventKey *, gpointer);
-static void nsgtk_scaffolding_update_edit_actions_sensitivity (struct gtk_scaffolding *g, GladeXML *xml, gboolean hide);
-static void nsgtk_scaffolding_enable_edit_actions_sensitivity (struct gtk_scaffolding *g, GladeXML *xml);
+static guint nsgtk_scaffolding_update_save_link_sensitivity
+ (struct gtk_scaffolding *g, GladeXML *xml, gdouble x, gdouble y,
+ gboolean hide);
+static guint nsgtk_scaffolding_update_edit_actions_sensitivity
+ (struct gtk_scaffolding *g, GladeXML *xml, gboolean hide);
+static void nsgtk_scaffolding_enable_save_link_sensitivity
+ (struct gtk_scaffolding *g, GladeXML *xml);
+static void nsgtk_scaffolding_enable_edit_actions_sensitivity
+ (struct gtk_scaffolding *g, GladeXML *xml);
static gboolean nsgtk_history_expose_event(GtkWidget *, GdkEventExpose *,
- gpointer);
+ gpointer);
static gboolean nsgtk_history_button_press_event(GtkWidget *, GdkEventButton *,
- gpointer);
+ gpointer);
static void nsgtk_attach_menu_handlers(GladeXML *, gpointer);
static void nsgtk_window_tabs_num_changed(GtkNotebook *notebook,
@@ -160,6 +173,7 @@ MENUPROTO(close_window);
MENUPROTO(quit);
/* edit menu */
+MENUPROTO(save_link);
MENUPROTO(cut);
MENUPROTO(copy);
MENUPROTO(paste);
@@ -214,6 +228,7 @@ static struct menu_events menu_events[] = {
MENUEVENT(quit),
/* edit menu */
+ MENUEVENT(save_link),
MENUEVENT(cut),
MENUEVENT(copy),
MENUEVENT(paste),
@@ -363,6 +378,7 @@ static gboolean nsgtk_window_edit_menu_hidden(GtkWidget *widget, struct gtk_scaf
static gboolean nsgtk_window_popup_menu_hidden(GtkWidget *widget, struct gtk_scaffolding *g)
{
+ nsgtk_scaffolding_enable_save_link_sensitivity(g, g->popup_xml);
nsgtk_scaffolding_enable_edit_actions_sensitivity(g, g->popup_xml);
return TRUE;
@@ -648,6 +664,21 @@ MENUHANDLER(quit)
return TRUE;
}
+MENUHANDLER(save_link)
+{
+ struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
+ struct gui_window *gui = gw->top_level;
+ struct browser_window *bw = nsgtk_get_browser_for_gui(gui);
+
+ if (!current_menu_link_box)
+ return FALSE;
+
+ browser_window_download(bw, current_menu_link_box->href,
+ bw->current_content->url);
+
+ return TRUE;
+}
+
MENUHANDLER(cut)
{
struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
@@ -1232,6 +1263,8 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
nsgtk_window_forward_button_clicked, g);
CONNECT(glade_xml_get_widget(g->popup_xml, "popupReload"), "activate",
nsgtk_window_reload_button_clicked, g);
+ CONNECT(glade_xml_get_widget(g->popup_xml, "save_link_popup"), "activate",
+ nsgtk_on_save_link_activate, g);
CONNECT(glade_xml_get_widget(g->popup_xml, "cut_popup"), "activate",
nsgtk_on_cut_activate, g);
CONNECT(glade_xml_get_widget(g->popup_xml, "copy_popup"), "activate",
@@ -1355,14 +1388,54 @@ void nsgtk_scaffolding_set_top_level (struct gui_window *gw)
gw->scaffold->top_level = gw;
}
-void nsgtk_scaffolding_popup_menu(struct gtk_scaffolding *g, guint button)
+void nsgtk_scaffolding_popup_menu(struct gtk_scaffolding *g,
+ gdouble x, gdouble y)
{
- nsgtk_scaffolding_update_edit_actions_sensitivity(g, g->popup_xml, TRUE);
- gtk_menu_popup(g->popup_menu, NULL, NULL, NULL, NULL, 0,
- gtk_get_current_event_time());
+ guint available_menu_options = 0;
+ GtkWidget *widget = NULL;
+
+ available_menu_options |=
+ nsgtk_scaffolding_update_save_link_sensitivity(g,
+ g->popup_xml, x, y, TRUE);
+ available_menu_options |=
+ nsgtk_scaffolding_update_edit_actions_sensitivity(g,
+ g->popup_xml, TRUE);
+
+ /* Hide the separator as well */
+ if (!available_menu_options) {
+ widget = glade_xml_get_widget(g->popup_xml, "separator");
+ gtk_widget_hide(widget);
+ }
+
+ gtk_menu_popup(g->popup_menu, NULL, NULL, NULL, NULL, 0,
+ gtk_get_current_event_time());
}
-static void nsgtk_scaffolding_update_edit_actions_sensitivity
+static guint nsgtk_scaffolding_update_save_link_sensitivity
+ (struct gtk_scaffolding *g, GladeXML *xml, gdouble x, gdouble y,
+ gboolean hide)
+{
+ GtkWidget *widget = glade_xml_get_widget_prefix(xml, "save_link")->data;
+ struct browser_window *bw = nsgtk_get_browser_for_gui(g->top_level);
+ current_menu_link_box = 0;
+
+ if (bw->current_content &&
+ bw->current_content->type == CONTENT_HTML)
+ current_menu_link_box = box_href_at_point(bw->current_content,
+ x, y);
+
+ if (current_menu_link_box)
+ gtk_widget_set_sensitive (widget, TRUE);
+ else
+ gtk_widget_set_sensitive (widget, FALSE);
+
+ if (hide && !current_menu_link_box)
+ gtk_widget_hide(widget);
+
+ return (current_menu_link_box ? 1 : 0);
+}
+
+static guint nsgtk_scaffolding_update_edit_actions_sensitivity
(struct gtk_scaffolding *g, GladeXML *xml, gboolean hide)
{
GtkWidget *widget = gtk_window_get_focus(g->window);
@@ -1402,11 +1475,17 @@ static void nsgtk_scaffolding_update_edit_actions_sensitivity
if (hide && !can_paste)
gtk_widget_hide(widget);
- /* If its for the popup menu, handle seperator too */
- if (hide && !(can_paste || can_cut || can_copy)){
- widget = glade_xml_get_widget(xml, "separator");
- gtk_widget_hide(widget);
- }
+ return (can_paste | can_cut | can_copy);
+}
+
+static void nsgtk_scaffolding_enable_save_link_sensitivity
+ (struct gtk_scaffolding *g, GladeXML *xml)
+{
+ GtkWidget *widget;
+
+ widget = glade_xml_get_widget_prefix(xml, "save_link")->data;
+ gtk_widget_set_sensitive (widget, TRUE);
+ gtk_widget_show(widget);
}
static void nsgtk_scaffolding_enable_edit_actions_sensitivity