summarylogtreecommitdiffstats
path: root/autohide.patch
diff options
context:
space:
mode:
Diffstat (limited to 'autohide.patch')
-rw-r--r--autohide.patch219
1 files changed, 165 insertions, 54 deletions
diff --git a/autohide.patch b/autohide.patch
index 74d10a26f37d..d708dea759d5 100644
--- a/autohide.patch
+++ b/autohide.patch
@@ -2,7 +2,7 @@ diff --git a/wingpanel/schemas/io.elementary.desktop.wingpanel.gschema.xml b/win
index c81abd5..890e277 100644
--- a/wingpanel/schemas/io.elementary.desktop.wingpanel.gschema.xml
+++ b/wingpanel-qq/schemas/io.elementary.desktop.wingpanel.gschema.xml
-@@ -6,5 +6,21 @@
+@@ -6,5 +6,23 @@
<summary>Sets if the panel uses transparency.</summary>
<description>Disable this to provide higher contrasts and make indicators better readable.</description>
</key>
@@ -10,6 +10,8 @@ index c81abd5..890e277 100644
+ <choices>
+ <choice value='Autohide'/>
+ <choice value='Float'/>
++ <choice value='Dodge'/>
++ <choice value='Dodge-Float'/>
+ <choice value='Disabled'/>
+ </choices>
+ <default>'Disabled'</default>
@@ -38,21 +40,23 @@ index c48b5ea..81ec2f2 100644
private int monitor_number;
private int monitor_width;
private int monitor_height;
-@@ -30,6 +33,10 @@ public class Wingpanel.PanelWindow : Gtk.Window {
+@@ -30,6 +33,11 @@ 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 bool strut = true;
+ private string autohide = Services.PanelSettings.get_default ().autohide;
+ private int autohide_delay = Services.PanelSettings.get_default ().delay;
++ private Wnck.Screen wnck_screen = Wnck.Screen.get_default ();
public PanelWindow (Gtk.Application application) {
Object (
-@@ -52,6 +58,9 @@ public class Wingpanel.PanelWindow : Gtk.Window {
+@@ -52,6 +58,10 @@ 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);
++ wnck_screen.active_window_changed.connect (active_window_changed);
+ this.enter_notify_event.connect (show_panel);
+ this.motion_notify_event.connect (show_panel);
+ this.leave_notify_event.connect (hide_panel);
@@ -78,24 +82,24 @@ index c48b5ea..81ec2f2 100644
private bool animation_step () {
- if (panel_displacement <= panel_height * (-1)) {
- return false;
-+ if (hiding != true) {
-+ if (panel_displacement <= panel_height * (-1)) {
++ if (hiding) {
++ if (panel_displacement >= -1 || popover_manager.current_indicator != null) {
+ timeout = 0;
-+ if (restrut == true) {
++ if (strut == true) {
+ update_panel_dimensions ();
+ }
+ return false;
+ }
-+ panel_displacement--;
++ panel_displacement++;
+ } else {
-+ if (panel_displacement >= -1 || popover_manager.current_indicator != null) {
++ if (panel_displacement <= panel_height * (-1)) {
+ timeout = 0;
-+ if (restrut == true) {
++ if (strut == true) {
+ update_panel_dimensions ();
+ }
+ return false;
+ }
-+ panel_displacement++;
++ panel_displacement--;
}
- panel_displacement--;
@@ -105,69 +109,151 @@ index c48b5ea..81ec2f2 100644
return true;
}
-@@ -91,7 +115,65 @@ public class Wingpanel.PanelWindow : Gtk.Window {
+@@ -91,7 +115,147 @@ 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);
++ update_autohide_mode ();
++ }
++
++ private void active_window_changed (Wnck.Window? prev_active_window) {
++ unowned Wnck.Window? active_window = wnck_screen.get_active_window();
++ if (autohide == "Dodge" || autohide == "Dodge-Float")
++ update_visibility_active_change (active_window);
++
++ if (prev_active_window != null)
++ prev_active_window.state_changed.disconnect (active_window_state_changed);
++ if (active_window != null)
++ active_window.state_changed.connect (active_window_state_changed);
++ }
++
++ private void active_window_state_changed (Wnck.Window? window,
++ Wnck.WindowState changed_mask, Wnck.WindowState new_state) {
++ if (autohide == "Dodge" || autohide == "Dodge-Float")
++ update_visibility_active_change (window);
++ }
++
++ private void update_visibility_active_change (Wnck.Window? active_window) {
++ if (should_hide_active_change (active_window)) {
++ hide_panel ();
+ } else {
-+ panel_displacement--;
-+ animate_panel ();
++ show_panel ();
+ }
+ }
+
++ private bool should_hide_active_change (Wnck.Window? active_window) {
++ unowned Wnck.Workspace active_workspace = wnck_screen.get_active_workspace ();
++
++ return ((active_window != null) && !active_window.is_minimized () && right_type (active_window)
++ && active_window.is_visible_on_workspace (active_workspace)
++ && (active_window.get_window_type () == Wnck.WindowType.DIALOG) ?
++ would_intersect_shown_panel (active_window) :
++ (in_panel_x_range (active_window) && is_maximized_at_all (active_window)));
++ }
++
++ private bool would_intersect_shown_panel (Wnck.Window? window) {
++ Gdk.Rectangle shown_panel_rect = Gdk.Rectangle ();
++ shown_panel_rect.x = monitor_x;
++ shown_panel_rect.y = monitor_y;
++ shown_panel_rect.width = monitor_width;
++ shown_panel_rect.height = panel_height;
++
++ int xp, yp, widthp, heightp;
++ window.get_geometry (out xp, out yp, out widthp, out heightp);
++
++ Gdk.Rectangle window_rect = Gdk.Rectangle ();
++ window_rect.x = xp;
++ window_rect.width = widthp;
++ if (strut && is_maximized_at_all (window)) {
++ window_rect.y = yp - panel_height;
++ window_rect.height = heightp + panel_height;
++ } else {
++ window_rect.y = yp;
++ window_rect.height = heightp;
++ }
++
++ return window_rect.intersect (shown_panel_rect, null);
++ }
++
++ private bool in_panel_x_range (Wnck.Window? window) {
++ int xp, yp, widthp, heightp;
++ window.get_geometry (out xp, out yp, out widthp, out heightp);
++ if (xp > monitor_x)
++ return (monitor_x + monitor_width > xp);
++ else if (xp < monitor_x)
++ return (xp + widthp > monitor_x);
++ else
++ return (xp + widthp > 0 && monitor_x + monitor_width > 0);
++ }
++
++ private bool right_type (Wnck.Window? active_window) {
++ unowned Wnck.WindowType type = active_window.get_window_type ();
++ return (type == Wnck.WindowType.NORMAL || type == Wnck.WindowType.DIALOG
++ || type == Wnck.WindowType.TOOLBAR || type == Wnck.WindowType.UTILITY);
++ }
++
++ private bool is_maximized_at_all (Wnck.Window window) {
++ return (window.is_maximized_horizontally ()
++ || window.is_maximized_vertically ());
++ }
++
+ private bool hide_panel () {
-+ if (autohide != "Disabled") {
-+ hiding = true;
-+ if (timeout > 0) {
-+ Source.remove (timeout);
-+ }
-+ if (popover_manager.current_indicator == null) {
-+ Thread.usleep (autohide_delay * 1000);
-+ }
-+ if (autohide == "Autohide" || autohide == "Dodge") {
-+ restrut = true;
-+ timeout = Timeout.add (100 / panel_height, animation_step);
-+ } else if (autohide == "Float") {
-+ restrut = false;
-+ timeout = Timeout.add (100 / panel_height, animation_step);
++ if (timeout > 0) {
++ Source.remove (timeout);
++ }
++ if (autohide == "Dodge" || autohide == "Dodge-Float") {
++ if (!should_hide_active_change (wnck_screen.get_active_window())) {
++ return true;
+ }
+ }
++ if (popover_manager.current_indicator == null) {
++ Thread.usleep (autohide_delay * 1000);
++ }
++ strut = true;
++ hiding = true;
++ 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 (popover_manager.current_indicator == null) {
-+ Thread.usleep (autohide_delay * 1000);
-+ }
-+ if (autohide == "Autohide" || autohide == "Dodge") {
-+ restrut = true;
-+ timeout = Timeout.add (100 / panel_height, animation_step);
-+ } else if (autohide == "Float") {
-+ restrut = false;
-+ timeout = Timeout.add (100 / panel_height, animation_step);
-+ }
++ if (timeout > 0) {
++ Source.remove (timeout);
++ }
++ if (popover_manager.current_indicator == null) {
++ Thread.usleep (autohide_delay * 1000);
++ }
++ if (autohide == "Dodge-Float" || autohide == "Float") {
++ strut = false;
++ } else {
++ strut = true;
+ }
++ hiding = 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 (100 / panel_height, animation_step);
-+ } else {
-+ hiding = true;
-+ timeout = Timeout.add (100 / panel_height, animation_step);
++ switch (autohide) {
++ case "Disabled":
++ this.enter_notify_event.disconnect (show_panel);
++ this.motion_notify_event.disconnect (show_panel);
++ this.leave_notify_event.disconnect (hide_panel);
++ show_panel ();
++ break;
++ case "Dodge":
++ case "Dodge-Float":
++ this.enter_notify_event.connect (show_panel);
++ this.motion_notify_event.connect (show_panel);
++ this.leave_notify_event.connect (hide_panel);
++ show_panel ();
++ break;
++ default:
++ this.enter_notify_event.connect (show_panel);
++ this.motion_notify_event.connect (show_panel);
++ this.leave_notify_event.connect (hide_panel);
++ hide_panel ();
++ break;
+ }
}
@@ -212,3 +298,28 @@ index 3bcd0a7..eeecbb8 100644
public PanelSettings () {
base ("io.elementary.desktop.wingpanel");
}
+--- src/wingpanel/CMakeLists.txt~ 2018-09-17 00:14:55.430071710 +0900
++++ src/wingpanel/CMakeLists.txt 2018-09-17 00:34:08.600075830 +0900
+@@ -76,6 +76,7 @@
+ gee-0.8
+ gmodule-2.0
+ gtk+-3.0
++ libwnck-3.0
+ )
+
+ set (LIB_PKG
+@@ -84,11 +85,14 @@
+ gee-0.8
+ gmodule-2.0
+ gtk+-3.0>=3.22
++ libwnck-3.0>=3.24
+ )
+ find_package(PkgConfig)
+
+ pkg_check_modules (LIB REQUIRED ${LIB_PKG})
+
++add_definitions (-DWNCK_I_KNOW_THIS_IS_UNSTABLE)
++
+ set (GLOBAL_VALAC_OPTIONS
+ --vapidir=${CMAKE_BINARY_DIR}/lib
+ --vapidir=vapi