55 * SPDX-License-Identifier: GPL-3.0-or-later
66 */
77
8- public class Gala.Zoom : Object {
8+ public class Gala.Zoom : Object , GestureTarget {
99 private const float MIN_ZOOM = 1.0f ;
1010 private const float MAX_ZOOM = 10.0f ;
1111 private const float SHORTCUT_DELTA = 0.5f ;
@@ -14,11 +14,15 @@ public class Gala.Zoom : Object {
1414
1515 public WindowManager wm { get ; construct; }
1616
17+ public Clutter . Actor ? actor { get { return wm. ui_group; } }
18+
1719 private uint mouse_poll_timer = 0 ;
1820 private float current_zoom = MIN_ZOOM ;
1921 private ulong wins_handler_id = 0UL ;
2022
21- private GestureTracker gesture_tracker;
23+ private GestureController gesture_controller;
24+ private double current_commit = 0 ;
25+
2226 private GLib . Settings behavior_settings;
2327
2428 public Zoom (WindowManager wm ) {
@@ -30,10 +34,10 @@ public class Gala.Zoom : Object {
3034 display. add_keybinding (" zoom-in" , schema, Meta . KeyBindingFlags . NONE , (Meta . KeyHandlerFunc ) zoom_in);
3135 display. add_keybinding (" zoom-out" , schema, Meta . KeyBindingFlags . NONE , (Meta . KeyHandlerFunc ) zoom_out);
3236
33- gesture_tracker = new GestureTracker ( ANIMATION_DURATION , ANIMATION_DURATION );
34- gesture_tracker . enable_touchpad ();
35- gesture_tracker . on_gesture_detected . connect (on_gesture_detected) ;
36- gesture_tracker . on_gesture_handled . connect (on_gesture_handled );
37+ gesture_controller = new GestureController ( ZOOM , this ) {
38+ snap = false
39+ } ;
40+ gesture_controller . enable_touchpad ( );
3741
3842 behavior_settings = new GLib .Settings (" io.elementary.desktop.wm.behavior" );
3943
@@ -60,29 +64,13 @@ public class Gala.Zoom : Object {
6064 [CCode (instance_pos = -1 )]
6165 private void zoom_in (Meta .Display display , Meta .Window ? window ,
6266 Clutter .KeyEvent event , Meta .KeyBinding binding ) {
63- zoom (SHORTCUT_DELTA , true , AnimationsSettings . get_enable_animations () );
67+ zoom (SHORTCUT_DELTA , true );
6468 }
6569
6670 [CCode (instance_pos = -1 )]
6771 private void zoom_out (Meta .Display display , Meta .Window ? window ,
6872 Clutter .KeyEvent event , Meta .KeyBinding binding ) {
69- zoom (- SHORTCUT_DELTA , true , AnimationsSettings . get_enable_animations ());
70- }
71-
72- private bool on_gesture_detected (Gesture gesture ) {
73- if (gesture. type != Clutter . EventType . TOUCHPAD_PINCH ||
74- (gesture. direction != GestureDirection . IN && gesture. direction != GestureDirection . OUT )
75- ) {
76- return false ;
77- }
78-
79- if ((gesture. fingers == 3 && GestureSettings . get_string (" three-finger-pinch" ) == " zoom" ) ||
80- (gesture. fingers == 4 && GestureSettings . get_string (" four-finger-pinch" ) == " zoom" )
81- ) {
82- return true ;
83- }
84-
85- return false ;
73+ zoom (- SHORTCUT_DELTA , true );
8674 }
8775
8876 private bool handle_super_scroll (uint32 timestamp , double dx , double dy ) {
@@ -93,38 +81,51 @@ public class Gala.Zoom : Object {
9381 var d = dx. abs () > dy. abs () ? dx : dy;
9482
9583 if (d > 0 ) {
96- zoom (SHORTCUT_DELTA , true , AnimationsSettings . get_enable_animations () );
84+ zoom (SHORTCUT_DELTA , true );
9785 } else if (d < 0 ) {
98- zoom (- SHORTCUT_DELTA , true , AnimationsSettings . get_enable_animations () );
86+ zoom (- SHORTCUT_DELTA , true );
9987 }
10088
10189 return Clutter . EVENT_STOP ;
10290 }
10391
104- private double on_gesture_handled (Gesture gesture , uint32 timestamp ) {
105- var initial_zoom = current_zoom;
106- var target_zoom = (gesture. direction == GestureDirection . IN )
107- ? initial_zoom - MAX_ZOOM
108- : initial_zoom + MAX_ZOOM ;
109-
110- GestureTracker . OnUpdate on_animation_update = (percentage) = > {
111- var zoom_level = GestureTracker . animation_value (initial_zoom, target_zoom, percentage);
112- var delta = zoom_level - current_zoom;
113-
114- if (! AnimationsSettings . get_enable_animations ()) {
115- if (delta. abs () >= SHORTCUT_DELTA ) {
116- delta = (delta > 0 ) ? SHORTCUT_DELTA : - SHORTCUT_DELTA ;
117- } else {
118- delta = 0 ;
119- }
92+ private void zoom (float delta , bool play_sound ) {
93+ // Nothing to do if zooming out of our bounds is requested
94+ if ((current_zoom <= MIN_ZOOM && delta < 0 ) || (current_zoom >= MAX_ZOOM && delta >= 0 )) {
95+ if (play_sound) {
96+ InternalUtils . bell_notify (wm. get_display ());
12097 }
98+ return ;
99+ }
121100
122- zoom (delta, false , false );
123- };
101+ gesture_controller. goto (current_commit + (delta / 10 ));
102+ }
103+
104+ public override void propagate (UpdateType update_type , GestureAction action , double progress ) {
105+ switch (update_type) {
106+ case COMMIT :
107+ current_commit = progress;
108+ break ;
109+
110+ case UPDATE :
111+ var target_zoom = (float ) progress * 10 + 1 ;
112+ if (! AnimationsSettings . get_enable_animations ()) {
113+ var delta = target_zoom - current_zoom;
114+ if (delta. abs () >= SHORTCUT_DELTA - float . EPSILON ) {
115+ target_zoom = current_zoom + ((delta > 0 ) ? SHORTCUT_DELTA : - SHORTCUT_DELTA );
116+ } else {
117+ return ;
118+ }
119+ }
124120
125- gesture_tracker. connect_handlers (null , (owned ) on_animation_update, null );
121+ current_zoom = target_zoom;
122+ update_ui ();
126123
127- return 0 ;
124+ break ;
125+
126+ default:
127+ break ;
128+ }
128129 }
129130
130131 private inline Graphene .Point compute_new_pivot_point () {
@@ -139,15 +140,7 @@ public class Gala.Zoom : Object {
139140 return new_pivot;
140141 }
141142
142- private void zoom (float delta , bool play_sound , bool animate ) {
143- // Nothing to do if zooming out of our bounds is requested
144- if ((current_zoom <= MIN_ZOOM && delta < 0 ) || (current_zoom >= MAX_ZOOM && delta >= 0 )) {
145- if (play_sound) {
146- InternalUtils . bell_notify (wm. get_display ());
147- }
148- return ;
149- }
150-
143+ private void update_ui () {
151144 unowned var wins = wm. ui_group;
152145 // Add timer to poll current mouse position to reposition window-group
153146 // to show requested zoomed area
@@ -169,9 +162,6 @@ public class Gala.Zoom : Object {
169162 });
170163 }
171164
172- current_zoom + = delta;
173- var animation_duration = animate ? ANIMATION_DURATION : 0 ;
174-
175165 if (wins_handler_id > 0 ) {
176166 wins. disconnect (wins_handler_id);
177167 wins_handler_id = 0 ;
@@ -185,29 +175,12 @@ public class Gala.Zoom : Object {
185175 mouse_poll_timer = 0 ;
186176 }
187177
188- wins. save_easing_state ();
189- wins. set_easing_mode (Clutter . AnimationMode . EASE_OUT_CUBIC );
190- wins. set_easing_duration (animation_duration);
191178 wins. set_scale (MIN_ZOOM , MIN_ZOOM );
192- wins. restore_easing_state ();
193-
194- if (animate) {
195- wins_handler_id = wins. transitions_completed. connect (() = > {
196- wins. disconnect (wins_handler_id);
197- wins_handler_id = 0 ;
198- wins. set_pivot_point (0.0f , 0.0f );
199- });
200- } else {
201- wins. set_pivot_point (0.0f , 0.0f );
202- }
179+ wins. set_pivot_point (0.0f , 0.0f );
203180
204181 return ;
205182 }
206183
207- wins. save_easing_state ();
208- wins. set_easing_mode (Clutter . AnimationMode . EASE_OUT_CUBIC );
209- wins. set_easing_duration (animation_duration);
210184 wins. set_scale (current_zoom, current_zoom);
211- wins. restore_easing_state ();
212185 }
213186}
0 commit comments