diff options
Diffstat (limited to 'src/web_main.c')
-rw-r--r-- | src/web_main.c | 109 |
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 (¤t); + + 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)); |