@@ -18,10 +18,10 @@ public class Gala.PanelClone : Object {
1818 set {
1919 if (value == NEVER ) {
2020 hide_tracker = null ;
21- show ();
21+ show (default_gesture_tracker, false );
2222 return ;
2323 } else if (hide_tracker == null ) {
24- hide_tracker = new HideTracker (wm. get_display (), panel);
24+ hide_tracker = new HideTracker (wm. get_display (), panel, default_gesture_tracker );
2525 hide_tracker. hide. connect (hide);
2626 hide_tracker. show. connect (show);
2727 }
@@ -32,100 +32,56 @@ public class Gala.PanelClone : Object {
3232
3333 public bool panel_hidden { get ; private set ; default = true ; }
3434
35- private SafeWindowClone clone;
3635 private Meta . WindowActor actor;
3736
37+ private GestureTracker default_gesture_tracker;
38+ private GestureTracker last_gesture_tracker;
39+
3840 private HideTracker ? hide_tracker;
3941
4042 public PanelClone (WindowManager wm , PanelWindow panel ) {
4143 Object (wm: wm, panel: panel);
4244 }
4345
4446 construct {
45- clone = new SafeWindowClone (panel. window, true );
46- wm. ui_group. add_child (clone);
47+ last_gesture_tracker = default_gesture_tracker = new GestureTracker (ANIMATION_DURATION , ANIMATION_DURATION );
4748
4849 actor = (Meta . WindowActor ) panel. window. get_compositor_private ();
49- // WindowActor position and Window position aren't necessarily the same.
50- // The clone needs the actor position
51- actor. notify[" x" ]. connect (update_clone_position);
52- actor. notify[" y" ]. connect (update_clone_position);
53- // Actor visibility might be changed by something else e.g. workspace switch
54- // but we want to keep it in sync with us
55- actor. notify[" visible" ]. connect (update_visible);
5650
5751 notify[" panel-hidden" ]. connect (() = > {
58- update_visible ();
5952 // When hidden changes schedule an update to make sure it's actually
6053 // correct since things might have changed during the animation
6154 if (hide_tracker != null ) {
6255 hide_tracker. schedule_update ();
6356 }
6457 });
6558
66- // Make sure the actor is visible once it's focused FIXME: better event not only focused
67- // https://github.com/elementary/gala/issues/2080
68- panel. window. focused. connect (update_visible);
69-
70- update_visible ();
71- update_clone_position ();
72-
7359 Idle . add_once (() = > {
7460 if (hide_mode == NEVER ) {
75- show ();
61+ show (default_gesture_tracker, false );
7662 } else {
7763 hide_tracker. schedule_update ();
7864 }
7965 });
8066 }
8167
82- private void update_visible () {
83- actor. visible = ! panel_hidden;
84-
85- if (actor. visible && ! wm. get_display (). get_monitor_in_fullscreen (panel. window. get_monitor ())) {
86- // The actor has just been revealed, make sure it's at the top
87- // https://github.com/elementary/gala/issues/2080
88- actor. get_parent (). set_child_above_sibling (actor, null );
89- }
90- }
91-
92- private void update_clone_position () {
93- clone. set_position (calculate_clone_x (panel_hidden), calculate_clone_y (panel_hidden));
94- }
95-
96- private float calculate_clone_x (bool hidden ) {
97- switch (panel. anchor) {
98- case TOP :
99- case BOTTOM :
100- return actor. x;
101- default:
102- return 0 ;
103- }
104- }
105-
106- private float calculate_clone_y (bool hidden ) {
68+ private float calculate_y (bool hidden ) {
10769 switch (panel. anchor) {
10870 case TOP :
109- return hidden ? actor . y - actor. height : actor . y ;
71+ return hidden ? - actor. height : 0 ;
11072 case BOTTOM :
111- return hidden ? actor. y + actor . height : actor . y ;
73+ return hidden ? actor. height : 0 ;
11274 default:
11375 return 0 ;
11476 }
11577 }
11678
117- private int get_animation_duration () {
118- var fullscreen = wm. get_display (). get_monitor_in_fullscreen (panel. window. get_monitor ());
119- var should_animate = AnimationsSettings . get_enable_animations () && ! wm. workspace_view. is_opened () && ! fullscreen;
120- return should_animate ? ANIMATION_DURATION : 0 ;
121- }
122-
123- private void hide () {
124- if (panel_hidden) {
79+ private void hide (GestureTracker gesture_tracker , bool with_gesture ) {
80+ if (panel_hidden || last_gesture_tracker. recognizing) {
12581 return ;
12682 }
12783
128- panel_hidden = true ;
84+ last_gesture_tracker = gesture_tracker ;
12985
13086 if (! Meta . Util . is_wayland_compositor ()) {
13187 Utils . x11_set_window_pass_through (panel. window);
@@ -136,39 +92,24 @@ public class Gala.PanelClone : Object {
13692 return ;
13793 }
13894
139- clone . visible = true ;
95+ new GesturePropertyTransition (actor, gesture_tracker, " translation-y " , null , calculate_y ( true )) . start (with_gesture) ;
14096
141- clone. save_easing_state ();
142- clone. set_easing_mode (Clutter . AnimationMode . EASE_OUT_QUAD );
143- clone. set_easing_duration (get_animation_duration ());
144- clone. y = calculate_clone_y (true );
145- clone. restore_easing_state ();
97+ gesture_tracker. add_success_callback (with_gesture, () = > panel_hidden = true );
14698 }
14799
148- private void show () {
149- if (! panel_hidden) {
100+ private void show (GestureTracker gesture_tracker , bool with_gesture ) {
101+ if (! panel_hidden || last_gesture_tracker . recognizing ) {
150102 return ;
151103 }
152104
105+ last_gesture_tracker = gesture_tracker;
106+
153107 if (! Meta . Util . is_wayland_compositor ()) {
154108 Utils . x11_unset_window_pass_through (panel. window);
155109 }
156110
157- clone. save_easing_state ();
158- clone. set_easing_mode (Clutter . AnimationMode . EASE_OUT_QUAD );
159- clone. set_easing_duration (get_animation_duration ());
160- clone. y = calculate_clone_y (false );
161- clone. restore_easing_state ();
162-
163- unowned var y_transition = clone. get_transition (" y" );
164- if (y_transition != null ) {
165- y_transition. completed. connect (() = > {
166- clone. visible = false ;
167- panel_hidden = false ;
168- });
169- } else {
170- clone. visible = false ;
171- panel_hidden = false ;
172- }
111+ new GesturePropertyTransition (actor, gesture_tracker, " translation-y" , null , calculate_y (false )). start (with_gesture);
112+
113+ gesture_tracker. add_success_callback (with_gesture, () = > panel_hidden = false );
173114 }
174115}
0 commit comments