aboutsummaryrefslogtreecommitdiffstats
path: root/src/web_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/web_main.c')
-rw-r--r--src/web_main.c109
1 files changed, 107 insertions, 2 deletions
diff --git a/src/web_main.c b/src/web_main.c
index ad1b8d1..ca6730a 100644
--- a/src/web_main.c
+++ b/src/web_main.c
@@ -485,6 +485,97 @@ web_new_tab_switch_idle (gpointer data)
return FALSE;
}
+static gboolean
+web_page_button_press_cb (GtkWidget *page, GdkEventButton *event, WebData *data)
+{
+ GtkWidget *widget = glade_xml_get_widget (data->parent->xml,
+ "edit_button");
+
+ if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (widget)))
+ return FALSE;
+ if (data->clicked) return FALSE;
+
+ /* TODO: A right-click context menu, middle-click open in new tab? */
+ if (event->button != 1) return TRUE;
+
+ g_get_current_time (&data->click_start);
+ data->x = event->x_root;
+ data->y = event->y_root;
+ data->moved = FALSE;
+ data->clicked = TRUE;
+
+ return TRUE;
+}
+
+static gboolean
+web_page_motion_notify_cb (GtkWidget *page, GdkEventMotion *event,
+ WebData *data)
+{
+ GtkWidget *widget = glade_xml_get_widget (data->parent->xml,
+ "edit_button");
+
+ if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (widget)))
+ return FALSE;
+ if (!data->clicked) return FALSE;
+
+ if ((abs (event->x_root - data->x) > 3) ||
+ (abs (event->y_root - data->y) > 3)) {
+ data->moved = TRUE;
+ }
+
+ if (data->moved) {
+ gdouble h, v;
+ GtkAdjustment *hadjust = gtk_scrolled_window_get_hadjustment (
+ GTK_SCROLLED_WINDOW (data->scroll));
+ GtkAdjustment *vadjust = gtk_scrolled_window_get_vadjustment (
+ GTK_SCROLLED_WINDOW (data->scroll));
+ h = gtk_adjustment_get_value (hadjust) +
+ (2*(event->x_root - data->x));
+ v = gtk_adjustment_get_value (vadjust) +
+ (2*(event->y_root - data->y));
+ data->x = event->x_root;
+ data->y = event->y_root;
+ if ((h >= hadjust->lower) &&
+ (h <= (hadjust->upper - hadjust->page_size)))
+ gtk_adjustment_set_value (hadjust, h);
+ if ((v >= vadjust->lower) &&
+ (v <= (vadjust->upper - vadjust->page_size)))
+ gtk_adjustment_set_value (vadjust, v);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+web_page_button_release_cb (GtkWidget *page, GdkEventButton *event,
+ WebData *data)
+{
+ GTimeVal current;
+ GtkWidget *widget = glade_xml_get_widget (data->parent->xml,
+ "edit_button");
+
+ if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (widget)))
+ return FALSE;
+ if (!data->clicked) return FALSE;
+ if (event->button != 1) return TRUE;
+
+ g_get_current_time (&current);
+
+ if ((!data->moved) &&
+ ((current.tv_sec > data->click_start.tv_sec) ||
+ (current.tv_usec - data->click_start.tv_usec > 500))) {
+ /* Send synthetic click event to avoid jitter */
+ event->type = GDK_BUTTON_PRESS;
+ gtk_widget_event (page, (GdkEvent *)event);
+ data->clicked = FALSE;
+ event->type = GDK_BUTTON_RELEASE;
+ gtk_widget_event (page, (GdkEvent *)event);
+ }
+ data->clicked = FALSE;
+
+ return TRUE;
+}
+
static void
web_new_tab_cb (GtkWidget *source, WebPages *wdata)
{
@@ -508,6 +599,12 @@ web_new_tab_cb (GtkWidget *source, WebPages *wdata)
wdata->backend->set_zoom (wdata->backend_data, data->page_data,
wdata->last_zoom);
+ /* Attach to mouse-button signals for jitter correction and such */
+ g_signal_connect (G_OBJECT (widget), "button-press-event",
+ G_CALLBACK (web_page_button_press_cb), data);
+ g_signal_connect (G_OBJECT (widget), "button-release-event",
+ G_CALLBACK (web_page_button_release_cb), data);
+
/* Create close button */
button = gtk_button_new ();
close_image = gtk_image_new_from_stock (
@@ -532,9 +629,17 @@ web_new_tab_cb (GtkWidget *source, WebPages *wdata)
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
gtk_box_pack_end (GTK_BOX (box), align, TRUE, TRUE, 0);
+ /* Create scrollview */
+ data->scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (data->scroll),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (data->scroll), widget);
+ g_signal_connect (G_OBJECT (data->scroll), "motion-notify-event",
+ G_CALLBACK (web_page_motion_notify_cb), data);
+
/* Create vpaned and vbox */
data->vpaned = gtk_vpaned_new ();
- gtk_paned_add2 (GTK_PANED (data->vpaned), widget);
+ gtk_paned_add2 (GTK_PANED (data->vpaned), data->scroll);
data->vbox = gtk_vbox_new (FALSE, 0);
gtk_box_pack_end (GTK_BOX (data->vbox),
GTK_WIDGET (data->vpaned), TRUE, TRUE, 0);
@@ -840,7 +945,7 @@ main (int argc, char **argv)
pages.book = GTK_NOTEBOOK (
glade_xml_get_widget (pages.xml, "pages_notebook"));
- /* Set transient parents for about/preferences dialogs and hide them */
+ /* Set transient parents for about/preferences dialogs */
gtk_window_set_transient_for (
GTK_WINDOW (glade_xml_get_widget (pages.xml, "about_dialog")),
GTK_WINDOW (pages.window));