mirror of
https://github.com/jtgans/g13gui.git
synced 2025-06-20 08:23:50 -04:00
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:
parent
841ad65b89
commit
81be3f2cf9
60
g13gui/g13gui/app.py
Normal file
60
g13gui/g13gui/app.py
Normal 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)
|
@ -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()
|
|
||||||
|
@ -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())
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user