--- src/wingpanel/schemas/org.pantheon.desktop.wingpanel.gschema.xml 2017-12-26 14:53:03.354809958 +0900
+++ src/wingpanel/schemas/org.pantheon.desktop.wingpanel.gschema.xml.new 2018-01-21 23:41:18.703206040 +0900
@@ -6,5 +6,10 @@
Sets if the panel uses transparency.
Disable this to provide higher contrasts and make indicators better readable.
+
+ false
+ Sets if the panel will autohide.
+ Enable this to increase available desktop area and reduce clutter.
+
--- src/wingpanel/src/Services/Settings.vala 2017-12-26 14:53:03.354809958 +0900
+++ src/wingpanel/src/Services/Settings.vala.new 2018-01-21 23:46:25.919860486 +0900
@@ -23,6 +23,8 @@
public bool use_transparency { get; set; }
+ public bool autohide { get; set; }
+
public PanelSettings () {
base ("org.pantheon.desktop.wingpanel");
}
--- 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,4 +22,9 @@
private Widgets.Panel panel;
+
+ private Gtk.EventBox box;
+
+ uint timeout;
+
private int monitor_number;
private int monitor_width;
@@ -35,6 +35,7 @@
private bool expanded = false;
private int panel_displacement;
private uint shrink_timeout = 0;
+ private bool autohide = Services.PanelSettings.get_default ().autohide;
public PanelWindow (Gtk.Application application) {
Object (
@@ -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);
@@ -80,17 +83,40 @@
application.add_accelerator ("Tab", "app.cycle", null);
application.add_accelerator ("Tab", "app.cycle-back", null);
- add (panel);
+ box.add(panel);
+ if (autohide == true) {
+ box.enter_notify_event.connect (reactivate);
+ box.leave_notify_event.connect (on_idle);
+ }
+
+ add (box);
}
private bool animation_step () {
if (panel_displacement <= panel_height * (-1)) {
+ timeout = 0;
return false;
}
panel_displacement--;
+ if (autohide == false) {
- update_panel_dimensions ();
+ update_panel_dimensions ();
+ }
+ animate_panel ();
+
+ return true;
+ }
+
+ private bool animation_unstep () {
+ if (panel_displacement >= -1 || popover_manager.current_indicator != null) {
+ timeout = 0;
+ return false;
+ }
+
+ panel_displacement++;
+
+ animate_panel ();
return true;
}
@@ -85,7 +110,32 @@
Services.BackgroundManager.get_default ().initialize (this.monitor_number, panel_height);
- Timeout.add (300 / panel_height, animation_step);
+ if (autohide == false) {
+ timeout = Timeout.add (300 / panel_height, animation_step);
+ } else {
+ panel_displacement--;
+ animate_panel ();
+ }
+ }
+
+ 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 ();