main: Migrate to the Application model

We weren't registering with dbus or the session manager before, so migrating to
Application as our base really really helps with duplicate launches.
This commit is contained in:
June Tate-Gans 2021-05-08 19:23:14 -05:00
parent 841ad65b89
commit 81be3f2cf9
4 changed files with 101 additions and 48 deletions

60
g13gui/g13gui/app.py Normal file
View File

@ -0,0 +1,60 @@
import signal
from g13gui.model.prefsstore import PreferencesStore
from g13gui.g13.manager import DeviceManager
from g13gui.ui.appindicator import AppIndicator
from g13gui.ui.mainwindow import MainWindow
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
gi.require_version('GLib', '2.0')
gi.require_version('GnomeDesktop', '3.0')
from gi.repository import Gtk, GLib, Gio
class Application(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(
self,
application_id='com.theonelab.g13.G13Configurator')
GLib.set_application_name('G13 Configurator')
self._prefs = None
self._indicator = None
self._dm = None
self._mainwindow = None
def do_startup(self):
Gtk.Application.do_startup(self)
signal.signal(signal.SIGINT, signal.SIG_DFL)
action = Gio.SimpleAction.new('quit')
action.connect('activate', lambda *x: self.quit())
self.add_action(action)
self.add_accelerator('<Primary>q', 'app.quit')
def do_activate(self):
if not self._prefs:
self._prefs = PreferencesStore.getPrefs()
if not self._indicator:
self._indicator = AppIndicator(self, self._prefs)
if not self._dm:
self._dm = DeviceManager(self._prefs)
self._dm.start()
if not self._mainwindow:
self._mainwindow = MainWindow(self, self._prefs)
if self._prefs.showWindowOnStart:
self.showMainWindow()
def showMainWindow(self):
self._mainwindow.present()
def do_shutdown(self):
if self._mainwindow:
self._mainwindow.destroy()
if self._dm:
self._dm.shutdown()
Gtk.Application.do_shutdown(self)

View File

@ -1,22 +1,14 @@
#!/usr/bin/python #!/usr/bin/python
import gi import sys
import g13gui.ui as ui from dbus.mainloop.glib import DBusGMainLoop
from g13gui.model.prefsstore import PreferencesStore
from g13gui.g13.manager import Manager
gi.require_version('Gtk', '3.0') from g13gui.app import Application
from gi.repository import Gtk, Gdk, GObject
if __name__ == '__main__': if __name__ == '__main__':
Gdk.threads_init() DBusGMainLoop(set_as_default=True)
prefs = PreferencesStore.getPrefs() app = Application()
manager = Manager(prefs) app.run(sys.argv)
manager.start()
indicator = ui.AppIndicator(prefs)
Gtk.main()

View File

@ -12,25 +12,24 @@ from gi.repository import AppIndicator3 as indicator
class AppIndicator(GtkObserver): class AppIndicator(GtkObserver):
def __init__(self, prefs): def __init__(self, app, prefs):
GtkObserver.__init__(self) GtkObserver.__init__(self)
self._app = app
self._prefs = prefs
self._initIndicator() self._initIndicator()
self._prefs = prefs
self._mainWindow = None
self._menu = Gtk.Menu() self._menu = Gtk.Menu()
self._menuItems = [] self._menuItems = []
self._indicator.set_menu(self._menu) self._indicator.set_menu(self._menu)
self._rebuilding = False self._rebuilding = False
self._prefs.registerObserver(self, {'selectedProfile'}) self._prefs.registerObserver(self, {'selectedProfile'})
self.changeTrigger(self.onSelectedProfileChanged, self.changeTrigger(self.onSelectedProfileChanged,
keys={'selectedProfile'}) keys={'selectedProfile'})
if self._prefs.showWindowOnStart:
self.showMainWindow(None)
self._rebuildMenu() self._rebuildMenu()
def _initIndicator(self): def _initIndicator(self):
@ -75,20 +74,17 @@ class AppIndicator(GtkObserver):
self._attachMenuItem(sep) self._attachMenuItem(sep)
quitItem = Gtk.MenuItem('Quit') quitItem = Gtk.MenuItem('Quit')
quitItem.connect('activate', self.onQuit)
self._attachMenuItem(quitItem) self._attachMenuItem(quitItem)
quitItem.connect('activate', Gtk.main_quit)
self._menu.show_all() self._menu.show_all()
self._rebuilding = False self._rebuilding = False
def onMainWindowHidden(self, win):
del self._mainWindow
self._mainWindow = None
def showMainWindow(self, menuItem): def showMainWindow(self, menuItem):
self._mainWindow = MainWindow(self._prefs) self._app.showMainWindow()
self._mainWindow.connect('hide', self.onMainWindowHidden)
self._mainWindow.show_all() def onQuit(self, menuItem):
self._app.do_shutdown()
def changeProfile(self, menuItem): def changeProfile(self, menuItem):
self._prefs.setSelectedProfile(menuItem.get_label()) self._prefs.setSelectedProfile(menuItem.get_label())

View File

@ -1,29 +1,32 @@
#!/usr/bin/python
import gi
import threading import threading
import g13gui.ui as ui from g13gui.ui.profilecombobox import ProfileComboBox
from g13gui.ui.profilepopover import ProfilePopover
from g13gui.ui.profilepopover import ProfilePopoverMode
from g13gui.ui.g13button import G13Button
from g13gui.observer.gtkobserver import GtkObserver from g13gui.observer.gtkobserver import GtkObserver
from g13gui.model.prefsstore import PreferencesStore from g13gui.model.prefsstore import PreferencesStore
import gi
gi.require_version('Gtk', '3.0') gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0') gi.require_version('Gdk', '3.0')
from gi.repository import Gtk, Gdk, GObject from gi.repository import Gtk, Gdk, GObject
class MainWindow(Gtk.Window, GtkObserver): class MainWindow(Gtk.ApplicationWindow, GtkObserver):
def __init__(self, prefs): def __init__(self, app, prefs, **kwargs):
Gtk.Window.__init__(self) Gtk.ApplicationWindow.__init__(
self,
default_width=640,
default_height=480,
window_position=Gtk.WindowPosition.NONE,
name='g13configurator',
icon_name='g13configurator',
application=app,
**kwargs)
GtkObserver.__init__(self) GtkObserver.__init__(self)
self.set_default_size(640, 480) self._app = app
geometry = Gdk.Geometry()
geometry.max_width = 640
geometry.max_height = 480
self.set_geometry_hints(None, geometry, Gdk.WindowHints.MAX_SIZE)
self._prefs = prefs self._prefs = prefs
self._prefs.registerObserver(self, 'selectedProfile') self._prefs.registerObserver(self, 'selectedProfile')
self._prefs.selectedProfile().registerObserver(self) self._prefs.selectedProfile().registerObserver(self)
@ -46,6 +49,8 @@ class MainWindow(Gtk.Window, GtkObserver):
self.setupG13ButtonGrid() self.setupG13ButtonGrid()
self.show_all()
def _updateProfileRegistration(self): def _updateProfileRegistration(self):
self._lastProfileName.removeObserver(self) self._lastProfileName.removeObserver(self)
self._lastProfileName = self._prefs.selectedProfile() self._lastProfileName = self._prefs.selectedProfile()
@ -66,22 +71,22 @@ class MainWindow(Gtk.Window, GtkObserver):
self._headerBar.set_title("G13 Configurator") self._headerBar.set_title("G13 Configurator")
self._headerBar.set_show_close_button(True) self._headerBar.set_show_close_button(True)
self._profileComboBox = ui.ProfileComboBox(self._prefs) self._profileComboBox = ProfileComboBox(self._prefs)
self._headerBar.add(self._profileComboBox) self._headerBar.add(self._profileComboBox)
addProfileButton = Gtk.MenuButton.new() addProfileButton = Gtk.MenuButton.new()
addProfileButton.add(Gtk.Image.new_from_icon_name( addProfileButton.add(Gtk.Image.new_from_icon_name(
"document-new-symbolic", 1)) "document-new-symbolic", 1))
addProfilePopover = ui.ProfilePopover(self._prefs, addProfilePopover = ProfilePopover(self._prefs,
mode=ui.ProfilePopoverMode.ADD) mode=ProfilePopoverMode.ADD)
addProfileButton.set_popover(addProfilePopover) addProfileButton.set_popover(addProfilePopover)
self._headerBar.add(addProfileButton) self._headerBar.add(addProfileButton)
editProfileButton = Gtk.MenuButton.new() editProfileButton = Gtk.MenuButton.new()
editProfileButton.add( editProfileButton.add(
Gtk.Image.new_from_icon_name('document-edit-symbolic', 1)) Gtk.Image.new_from_icon_name('document-edit-symbolic', 1))
editProfilePopover = ui.ProfilePopover(self._prefs, editProfilePopover = ProfilePopover(self._prefs,
mode=ui.ProfilePopoverMode.EDIT) mode=ProfilePopoverMode.EDIT)
editProfileButton.set_popover(editProfilePopover) editProfileButton.set_popover(editProfilePopover)
self._headerBar.add(editProfileButton) self._headerBar.add(editProfileButton)
@ -146,6 +151,6 @@ class MainWindow(Gtk.Window, GtkObserver):
return button return button
def newG13Button(self, name): def newG13Button(self, name):
button = ui.G13Button(self._prefs, name) button = G13Button(self._prefs, name)
self._g13Buttons[name] = button self._g13Buttons[name] = button
return button return button