1 diff -r -U5 gtkhtml-3.24.4/gtkhtml/gtkhtml.c gtkhtml-3.24.4/gtkhtml/gtkhtml.c
2 --- gtkhtml-3.24.4/gtkhtml/gtkhtml.c 2008-10-16 12:07:24.000000000 +0200
3 +++ gtkhtml-3.24.4/gtkhtml/gtkhtml.c 2008-10-16 12:09:36.000000000 +0200
4 @@ -1712,10 +1712,11 @@
5 GdkWindow *window = widget->window;
8 guint mouse_double_click_threshold = MOUSE_DBLCLK_THRESHOLD ;
9 GtkSettings *gtk_settings = gtk_widget_get_settings (widget) ;
10 + GtkHTML *html = NULL ;
12 if (NULL != gtk_settings)
13 g_object_get (G_OBJECT (gtk_settings), "gtk-double-click-distance", &mouse_double_click_threshold, NULL) ;
15 g_return_val_if_fail (widget != NULL, 0);
16 @@ -1731,55 +1732,60 @@
18 gdk_window_get_pointer (GTK_LAYOUT (widget)->bin_window, &x, &y, NULL);
20 gdk_device_get_state (event->device, GTK_LAYOUT (widget)->bin_window, NULL, NULL) ;
22 + html = GTK_HTML (widget) ;
24 /* If there is only a small motion from the origin and simple
25 doubleclick is active, abort the motion, otherwise clear simple_dblclick flag */
26 - if (GTK_HTML (widget)->simple_dblclick) {
27 - GtkHTML *html = GTK_HTML (widget);
29 + if (html->simple_dblclick) {
30 if (abs(x - html->selection_x1) <= mouse_double_click_threshold &&
31 abs(y - html->selection_y1) <= mouse_double_click_threshold)
34 html->simple_dblclick = FALSE;
37 if (!mouse_change_pos (widget, window, x, y, event->state))
40 - engine = GTK_HTML (widget)->engine;
41 - if (GTK_HTML (widget)->in_selection_drag && html_engine_get_editable (engine))
42 + engine = html->engine;
43 + if (html->in_selection_drag && html_engine_get_editable (engine))
44 html_engine_jump_at (engine, x, y);
46 /* (TL 18-Nov-05) Added panning feature */
47 - if (GTK_HTML (widget)->panning) {
48 + if (html->panning) {
53 - dx = x - GTK_HTML (widget)->lastx;
54 - dy = y - GTK_HTML (widget)->lasty;
55 + dx = x - html->lastx;
56 + dy = y - html->lasty;
58 /* Vertical panning */
59 adj = gtk_layout_get_vadjustment(GTK_LAYOUT(widget));
60 value = adj->value - (gdouble) dy;
61 if (value < adj->lower)
63 else if (value > (adj->upper - adj->page_size))
64 value = adj->upper - adj->page_size;
65 + if (ABS (html->y_amount_panned) < mouse_double_click_threshold)
66 + html->y_amount_panned += (gint)(value - adj->value) ;
67 gtk_adjustment_set_value(adj, value);
69 /* Horizontal panning */
70 adj = gtk_layout_get_hadjustment(GTK_LAYOUT(widget));
71 value = adj->value - (gdouble) dx;
72 if (value < adj->lower)
74 else if (value > (adj->upper - adj->page_size))
75 value = adj->upper - adj->page_size;
76 + if (ABS (html->x_amount_panned) < mouse_double_click_threshold)
77 + html->x_amount_panned += (gint)(value - adj->value) ;
78 gtk_adjustment_set_value(adj, value);
85 @@ -1830,18 +1836,20 @@
86 GdkEventButton *event)
89 GtkWidget *orig_widget = widget;
92 + gint value, x, y, xWnd, yWnd;
94 /* printf ("button_press_event\n"); */
99 + gdk_window_get_pointer (widget->window, &xWnd, &yWnd, NULL) ;
100 widget = shift_to_iframe_parent (widget, &x, &y);
101 + shift_to_iframe_parent (orig_widget, &xWnd, &yWnd) ;
102 html = GTK_HTML (widget);
103 engine = html->engine;
105 if (event->button == 1 || ((event->button == 2 || event->button == 3)
106 && html_engine_get_editable (engine)))
107 @@ -1897,12 +1905,14 @@
109 /*html->in_selection_drag = TRUE;*/
110 /* (TL 18-Nov-05) First click starts panning, not selection */
111 html->in_selection_drag = FALSE;
112 html->panning = TRUE;
115 + html->x_amount_panned =
116 + html->y_amount_panned = 0 ;
117 + html->lastx = xWnd + gtk_adjustment_get_value (gtk_layout_get_hadjustment (GTK_LAYOUT (widget)));
118 + html->lasty = yWnd + gtk_adjustment_get_value (gtk_layout_get_vadjustment (GTK_LAYOUT (widget)));
120 if (html_engine_get_editable (engine)) {
123 obj = html_engine_get_object_at (engine, x, y, NULL, FALSE);
124 @@ -1970,10 +1980,12 @@
125 /*html->in_selection_drag = FALSE;
126 gtk_html_select_word (html);*/
127 /* (TL 18-Nov-05) Second click starts selection and stops panning */
128 html->in_selection_drag = TRUE;
129 html->panning = FALSE;
130 + html->x_amount_panned =
131 + html->y_amount_panned = 0 ;
132 html->in_selection = TRUE;
133 /* Check for simple double click, for selecting a word */
134 html->simple_dblclick = TRUE;
135 html->selection_x1 = x;
136 html->selection_y1 = y;
137 @@ -1982,10 +1994,12 @@
138 /*html->in_selection_drag = FALSE;
139 gtk_html_select_line (html);*/
140 /* (TL 18-Nov-05) Third click starts selection and stops panning */
141 html->in_selection_drag = TRUE;
142 html->panning = FALSE;
143 + html->x_amount_panned =
144 + html->y_amount_panned = 0 ;
145 html->in_selection = TRUE;
150 @@ -2025,10 +2039,16 @@
151 update_primary_selection (html);
155 if (event->button == 1) {
156 + guint mouse_double_click_threshold = MOUSE_DBLCLK_THRESHOLD ;
157 + GtkSettings *gtk_settings = gtk_widget_get_settings (widget) ;
159 + if (NULL != gtk_settings)
160 + g_object_get (G_OBJECT (gtk_settings), "gtk-double-click-distance", &mouse_double_click_threshold, NULL) ;
163 if (html->in_selection_drag && html_engine_get_editable (engine))
164 html_engine_jump_at (engine, x, y);
166 html->in_selection_drag = FALSE;
167 @@ -2056,6 +2056,8 @@
168 html->panning = FALSE;
170 if (!html->priv->dnd_in_progress
171 + && ABS (html->x_amount_panned) < mouse_double_click_threshold
172 + && ABS (html->y_amount_panned) < mouse_double_click_threshold
173 && html->pointer_url != NULL && ! html->in_selection
174 && (!gtk_html_get_editable (html) || html->priv->in_url_test_mode)) {
175 g_signal_emit (widget, signals[LINK_CLICKED], 0, html->pointer_url);
176 @@ -2059,11 +2079,14 @@
177 focus_object = html_engine_get_object_at (html->engine, x, y, &offset, TRUE);
178 if (HTML_IS_TEXT (focus_object))
179 html_text_set_link_visited (HTML_TEXT (focus_object), (gint) offset, html->engine, TRUE);
184 + html->x_amount_panned =
185 + html->y_amount_panned = 0 ;
187 /* If it was a simple doubleclick select a word */
188 if (html->simple_dblclick) {
189 html->simple_dblclick = FALSE;
190 gtk_html_select_word(html);
192 @@ -3399,10 +3422,12 @@
193 html->selection_x1 = 0;
194 html->selection_y1 = 0;
196 /* (TL 18-Nov-05) For panning */
197 html->panning = FALSE;
198 + html->x_amount_panned =
199 + html->y_amount_panned = 0 ;
203 html->in_selection = FALSE;
204 html->in_selection_drag = FALSE;
205 diff -r -U5 gtkhtml-3.24.4/gtkhtml/gtkhtml.h gtkhtml-3.24.4/gtkhtml/gtkhtml.h
206 --- gtkhtml-3.24.4/gtkhtml/gtkhtml.h 2008-10-16 12:07:24.000000000 +0200
207 +++ gtkhtml-3.24.4/gtkhtml/gtkhtml.h 2008-10-16 12:09:41.000000000 +0200
210 /* (TL 18-Nov-05) Panning variables */
214 + gint x_amount_panned ;
215 + gint y_amount_panned ;
217 guint in_selection : 1;
218 guint in_selection_drag : 1;