diff --git a/wingpanel/schemas/org.pantheon.desktop.wingpanel.gschema.xml b/wingpanel-qq/schemas/org.pantheon.desktop.wingpanel.gschema.xml index c81abd5..890e277 100644 --- a/wingpanel/schemas/org.pantheon.desktop.wingpanel.gschema.xml +++ b/wingpanel-qq/schemas/org.pantheon.desktop.wingpanel.gschema.xml @@ -6,5 +6,15 @@ Sets if the panel uses transparency. Disable this to provide higher contrasts and make indicators better readable. + + + + + + + 'Disabled' + Sets if and how the panel will autohide. + Enable this to increase available desktop area and reduce clutter. + diff --git a/wingpanel/src/PanelWindow.vala b/wingpanel-qq/src/PanelWindow.vala index c48b5ea..81ec2f2 100644 --- a/wingpanel/src/PanelWindow.vala +++ b/wingpanel-qq/src/PanelWindow.vala @@ -21,6 +21,9 @@ public class Wingpanel.PanelWindow : Gtk.Window { public Services.PopoverManager popover_manager; private Widgets.Panel panel; + + uint timeout; + private int monitor_number; private int monitor_width; private int monitor_height; @@ -30,6 +33,9 @@ public class Wingpanel.PanelWindow : Gtk.Window { private bool expanded = false; private int panel_displacement; private uint shrink_timeout = 0; + private bool hiding = false; + private bool restrut = true; + private string autohide = Services.PanelSettings.get_default ().autohide; public PanelWindow (Gtk.Application application) { Object ( @@ -52,6 +58,9 @@ public class Wingpanel.PanelWindow : Gtk.Window { this.screen.size_changed.connect (update_panel_dimensions); this.screen.monitors_changed.connect (update_panel_dimensions); this.screen_changed.connect (update_visual); + this.enter_notify_event.connect (show_panel); + this.motion_notify_event.connect (show_panel); + this.leave_notify_event.connect (hide_panel); update_visual (); @@ -71,17 +79,33 @@ public class Wingpanel.PanelWindow : Gtk.Window { application.add_accelerator ("Tab", "app.cycle", null); application.add_accelerator ("Tab", "app.cycle-back", null); + Services.PanelSettings.get_default ().notify["autohide"].connect (() => { + autohide = Services.PanelSettings.get_default ().autohide; + update_autohide_mode (); + }); + add (panel); } private bool animation_step () { - if (panel_displacement <= panel_height * (-1)) { - return false; + if (hiding != true) { + if (panel_displacement <= panel_height * (-1)) { + timeout = 0; + return false; + } + panel_displacement--; + } else { + if (panel_displacement >= -1 || popover_manager.current_indicator != null) { + timeout = 0; + return false; + } + panel_displacement++; } - panel_displacement--; - - update_panel_dimensions (); + if (restrut == true) { + update_panel_dimensions (); + } + animate_panel (); return true; } @@ -91,7 +115,65 @@ public class Wingpanel.PanelWindow : Gtk.Window { Services.BackgroundManager.initialize (this.monitor_number, panel_height); - Timeout.add (300 / panel_height, animation_step); + if (autohide == "Disabled" || autohide == "Dodge") { + hiding = false; + restrut = true; + timeout = Timeout.add (300 / panel_height, animation_step); + } else { + panel_displacement--; + animate_panel (); + } + } + + private bool hide_panel () { + if (autohide != "Disabled") { + hiding = true; + if (timeout > 0) { + Source.remove (timeout); + } + if (autohide == "Dodge") { + restrut = true; + timeout = Timeout.add (300 / panel_height, animation_step); + } else if (autohide == "Autohide") { + restrut = true; + timeout = Timeout.add (100 / panel_height, animation_step); + } else if (autohide == "Float") { + restrut = false; + timeout = Timeout.add (100 / panel_height, animation_step); + } + } + return true; + } + + private bool show_panel () { + if (autohide != "Disabled") { + hiding = false; + if (timeout > 0) { + Source.remove (timeout); + } + if (autohide == "Dodge") { + restrut = true; + timeout = Timeout.add (300 / panel_height, animation_step); + } else if (autohide == "Autohide") { + restrut = true; + timeout = Timeout.add (100 / panel_height, animation_step); + } else if (autohide == "Float") { + restrut = false; + timeout = Timeout.add (100 / panel_height, animation_step); + } + } + return true; + } + + private void update_autohide_mode () { + restrut = true; + if (autohide == "Disabled" || autohide == "Dodge") { + hiding = false; + timeout = Timeout.add (300 / panel_height, animation_step); + } else { + hiding = true; + timeout = Timeout.add (100 / panel_height, animation_step); + } } private void update_panel_dimensions () { @@ -114,6 +196,24 @@ public class Wingpanel.PanelWindow : Gtk.Window { 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 (); diff --git a/wingpanel/src/Services/Settings.vala b/wingpanel-qq/src/Services/Settings.vala index 3bcd0a7..eeecbb8 100644 --- a/wingpanel/src/Services/Settings.vala +++ b/wingpanel-qq/src/Services/Settings.vala @@ -23,6 +23,8 @@ namespace Wingpanel.Services { public bool use_transparency { get; set; } + public string autohide { get; set; } + public PanelSettings () { base ("org.pantheon.desktop.wingpanel"); }