Skip to content

Commit

Permalink
chore: make ulauncher app the singleton instead of ulauncher window
Browse files Browse the repository at this point in the history
  • Loading branch information
friday committed Nov 27, 2022
1 parent b3f0e5f commit 43d7683
Show file tree
Hide file tree
Showing 9 changed files with 32 additions and 34 deletions.
10 changes: 7 additions & 3 deletions tests/api/shared/action/test_RenderResultListAction.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@


class TestRenderResultListAction:
@pytest.fixture(autouse=True)
def UlauncherApp(self, mocker):
app = mocker.patch('ulauncher.ui.UlauncherApp.UlauncherApp')
app.window = mocker.patch('ulauncher.ui.windows.UlauncherWindow.UlauncherWindow')()
return app

@pytest.fixture(autouse=True)
def GLib(self, mocker):
Expand All @@ -21,7 +26,6 @@ def action(self, result_list):
def test_keep_app_open(self, action):
assert action.keep_app_open

def test_run(self, action, mocker, result_list, GLib):
UlauncherWindow = mocker.patch('ulauncher.ui.windows.UlauncherWindow.UlauncherWindow')
def test_run(self, action, result_list, GLib, UlauncherApp):
action.run()
GLib.idle_add.assert_called_with(UlauncherWindow.get_instance.return_value.show_results, result_list)
GLib.idle_add.assert_called_with(UlauncherApp.return_value.window.show_results, result_list)
10 changes: 7 additions & 3 deletions tests/modes/apps/extensions/test_DeferredResultRenderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@


class TestDeferredResultRenderer:
@pytest.fixture(autouse=True)
def UlauncherApp(self, mocker):
app = mocker.patch('ulauncher.ui.UlauncherApp.UlauncherApp')
app.window = mocker.patch('ulauncher.ui.windows.UlauncherWindow.UlauncherWindow')()
return app

@pytest.fixture(autouse=True)
def timer(self, mocker):
Expand Down Expand Up @@ -53,15 +58,14 @@ def test_handle_response__action__is_ran(self, renderer, controller):
renderer.handle_response(response, controller)
response.action.run.assert_called_once_with()

def test_handle_response__keep_app_open_is_False__hide_is_called(self, renderer, controller, GLib, mocker):
UlauncherWindow = mocker.patch('ulauncher.ui.windows.UlauncherWindow.UlauncherWindow')
def test_handle_response__keep_app_open_is_False__hide_is_called(self, renderer, controller, GLib, UlauncherApp):
response = mock.Mock()
response.event = KeywordQueryEvent(Query('test'))
response.action.keep_app_open = False
renderer.active_event = response.event
renderer.active_controller = controller
renderer.handle_response(response, controller)
GLib.idle_add.assert_called_with(UlauncherWindow.get_instance.return_value.hide_and_clear_input)
GLib.idle_add.assert_called_with(UlauncherApp.return_value.window.hide_and_clear_input)

def test_on_query_change__loading__is_canceled(self, renderer):
timer = mock.Mock()
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/test_preferences_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class TestPreferencesContextServer:

@pytest.fixture(autouse=True)
def ulauncherWindow(self, mocker):
return mocker.patch('ulauncher.ui.windows.UlauncherWindow.UlauncherWindow.get_instance').return_value
return mocker.patch('ulauncher.ui.windows.UlauncherWindow.UlauncherWindow').return_value

@pytest.fixture(autouse=True)
def autostart_pref(self, mocker):
Expand Down
5 changes: 2 additions & 3 deletions ulauncher/api/shared/action/ExtensionCustomAction.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,9 @@ def run(self):
# import here to avoid circular deps
# pylint: disable=import-outside-toplevel
from ulauncher.modes.extensions.DeferredResultRenderer import DeferredResultRenderer
from ulauncher.ui.windows.UlauncherWindow import UlauncherWindow
from ulauncher.ui.UlauncherApp import UlauncherApp

window = UlauncherWindow.get_instance()
if not window.is_visible():
if not UlauncherApp().window.is_visible():
return

