summarylogtreecommitdiffstats
path: root/autohide-evbox.patch
blob: 3df7d53c131b0e5f7c11e007991320fe4cb60513 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
--- src/wingpanel/src/PanelWindow.vala	2017-06-01 02:18:32.090889031 +0900
+++ src/wingpanel/src/PanelWindow.vala.patched	2017-06-01 02:11:40.814767918 +0900
@@ -22,6 +22,10 @@
 
     private Widgets.Panel panel;
 
+    private Gtk.EventBox box;
+
+    uint timeout;
+
     private int monitor_number;
 
     private int monitor_width;
@@ -61,6 +61,9 @@
         update_visual ();
 
         popover_manager = new Services.PopoverManager (this);
+ 
+        box = new Gtk.EventBox();
+        box.add_events (Gdk.EventMask.ENTER_NOTIFY_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK);
 
         panel = new Widgets.Panel (popover_manager);
         panel.realize.connect (on_realize);
@@ -77,17 +80,35 @@
         app.add_action (cycle_back_action);
         app.add_accelerator ("<Control><Shift>Tab", "app.cycle-back", null);
 
-        this.add (panel);
+        box.add(panel);
+        box.enter_notify_event.connect (reactivate);
+        box.leave_notify_event.connect (on_idle);
+
+        this.add (box);
     }
 
     private bool animation_step () {
         if (panel_displacement <= panel_height * (-1)) {
+            timeout = 0;
             return false;
         }
 
         panel_displacement--;
 
-        update_panel_dimensions ();
+        animate_panel ();
+
+        return true;
+    }
+
+    private bool animation_unstep () {
+        if (panel_displacement >= -1) {
+            timeout = 0;
+            return false;
+        }
+
+        panel_displacement++;
+
+        animate_panel ();
 
         return true;
     }
@@ -85,7 +110,27 @@
 
         //Services.BackgroundManager.get_default ().initialize (this.monitor_number, panel_height);
 
-        Timeout.add (300 / panel_height, animation_step);
+        timeout = Timeout.add (100 / panel_height, animation_step);
+    }
+
+    private bool on_idle () {
+        if (timeout > 0) {
+            Source.remove (timeout);
+        }
+
+        timeout = Timeout.add (100 / panel_height, animation_unstep);
+
+        return true;
+    }
+
+    private bool reactivate () {
+        if (timeout > 0) {
+            Source.remove (timeout);
+        }
+
+        timeout = Timeout.add (100 / panel_height, animation_step);
+
+        return true;
     }
 
     private void update_panel_dimensions () {
@@ -108,6 +153,24 @@
         update_struts ();
     }
 
+    private void animate_panel () {
+        panel_height = panel.get_allocated_height ();
+
+        monitor_number = screen.get_primary_monitor ();
+        Gdk.Rectangle monitor_dimensions;
+        this.screen.get_monitor_geometry (monitor_number, out monitor_dimensions);
+
+        monitor_width = monitor_dimensions.width;
+        monitor_height = monitor_dimensions.height;
+
+        this.set_size_request (monitor_width, (popover_manager.current_indicator != null ? monitor_height : -1));
+
+        monitor_x = monitor_dimensions.x;
+        monitor_y = monitor_dimensions.y;
+
+        this.move (monitor_x, monitor_y - (panel_height + panel_displacement));
+    }
+
     private void update_visual () {
         var visual = this.screen.get_rgba_visual ();