diff --git a/src/InternalUtils.vala b/src/InternalUtils.vala index bdb8b70be..1db0d2aa6 100644 --- a/src/InternalUtils.vala +++ b/src/InternalUtils.vala @@ -350,5 +350,11 @@ namespace Gala { Clutter.get_default_backend ().get_default_seat ().bell_notify (); #endif } + + public static bool get_x11_in_fullscreen (Meta.Display display) { + var primary_monitor = display.get_primary_monitor (); + var is_in_fullscreen = display.get_monitor_in_fullscreen (primary_monitor); + return !Meta.Util.is_wayland_compositor () && is_in_fullscreen; + } } } diff --git a/src/ShellClients/HideTracker.vala b/src/ShellClients/HideTracker.vala index f90bd538f..dcfee7448 100644 --- a/src/ShellClients/HideTracker.vala +++ b/src/ShellClients/HideTracker.vala @@ -15,9 +15,10 @@ public class Gala.HideTracker : Object { public Meta.Display display { get; construct; } public unowned PanelWindow panel { get; construct; } - public Pantheon.Desktop.HideMode hide_mode { get; set; } + private static GLib.Settings behavior_settings; + private Clutter.PanAction pan_action; private bool hovered = false; @@ -25,6 +26,7 @@ public class Gala.HideTracker : Object { private bool overlap = false; private bool focus_overlap = false; private bool focus_maximized_overlap = false; + private bool fullscreen_overlap = false; private Meta.Window current_focus_window; @@ -37,6 +39,10 @@ public class Gala.HideTracker : Object { Object (display: display, panel: panel); } + static construct { + behavior_settings = new GLib.Settings ("io.elementary.desktop.wm.behavior"); + } + construct { panel.window.unmanaging.connect_after (() => { // The timeouts hold refs on us so we stay connected to signal handlers that might @@ -145,6 +151,7 @@ public class Gala.HideTracker : Object { overlap = false; focus_overlap = false; focus_maximized_overlap = false; + fullscreen_overlap = display.get_monitor_in_fullscreen (panel.window.get_monitor ()); foreach (var window in display.get_workspace_manager ().get_active_workspace ().list_windows ()) { if (window == panel.window) { @@ -195,8 +202,8 @@ public class Gala.HideTracker : Object { toggle_display (true); break; - default: - warning ("HideTracker: unsupported hide mode."); + case NEVER: + toggle_display (fullscreen_overlap); break; } } @@ -204,7 +211,8 @@ public class Gala.HideTracker : Object { private void toggle_display (bool should_hide) { hovered = panel.window.has_pointer (); - if (should_hide && !hovered && !panel.window.has_focus ()) { + // Showing panels in fullscreen is broken in X11 + if (should_hide && !hovered && !panel.window.has_focus () || InternalUtils.get_x11_in_fullscreen (display)) { trigger_hide (); } else { trigger_show (); @@ -331,7 +339,14 @@ public class Gala.HideTracker : Object { } private void on_barrier_triggered () { - trigger_show (); - schedule_update (); + // Showing panels in fullscreen is broken in X11 + if (InternalUtils.get_x11_in_fullscreen (display)) { + return; + } + + if (hide_mode != NEVER || behavior_settings.get_boolean ("enable-hotcorners-in-fullscreen")) { + trigger_show (); + schedule_update (); + } } } diff --git a/src/ShellClients/PanelWindow.vala b/src/ShellClients/PanelWindow.vala index 7ee99e815..17972b93d 100644 --- a/src/ShellClients/PanelWindow.vala +++ b/src/ShellClients/PanelWindow.vala @@ -15,28 +15,21 @@ public class Gala.PanelWindow : ShellWindow, RootTarget { public Pantheon.Desktop.HideMode hide_mode { get { - return hide_tracker == null ? Pantheon.Desktop.HideMode.NEVER : hide_tracker.hide_mode; + return hide_tracker.hide_mode; } set { + hide_tracker.hide_mode = value; + if (value == NEVER) { - hide_tracker = null; - show (); make_exclusive (); - return; - } else if (hide_tracker == null) { + } else { unmake_exclusive (); - - hide_tracker = new HideTracker (wm.get_display (), this); - hide_tracker.hide.connect (hide); - hide_tracker.show.connect (show); } - - hide_tracker.hide_mode = value; } } private GestureController gesture_controller; - private HideTracker? hide_tracker; + private HideTracker hide_tracker; private int width = -1; private int height = -1; @@ -64,15 +57,9 @@ public class Gala.PanelWindow : ShellWindow, RootTarget { gesture_controller = new GestureController (DOCK, wm); add_gesture_controller (gesture_controller); - window.display.in_fullscreen_changed.connect (() => { - if (wm.get_display ().get_monitor_in_fullscreen (window.get_monitor ())) { - hide (); - } else if (hide_mode == NEVER) { - show (); - } else { - hide_tracker.update_overlap (); - } - }); + hide_tracker = new HideTracker (wm.get_display (), this); + hide_tracker.hide.connect (hide); + hide_tracker.show.connect (show); } public Mtk.Rectangle get_custom_window_rect () { @@ -106,10 +93,6 @@ public class Gala.PanelWindow : ShellWindow, RootTarget { } private void show () { - if (window.display.get_monitor_in_fullscreen (window.get_monitor ())) { - return; - } - gesture_controller.goto (0); } diff --git a/src/WindowManager.vala b/src/WindowManager.vala index b3f2e1bd6..b3d1951d2 100644 --- a/src/WindowManager.vala +++ b/src/WindowManager.vala @@ -19,6 +19,7 @@ namespace Gala { public class WindowManagerGala : Meta.Plugin, WindowManager { private const string OPEN_MULTITASKING_VIEW = "dbus-send --session --dest=org.pantheon.gala --print-reply /org/pantheon/gala org.pantheon.gala.PerformAction int32:1"; + private const string OPEN_APPLICATIONS_MENU = "io.elementary.wingpanel --toggle-indicator=app-launcher"; /** * {@inheritDoc} @@ -329,6 +330,13 @@ namespace Gala { }); display.overlay_key.connect (() => { + // Showing panels in fullscreen is broken in X11 + if (InternalUtils.get_x11_in_fullscreen (display) && + behavior_settings.get_string ("overlay-action") == OPEN_APPLICATIONS_MENU + ) { + return; + } + launch_action (ActionKeys.OVERLAY_ACTION); });