From e28c0d892274e89016c4871f2fc234d777e8779f Mon Sep 17 00:00:00 2001 From: Andrew Malyhin Date: Sat, 22 Jun 2019 15:09:25 +0300 Subject: [PATCH] add functionality of lazy focus loss to avoid close on short-term losses --- guake/guake_app.py | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/guake/guake_app.py b/guake/guake_app.py index f5585ae3e..878f3bdd2 100644 --- a/guake/guake_app.py +++ b/guake/guake_app.py @@ -28,6 +28,8 @@ import uuid from pathlib import Path +from time import sleep +from threading import Thread from urllib.parse import quote_plus from xml.sax.saxutils import escape as xml_escape @@ -204,6 +206,7 @@ def load_schema(): self.display_tab_names = 0 self.window.connect("focus-out-event", self.on_window_losefocus) + self.window.connect("focus-in-event", self.on_window_takefocus) # Handling the delete-event of the main window to avoid # problems when closing it. @@ -260,6 +263,9 @@ def window_event(*args): filename, ) + # usage of this property should be replaced with settigs option + self.stub_for_postponed_losefocus_property = True + log.info("Guake initialized") def get_notebook(self): @@ -478,12 +484,37 @@ def on_window_losefocus(self, window, event): if not HidePrevention(self.window).may_hide(): return - value = self.settings.general.get_boolean("window-losefocus") - visible = window.get_property("visible") - self.losefocus_time = get_server_time(self.window) - if visible and value: - log.info("Hiding on focus lose") - self.hide() + def hide_window_callback(): + value = self.settings.general.get_boolean("window-losefocus") + visible = window.get_property("visible") + self.losefocus_time = get_server_time(self.window) + if visible and value: + log.info("Hiding on focus lose") + self.hide() + return False + + def loosefocus_callback(sleep_time): + sleep(sleep_time) + + if self.window.get_property("has-toplevel-focus") and (self.takefocus_time - self.lazy_losefocus_time) > 0: + log.debug("Short term losefocus detected. Skip the hidding") + return + + if self.window.get_property("visible"): + from gi.repository import GLib + GLib.idle_add(hide_window_callback) + + if self.stub_for_postponed_losefocus_property: + self.lazy_losefocus_time = get_server_time(self.window) + thread = Thread(target = loosefocus_callback, args = (0.3,)) + thread.daemon = True + thread.start() + log.debug("Lazy losefocus check at %s", self.lazy_losefocus_time) + else: + hide_window_callback(-1) + + def on_window_takefocus(self, window, event): + self.takefocus_time = get_server_time(self.window) def show_menu(self, status_icon, button, activate_time): """Show the tray icon menu."""