renderer = DeferredResultRenderer.get_instance()
Expand Down
4 changes: 2 additions & 2 deletions ulauncher/api/shared/action/RenderResultListAction.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ def __init__(self, result_list):

def run(self):
# pylint: disable=import-outside-toplevel
from ulauncher.ui.windows.UlauncherWindow import UlauncherWindow
from ulauncher.ui.UlauncherApp import UlauncherApp

window = UlauncherWindow.get_instance()
window = UlauncherApp().window
if window.is_visible():
# update UI in the main thread to avoid race conditions
GLib.idle_add(window.show_results, self.result_list)
12 changes: 2 additions & 10 deletions ulauncher/api/shared/action/SetUserQueryAction.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
from time import sleep
from gi.repository import GLib

from ulauncher.api.shared.action.BaseAction import BaseAction


Expand All @@ -18,11 +16,5 @@ def run(self):

def _update_query(self):
# pylint: disable=import-outside-toplevel
from ulauncher.ui.windows.UlauncherWindow import UlauncherWindow
input = UlauncherWindow.get_instance().input
input.set_text(self.new_query)

# Ugly hack:
# Defer set position, because GTK sets position after change event occurs
sleep(0.002)
input.set_position(-1)
from ulauncher.ui.UlauncherApp import UlauncherApp
UlauncherApp().query = self.new_query
4 changes: 2 additions & 2 deletions ulauncher/modes/extensions/DeferredResultRenderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ def _cancel_loading(self):

def _hide_window(self):
# pylint: disable=import-outside-toplevel
from ulauncher.ui.windows.UlauncherWindow import UlauncherWindow
from ulauncher.ui.UlauncherApp import UlauncherApp

window = UlauncherWindow.get_instance()
window = UlauncherApp().window
if window.is_visible():
# update UI in the main thread to avoid race conditions
GLib.idle_add(window.hide_and_clear_input)
13 changes: 9 additions & 4 deletions ulauncher/ui/UlauncherApp.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import time
import logging
from functools import lru_cache
from gi.repository import Gio, GLib, Gtk, Keybinder
from ulauncher.config import FIRST_RUN
from ulauncher.utils.environment import IS_X11
Expand All @@ -15,14 +16,18 @@
logger = logging.getLogger()


@lru_cache(maxsize=None)
class UlauncherApp(Gtk.Application):
"""
Main Ulauncher application (singleton)
"""
# Gtk.Applications check if the app is already registered and if so,
# new instances sends the signals to the registered one
# So all methods except __init__ runs on the main app
_query = ""
window = None # type: UlauncherWindow
preferences = None # type: PreferencesWindow
_appindicator = None # type: AppIndicator
window: UlauncherWindow
preferences: PreferencesWindow
_appindicator: AppIndicator
_current_accel_name = None

def __init__(self, *args, **kwargs):
Expand Down Expand Up @@ -64,7 +69,7 @@ def do_command_line(self, *args, **kwargs):
def setup(self, _):
settings = Settings.load()
self.hold() # Keep the app running even without a window
self.window = UlauncherWindow.get_instance()
self.window = UlauncherWindow()
self.window.set_application(self)
self.window.set_keep_above(True)
self.window.position_window()
Expand Down
6 changes: 0 additions & 6 deletions ulauncher/ui/windows/UlauncherWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
from ulauncher.modes.ModeHandler import ModeHandler
from ulauncher.modes.apps.AppResult import AppResult
from ulauncher.utils.Settings import Settings
from ulauncher.utils.decorator.singleton import singleton
from ulauncher.utils.wm import get_monitor
from ulauncher.utils.icon import load_icon_surface
from ulauncher.utils.environment import IS_X11_COMPATIBLE
Expand Down Expand Up @@ -129,11 +128,6 @@ def __init__(self):
self.input.connect("key-press-event", self.on_input_key_press)
prefs_btn.connect("clicked", lambda *_: self.app.show_preferences())

@classmethod
@singleton
def get_instance(cls):
return cls()

######################################
# GTK Signal Handlers
######################################
Expand Down

0 comments on commit 43d7683

Please sign in to comment.