Merge lp:~bratsche/oif/evince-move-gestures-into-view into lp:~oif-team/oif/evince-gestures-trunk

Proposed by Cody Russell
Status: Superseded
Proposed branch: lp:~bratsche/oif/evince-move-gestures-into-view
Merge into: lp:~oif-team/oif/evince-gestures-trunk
Diff against target: 570 lines (+234/-164)
6 files modified
configure.ac (+4/-2)
libview/ev-view-private.h (+8/-0)
libview/ev-view.c (+219/-2)
libview/ev-view.h (+1/-1)
previewer/ev-previewer-window.c (+1/-1)
shell/ev-window.c (+1/-158)
To merge this branch: bzr merge lp:~bratsche/oif/evince-move-gestures-into-view
Reviewer Review Type Date Requested Status
Open Input Framework Team Pending
Review via email: mp+43400@code.launchpad.net

This proposal has been superseded by a proposal from 2011-01-06.

Description of the change

This branch requires the following first:

https://code.launchpad.net/~bratsche/libgrip/event-routing/+merge/43378

This moves the gesture logic out of EvWindow and into EvView, as well as simply updating evince to work with the libgrip changes in the other merge request.

To post a comment you must log in.
4213. By Cody Russell

Set some #define constants for velocity and angle.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'configure.ac'
2--- configure.ac 2010-11-23 14:39:57 +0000
3+++ configure.ac 2010-12-10 22:15:28 +0000
4@@ -154,6 +154,8 @@
5 GNOME_ICON_THEME_REQUIRED=2.17.1
6 LIBXML_REQUIRED=2.5.0
7
8+GRIP_REQUIRED=0.1
9+
10 dnl Check dependencies
11
12 # LIB_CFLAGS for helpers and generic widgets. (libdocument, cut-and-paste)
13@@ -165,7 +167,7 @@
14
15
16 PKG_CHECK_MODULES(LIBDOCUMENT, gtk+-$GTK_API_VERSION >= $GTK_REQUIRED gio-2.0 >= $GLIB_REQUIRED)
17-PKG_CHECK_MODULES(LIBVIEW, gtk+-$GTK_API_VERSION >= $GTK_REQUIRED gail$GAIL_API_VERSION >= $GTK_REQUIRED gthread-2.0 gio-2.0 >= $GLIB_REQUIRED)
18+PKG_CHECK_MODULES(LIBVIEW, libgrip-0.1 >= $GRIP_REQUIRED gtk+-$GTK_API_VERSION >= $GTK_REQUIRED gail$GAIL_API_VERSION >= $GTK_REQUIRED gthread-2.0 gio-2.0 >= $GLIB_REQUIRED)
19 PKG_CHECK_MODULES(BACKEND, cairo >= $CAIRO_REQUIRED gtk+-$GTK_API_VERSION >= $GTK_REQUIRED)
20 PKG_CHECK_MODULES(FRONTEND_CORE, gtk+-$GTK_API_VERSION >= $GTK_REQUIRED gthread-2.0 gio-2.0 >= $GLIB_REQUIRED)
21
22@@ -193,7 +195,7 @@
23 ;;
24 esac
25
26-PKG_CHECK_MODULES([SHELL_CORE],[libxml-2.0 >= $LIBXML_REQUIRED libgrip-0.1 >= 0.1 gtk+-$GTK_API_VERSION >= $GTK_REQUIRED gio-2.0 >= $GLIB_REQUIRED gthread-2.0 $SHELL_PLATFORM_PKGS])
27+PKG_CHECK_MODULES([SHELL_CORE],[libxml-2.0 >= $LIBXML_REQUIRED libgrip-0.1 >= $GRIP_REQUIRED gtk+-$GTK_API_VERSION >= $GTK_REQUIRED gio-2.0 >= $GLIB_REQUIRED gthread-2.0 $SHELL_PLATFORM_PKGS])
28
29 # *********
30 # SM client
31
32=== modified file 'libview/ev-view-private.h'
33--- libview/ev-view-private.h 2010-09-15 15:05:36 +0000
34+++ libview/ev-view-private.h 2010-12-10 22:15:28 +0000
35@@ -193,6 +193,14 @@
36
37 /* Accessibility */
38 gboolean a11y_enabled;
39+
40+ /* Gesture state */
41+ gboolean enable_gestures;
42+ gdouble drag_start_x;
43+ gdouble drag_start_y;
44+ gdouble pinch_start_x;
45+ gdouble pinch_start_y;
46+ gdouble pinch_start_radius;
47 };
48
49 struct _EvViewClass {
50
51=== modified file 'libview/ev-view.c'
52--- libview/ev-view.c 2010-11-30 05:18:17 +0000
53+++ libview/ev-view.c 2010-12-10 22:15:28 +0000
54@@ -28,6 +28,8 @@
55 #include <gtk/gtk.h>
56 #include <gdk/gdkkeysyms.h>
57
58+#include <libgrip/gripgesturemanager.h>
59+
60 #include "ev-mapping-list.h"
61 #include "ev-document-forms.h"
62 #include "ev-document-images.h"
63@@ -50,6 +52,11 @@
64 #define EV_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EV_TYPE_VIEW, EvViewClass))
65
66 enum {
67+ PROP_0,
68+ PROP_ENABLE_GESTURES
69+};
70+
71+enum {
72 SIGNAL_BINDING_ACTIVATED,
73 SIGNAL_HANDLE_LINK,
74 SIGNAL_EXTERNAL_LINK,
75@@ -142,6 +149,14 @@
76 static void hide_annotation_windows (EvView *view,
77 gint page);
78 /*** GtkWidget implementation ***/
79+static void ev_view_get_property (GObject *object,
80+ guint prop_id,
81+ GValue *value,
82+ GParamSpec *param_spec);
83+static void ev_view_set_property (GObject *object,
84+ guint prop_id,
85+ const GValue *value,
86+ GParamSpec *param_spec);
87 static void ev_view_size_request_continuous_dual_page (EvView *view,
88 GtkRequisition *requisition);
89 static void ev_view_size_request_continuous (EvView *view,
90@@ -279,6 +294,12 @@
91 gpointer data);
92 static void ev_view_update_primary_selection (EvView *ev_view);
93
94+/*** Gestures ***/
95+static void ev_gesture_callback (GtkWidget *widget,
96+ GripTimeType time_type,
97+ GripGestureEvent *event,
98+ gpointer user_data);
99+
100 G_DEFINE_TYPE (EvView, ev_view, GTK_TYPE_LAYOUT)
101
102 /* HeightToPage cache */
103@@ -2976,6 +2997,114 @@
104 return FALSE;
105 }
106
107+/*** Gesture implementation ***/
108+static void
109+ev_gesture_callback (GtkWidget *widget,
110+ GripTimeType time_type,
111+ GripGestureEvent *event,
112+ gpointer user_data)
113+{
114+ EvView *view = EV_VIEW (widget);
115+
116+ if (time_type == GRIP_TIME_START) {
117+ switch (event->type) {
118+ case GRIP_GESTURE_DRAG: {
119+ GripEventGestureDrag *drag = (GripEventGestureDrag *)event;
120+
121+ view->drag_start_x = drag->position_x;
122+ view->drag_start_y = drag->position_y;
123+
124+ break;
125+ }
126+
127+ case GRIP_GESTURE_PINCH: {
128+ GripEventGesturePinch *pinch = (GripEventGesturePinch *)event;
129+
130+ view->pinch_start_x = pinch->focus_x;
131+ view->pinch_start_y = pinch->focus_y;
132+ view->pinch_start_radius = pinch->radius;
133+ break;
134+ }
135+
136+ default:
137+ break;
138+ }
139+ } else if (time_type == GRIP_TIME_END) {
140+ switch (event->type) {
141+ case GRIP_GESTURE_DRAG: {
142+ GripEventGestureDrag *drag = (GripEventGestureDrag *)event;
143+
144+ if (drag->velocity_y >= 1.0 &&
145+ drag->position_y > view->drag_start_y) {
146+ ev_view_previous_page (view);
147+ } else if (drag->velocity_y <= -1.0 &&
148+ drag->position_y < view->drag_start_y) {
149+ ev_view_next_page (view);
150+ } else if (drag->velocity_x >= 1.0 &&
151+ drag->position_x > view->drag_start_x) {
152+ ev_view_previous_page (view);
153+ } else if (drag->velocity_x <= -1.0 &&
154+ drag->position_x < view->drag_start_x) {
155+ ev_view_next_page (view);
156+ }
157+
158+ break;
159+ }
160+
161+ case GRIP_GESTURE_ROTATE: {
162+ GripEventGestureRotate *rotate = (GripEventGestureRotate *)event;
163+ gint rotation = ev_document_model_get_rotation (view->model);
164+
165+ if (rotate->angle >= 1.0) {
166+ ev_document_model_set_rotation (view->model,
167+ rotation + 90);
168+ } else if (rotate->angle <= -1.0) {
169+ ev_document_model_set_rotation (view->model,
170+ rotation - 90);
171+ }
172+
173+ break;
174+ }
175+
176+ default:
177+ break;
178+ }
179+ } else {
180+ switch (event->type) {
181+ case GRIP_GESTURE_PINCH: {
182+ GripEventGesturePinch *pinch = (GripEventGesturePinch *)event;
183+ gdouble increment = pinch->radius_delta * 0.01;
184+
185+ if (increment < 0.0) increment = -increment;
186+ increment += 1.0;
187+
188+ if (pinch->radius_delta < 0.0) {
189+ ev_document_model_set_sizing_mode (view->model, EV_SIZING_FREE);
190+ ev_view_zoom_out_smooth (view, (1.0 / increment));
191+ } else if (pinch->radius_delta > 0.0) {
192+ ev_document_model_set_sizing_mode (view->model, EV_SIZING_FREE);
193+ ev_view_zoom_in_smooth (view, increment);
194+ }
195+
196+ break;
197+ }
198+
199+ case GRIP_GESTURE_DRAG: {
200+ GripEventGestureDrag *drag = (GripEventGestureDrag *)event;
201+
202+ if (drag->fingers == 1) {
203+ ev_view_drag (view,
204+ (gdouble)-drag->delta_x,
205+ (gdouble)-drag->delta_y);
206+ }
207+ }
208+
209+ default:
210+ break;
211+ }
212+ }
213+}
214+
215 /*** GtkWidget implementation ***/
216
217 static void
218@@ -4622,6 +4751,80 @@
219 }
220
221 static void
222+ev_view_get_property (GObject *object,
223+ guint prop_id,
224+ GValue *value,
225+ GParamSpec *param_spec)
226+{
227+ EvView *view = EV_VIEW (object);
228+
229+ switch (prop_id) {
230+ case PROP_ENABLE_GESTURES:
231+ g_value_set_boolean (value, view->enable_gestures);
232+ break;
233+
234+ default:
235+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
236+ prop_id,
237+ param_spec);
238+ }
239+}
240+
241+static void
242+ev_view_set_property (GObject *object,
243+ guint prop_id,
244+ const GValue *value,
245+ GParamSpec *param_spec)
246+{
247+ EvView *view = EV_VIEW (object);
248+ GtkWidget *widget;
249+ GripGestureManager *manager;
250+
251+ switch (prop_id) {
252+ case PROP_ENABLE_GESTURES:
253+ view->enable_gestures = g_value_get_boolean (value);
254+
255+ widget = GTK_WIDGET (view);
256+ manager = grip_gesture_manager_get ();
257+
258+ grip_gesture_manager_register_window (manager,
259+ widget,
260+ GRIP_GESTURE_PINCH,
261+ 2,
262+ ev_gesture_callback,
263+ NULL, NULL);
264+
265+ grip_gesture_manager_register_window (manager,
266+ widget,
267+ GRIP_GESTURE_DRAG,
268+ 2,
269+ ev_gesture_callback,
270+ NULL, NULL);
271+
272+ grip_gesture_manager_register_window (manager,
273+ widget,
274+ GRIP_GESTURE_DRAG,
275+ 1,
276+ ev_gesture_callback,
277+ NULL, NULL);
278+
279+ grip_gesture_manager_register_window (manager,
280+ widget,
281+ GRIP_GESTURE_ROTATE,
282+ 2,
283+ ev_gesture_callback,
284+ NULL, NULL);
285+
286+ break;
287+
288+ default:
289+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
290+ prop_id,
291+ param_spec);
292+ }
293+}
294+
295+static void
296 ev_view_class_init (EvViewClass *class)
297 {
298 GObjectClass *object_class = G_OBJECT_CLASS (class);
299@@ -4631,6 +4834,8 @@
300 GtkBindingSet *binding_set;
301
302 object_class->finalize = ev_view_finalize;
303+ object_class->get_property = ev_view_get_property;
304+ object_class->set_property = ev_view_set_property;
305
306 widget_class->expose_event = ev_view_expose_event;
307 widget_class->button_press_event = ev_view_button_press_event;
308@@ -4724,6 +4929,15 @@
309 G_TYPE_NONE, 0,
310 G_TYPE_NONE);
311
312+ g_object_class_install_property (object_class,
313+ PROP_ENABLE_GESTURES,
314+ g_param_spec_boolean ("enable-gestures",
315+ "Enable gestures",
316+ "Whether to enable gestures",
317+ FALSE,
318+ G_PARAM_WRITABLE |
319+ G_PARAM_CONSTRUCT_ONLY));
320+
321 binding_set = gtk_binding_set_by_class (class);
322
323 add_scroll_binding_keypad (binding_set, GDK_Left, 0, GTK_SCROLL_STEP_BACKWARD, TRUE);
324@@ -4775,6 +4989,7 @@
325 gtk_layout_set_vadjustment (GTK_LAYOUT (view), NULL);
326 }
327
328+
329 /*** Callbacks ***/
330
331 static void
332@@ -4911,11 +5126,13 @@
333 }
334
335 GtkWidget*
336-ev_view_new (void)
337+ev_view_new (gboolean enable_gestures)
338 {
339 GtkWidget *view;
340
341- view = g_object_new (EV_TYPE_VIEW, NULL);
342+ view = g_object_new (EV_TYPE_VIEW,
343+ "enable-gestures", enable_gestures,
344+ NULL);
345
346 return view;
347 }
348
349=== modified file 'libview/ev-view.h'
350--- libview/ev-view.h 2010-11-30 05:18:17 +0000
351+++ libview/ev-view.h 2010-12-10 22:15:28 +0000
352@@ -46,7 +46,7 @@
353
354 GType ev_view_get_type (void) G_GNUC_CONST;
355
356-GtkWidget* ev_view_new (void);
357+GtkWidget* ev_view_new (gboolean enable_gestures);
358 void ev_view_set_model (EvView *view,
359 EvDocumentModel *model);
360 void ev_view_set_loading (EvView *view,
361
362=== modified file 'previewer/ev-previewer-window.c'
363--- previewer/ev-previewer-window.c 2010-07-26 13:34:18 +0000
364+++ previewer/ev-previewer-window.c 2010-12-10 22:15:28 +0000
365@@ -607,7 +607,7 @@
366 GTK_POLICY_AUTOMATIC,
367 GTK_POLICY_AUTOMATIC);
368
369- window->view = EV_VIEW (ev_view_new ());
370+ window->view = EV_VIEW (ev_view_new (FALSE));
371 g_signal_connect_object (window->view, "focus_in_event",
372 G_CALLBACK (view_focus_changed),
373 window, 0);
374
375=== modified file 'shell/ev-window.c'
376--- shell/ev-window.c 2010-12-07 08:43:18 +0000
377+++ shell/ev-window.c 2010-12-10 22:15:28 +0000
378@@ -41,8 +41,6 @@
379 #include <gio/gio.h>
380 #include <gtk/gtk.h>
381
382-#include <libgrip/gripgesturemanager.h>
383-
384 #include "egg-editable-toolbar.h"
385 #include "egg-toolbar-editor.h"
386 #include "egg-toolbars-model.h"
387@@ -218,13 +216,6 @@
388 guint dbus_object_id;
389 gchar *dbus_object_path;
390 #endif
391-
392- gdouble drag_start_x;
393- gdouble drag_start_y;
394-
395- gdouble pinch_start_x;
396- gdouble pinch_start_y;
397- gdouble pinch_start_radius;
398 };
399
400 #define EV_WINDOW_GET_PRIVATE(object) \
401@@ -5433,151 +5424,6 @@
402 }
403
404 static void
405-ev_gesture_callback (GtkWindow *window,
406- GripTimeType time_type,
407- GripGestureEvent *event,
408- gpointer user_data)
409-{
410- EvWindowPrivate *priv = EV_WINDOW (window)->priv;
411-
412- if (time_type == GRIP_TIME_START) {
413- switch (event->type) {
414- case GRIP_GESTURE_DRAG: {
415- GripEventGestureDrag *drag = (GripEventGestureDrag *)event;
416-
417- priv->drag_start_x = drag->position_x;
418- priv->drag_start_y = drag->position_y;
419-
420- break;
421- }
422-
423- case GRIP_GESTURE_PINCH: {
424- GripEventGesturePinch *pinch = (GripEventGesturePinch *)event;
425-
426- priv->pinch_start_x = pinch->focus_x;
427- priv->pinch_start_y = pinch->focus_y;
428- priv->pinch_start_radius = pinch->radius;
429- break;
430- }
431-
432- default:
433- break;
434- }
435- } else if (time_type == GRIP_TIME_END) {
436- switch (event->type) {
437- case GRIP_GESTURE_DRAG: {
438- GripEventGestureDrag *drag = (GripEventGestureDrag *)event;
439-
440- if (drag->velocity_y >= 1.0 &&
441- drag->position_y > priv->drag_start_y) {
442- ev_window_cmd_go_previous_page (NULL, EV_WINDOW (window));
443- } else if (drag->velocity_y <= -1.0 &&
444- drag->position_y < priv->drag_start_y) {
445- ev_window_cmd_go_next_page (NULL, EV_WINDOW (window));
446- } else if (drag->velocity_x >= 1.0 &&
447- drag->position_x > priv->drag_start_x) {
448- ev_window_cmd_go_previous_page (NULL, EV_WINDOW (window));
449- } else if (drag->velocity_x <= -1.0 &&
450- drag->position_x < priv->drag_start_x) {
451- ev_window_cmd_go_next_page (NULL, EV_WINDOW (window));
452- }
453-
454- break;
455- }
456-
457- case GRIP_GESTURE_ROTATE: {
458- GripEventGestureRotate *rotate = (GripEventGestureRotate *)event;
459-
460- if (rotate->angle >= 1.0) {
461- ev_window_cmd_edit_rotate_right (NULL, EV_WINDOW (window));
462- } else if (rotate->angle <= -1.0) {
463- ev_window_cmd_edit_rotate_left (NULL, EV_WINDOW (window));
464- }
465-
466- break;
467- }
468-
469- default:
470- break;
471- }
472- } else {
473- switch (event->type) {
474- case GRIP_GESTURE_PINCH: {
475- GripEventGesturePinch *pinch = (GripEventGesturePinch *)event;
476- gdouble increment = pinch->radius_delta * 0.01;
477-
478- if (increment < 0.0) increment = -increment;
479- increment += 1.0;
480-
481- if (pinch->radius_delta < 0.0) {
482- ev_document_model_set_sizing_mode (priv->model, EV_SIZING_FREE);
483- ev_view_zoom_out_smooth (EV_VIEW (priv->view), (1.0 / increment));
484- } else if (pinch->radius_delta > 0.0) {
485- ev_document_model_set_sizing_mode (priv->model, EV_SIZING_FREE);
486- ev_view_zoom_in_smooth (EV_VIEW (priv->view), increment);
487- }
488-
489- break;
490- }
491-
492- case GRIP_GESTURE_DRAG: {
493- GripEventGestureDrag *drag = (GripEventGestureDrag *)event;
494-
495- if (drag->fingers == 1) {
496- ev_view_drag (EV_VIEW (priv->view),
497- (gdouble)-drag->delta_x,
498- (gdouble)-drag->delta_y);
499- }
500- }
501-
502- default:
503- break;
504- }
505- }
506-}
507-
508-static void
509-on_window_mapped (GtkWidget *widget)
510-{
511- GtkWindow *window;
512- GripGestureManager *manager;
513-
514- window = GTK_WINDOW (widget);
515-
516- if (ev_application_get_gestures_enabled (EV_APP)) {
517- manager = grip_gesture_manager_get ();
518-
519- grip_gesture_manager_register_window (manager,
520- window,
521- GRIP_GESTURE_PINCH,
522- 2,
523- ev_gesture_callback,
524- NULL, NULL);
525-
526- grip_gesture_manager_register_window (manager,
527- window,
528- GRIP_GESTURE_DRAG,
529- 2,
530- ev_gesture_callback,
531- NULL, NULL);
532-
533- grip_gesture_manager_register_window (manager,
534- window,
535- GRIP_GESTURE_DRAG,
536- 1,
537- ev_gesture_callback,
538- NULL, NULL);
539-
540- grip_gesture_manager_register_window (manager,
541- window,
542- GRIP_GESTURE_ROTATE,
543- 2,
544- ev_gesture_callback,
545- NULL, NULL);
546- }
547-}
548-
549-static void
550 ev_window_class_init (EvWindowClass *ev_window_class)
551 {
552 GObjectClass *g_object_class = G_OBJECT_CLASS (ev_window_class);
553@@ -6914,9 +6760,6 @@
554 g_signal_connect (ev_window, "window_state_event",
555 G_CALLBACK (window_state_event_cb), NULL);
556
557- g_signal_connect (ev_window, "show",
558- G_CALLBACK (on_window_mapped), NULL);
559-
560 ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window);
561
562 #ifdef ENABLE_DBUS
563@@ -7142,7 +6985,7 @@
564 ev_window->priv->view_box);
565 gtk_widget_show (ev_window->priv->view_box);
566
567- ev_window->priv->view = ev_view_new ();
568+ ev_window->priv->view = ev_view_new (ev_application_get_gestures_enabled (EV_APP));
569 ev_view_set_page_cache_size (EV_VIEW (ev_window->priv->view), PAGE_CACHE_SIZE);
570 ev_view_set_model (EV_VIEW (ev_window->priv->view), ev_window->priv->model);
571

Subscribers

People subscribed via source and target branches