From 83483aa7a3fa82f82b8ab258835af85b1fd02452 Mon Sep 17 00:00:00 2001 From: June Tate-Gans Date: Tue, 4 May 2021 02:06:19 -0500 Subject: [PATCH] appindicator: Make the appindicator the root of the app This reorganizes the ownership of the main window under the control of the appindicator. It also adds some additional flags in prefs to allow for disabling the opening of the main window on startup, and removes a bunch of cruft from main. --- g13gui/g13gui/main.py | 8 +------- g13gui/g13gui/model/prefs.py | 13 +++++++++++++ g13gui/g13gui/ui/appindicator.py | 14 ++++++++++++-- g13gui/g13gui/ui/g13button.py | 5 +++++ g13gui/g13gui/ui/mainwindow.py | 3 +-- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/g13gui/g13gui/main.py b/g13gui/g13gui/main.py index 7a85a59..de0ac7b 100644 --- a/g13gui/g13gui/main.py +++ b/g13gui/g13gui/main.py @@ -1,7 +1,6 @@ #!/usr/bin/python import gi -import queue import g13gui.ui as ui from g13gui.model.prefsstore import PreferencesStore @@ -18,11 +17,6 @@ if __name__ == '__main__': manager = Manager(prefs) manager.start() - queue = queue.Queue() - - win = ui.MainWindow(queue, prefs) - win.show_all() - - indicator = ui.AppIndicator(prefs, win) + indicator = ui.AppIndicator(prefs) Gtk.main() diff --git a/g13gui/g13gui/model/prefs.py b/g13gui/g13gui/model/prefs.py index d31b3c7..07ea2d3 100644 --- a/g13gui/g13gui/model/prefs.py +++ b/g13gui/g13gui/model/prefs.py @@ -2,6 +2,8 @@ import traceback +from builtins import property + from g13gui.common import VERSION from g13gui.model.bindingprofile import BindingProfile from g13gui.observer.subject import Subject @@ -15,12 +17,21 @@ class Preferences(Subject): def __init__(self, dict=None): self._profiles = {} self._selectedProfile = None + self._showWindowOnStart = True if dict: self.loadFromDict(dict) else: self.initDefaultProfile() + @property + def showWindowOnStart(self): + return self._showWindowOnStart + + @showWindowOnStart.setter + def showWindowOnStart(self, value): + self.setProperty('showWindowOnStart', value) + def profiles(self, profileName=None): if profileName: return self._profiles[profileName] @@ -85,6 +96,7 @@ class Preferences(Subject): def saveToDict(self): return { 'version': VERSION, + 'showWindowOnStart': self._showWindowOnStart, 'profiles': dict([(name, profile.saveToDict()) for name, profile in self._profiles.items()]), 'selectedProfile': self._selectedProfile } @@ -100,6 +112,7 @@ class Preferences(Subject): self._addProfile(name, BindingProfile(profile)) self._setSelectedProfile(dict['selectedProfile']) + self._showWindowOnStart = dict['showWindowOnStart'] except (Exception) as err: print('Unable to initialize from dict: %s' % err) diff --git a/g13gui/g13gui/ui/appindicator.py b/g13gui/g13gui/ui/appindicator.py index 13a999d..e0dd10e 100644 --- a/g13gui/g13gui/ui/appindicator.py +++ b/g13gui/g13gui/ui/appindicator.py @@ -3,6 +3,7 @@ import gi from g13gui.common import PROGNAME from g13gui.observer.gtkobserver import GtkObserver from g13gui.observer.subject import ChangeType +from g13gui.ui.mainwindow import MainWindow gi.require_version('Gtk', '3.0') gi.require_version('AppIndicator3', '0.1') @@ -11,13 +12,13 @@ from gi.repository import AppIndicator3 as indicator class AppIndicator(GtkObserver): - def __init__(self, prefs, mainWindow): + def __init__(self, prefs): GtkObserver.__init__(self) self._initIndicator() self._prefs = prefs - self._mainWindow = mainWindow + self._mainWindow = None self._menu = Gtk.Menu() self._menuItems = [] self._indicator.set_menu(self._menu) @@ -27,6 +28,9 @@ class AppIndicator(GtkObserver): self.changeTrigger(self.onSelectedProfileChanged, keys={'selectedProfile'}) + if self._prefs.showWindowOnStart: + self.showMainWindow(None) + self._rebuildMenu() def _initIndicator(self): @@ -77,7 +81,13 @@ class AppIndicator(GtkObserver): self._menu.show_all() self._rebuilding = False + def onMainWindowHidden(self, win): + del self._mainWindow + self._mainWindow = None + def showMainWindow(self, menuItem): + self._mainWindow = MainWindow(self._prefs) + self._mainWindow.connect('hide', self.onMainWindowHidden) self._mainWindow.show_all() def changeProfile(self, menuItem): diff --git a/g13gui/g13gui/ui/g13button.py b/g13gui/g13gui/ui/g13button.py index 43c1703..cb6ee67 100644 --- a/g13gui/g13gui/ui/g13button.py +++ b/g13gui/g13gui/ui/g13button.py @@ -29,6 +29,11 @@ class G13Button(Gtk.MenuButton, GtkObserver): self.set_can_default(False) self.updateProfileRegistration() + self.connect('show', self.onShown) + + def onShown(self, widget): + self.updateBindingDisplay() + def onSelectedProfileChanged(self, subject, changeType, key, data): self.updateProfileRegistration() self.updateBindingDisplay() diff --git a/g13gui/g13gui/ui/mainwindow.py b/g13gui/g13gui/ui/mainwindow.py index 9128dd1..ccf65ef 100644 --- a/g13gui/g13gui/ui/mainwindow.py +++ b/g13gui/g13gui/ui/mainwindow.py @@ -12,7 +12,7 @@ from gi.repository import Gtk, Gdk, GObject class MainWindow(Gtk.Window, GtkObserver): - def __init__(self, workerQueue, prefs): + def __init__(self, prefs): Gtk.Window.__init__(self) GtkObserver.__init__(self) @@ -22,7 +22,6 @@ class MainWindow(Gtk.Window, GtkObserver): geometry.max_height = 480 self.set_geometry_hints(None, geometry, Gdk.WindowHints.MAX_SIZE) - self._workerQueue = workerQueue self._prefs = prefs self._prefs.registerObserver(self, 'selectedProfile') self._prefs.selectedProfile().registerObserver(self)