aboutsummaryrefslogtreecommitdiffstats
path: root/lib/widgets/ephy-history-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/widgets/ephy-history-view.c')
-rw-r--r--lib/widgets/ephy-history-view.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/widgets/ephy-history-view.c b/lib/widgets/ephy-history-view.c
index 461d308a2..27d45aead 100644
--- a/lib/widgets/ephy-history-view.c
+++ b/lib/widgets/ephy-history-view.c
@@ -27,8 +27,21 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#define EPHY_HISTORY_VIEW_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_HISTORY_VIEW, EphyHistoryViewPrivate))
+
+struct _EphyHistoryViewPrivate
+{
+ GtkTreePath *pressed_path;
+};
+
G_DEFINE_TYPE (EphyHistoryView, ephy_history_view, GTK_TYPE_TREE_VIEW)
+enum {
+ ROW_MIDDLE_CLICKED,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
static gboolean
button_event_modifies_selection (GdkEventButton *event)
@@ -40,6 +53,7 @@ static gboolean
ephy_history_view_button_press (GtkWidget *treeview,
GdkEventButton *event)
{
+ EphyHistoryView *view;
GtkTreeSelection *selection;
GtkTreePath *path = NULL;
gboolean path_is_selected, call_parent = TRUE;
@@ -73,6 +87,11 @@ ephy_history_view_button_press (GtkWidget *treeview,
gboolean retval;
g_signal_emit_by_name (treeview, "popup_menu", &retval);
+ } else if (event->button == 2) {
+ view = EPHY_HISTORY_VIEW (treeview);
+ if (view->priv->pressed_path)
+ gtk_tree_path_free (view->priv->pressed_path);
+ view->priv->pressed_path = gtk_tree_path_copy (path);
}
gtk_tree_path_free (path);
}
@@ -80,12 +99,60 @@ ephy_history_view_button_press (GtkWidget *treeview,
return FALSE;
}
+static gboolean
+ephy_history_view_button_release (GtkWidget *treeview,
+ GdkEventButton *event)
+{
+ EphyHistoryView *view;
+ GtkTreePath *path;
+
+ view = EPHY_HISTORY_VIEW (treeview);
+
+ if (view->priv->pressed_path && event->button == 2 &&
+ gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview),
+ event->x,
+ event->y,
+ &path,
+ NULL, NULL, NULL)) {
+ if (gtk_tree_path_compare (view->priv->pressed_path, path) == 0)
+ g_signal_emit (view, signals[ROW_MIDDLE_CLICKED], 0, path);
+ gtk_tree_path_free (path);
+ }
+
+ return FALSE;
+}
+
+static void
+ephy_history_view_finalize (GObject *object)
+{
+ EphyHistoryView *view = EPHY_HISTORY_VIEW (object);
+
+ if (view->priv->pressed_path)
+ gtk_tree_path_free (view->priv->pressed_path);
+
+ G_OBJECT_CLASS (ephy_history_view_parent_class)->finalize (object);
+}
+
static void
ephy_history_view_class_init (EphyHistoryViewClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ object_class->finalize = ephy_history_view_finalize;
widget_class->button_press_event = ephy_history_view_button_press;
+ widget_class->button_release_event = ephy_history_view_button_release;
+
+ signals[ROW_MIDDLE_CLICKED] = g_signal_new ("row-middle-clicked",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EphyHistoryViewClass, row_middle_clicked),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_POINTER);
+ g_type_class_add_private (object_class, sizeof (EphyHistoryViewPrivate));
}
static void
@@ -93,6 +160,8 @@ ephy_history_view_init (EphyHistoryView *self)
{
GtkTreeSelection *selection;
+ self->priv = EPHY_HISTORY_VIEW_GET_PRIVATE (self);
+
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
}