89 lines
2.8 KiB
Python
89 lines
2.8 KiB
Python
# Python imports
|
|
import os
|
|
|
|
# Lib imports
|
|
import gi, cairo
|
|
gi.require_version('Gtk', '3.0')
|
|
gi.require_version('Gdk', '3.0')
|
|
|
|
from gi.repository import Gtk
|
|
from gi.repository import Gdk
|
|
|
|
# Application imports
|
|
from .signals_mixin import SignalsMixin
|
|
from .container import Container
|
|
|
|
|
|
|
|
class MissingConfigError(Exception):
|
|
pass
|
|
|
|
|
|
class Window(SignalsMixin, Gtk.ApplicationWindow):
|
|
"""docstring for Window."""
|
|
|
|
def __init__(self, args, unknownargs):
|
|
super(Window, self).__init__()
|
|
|
|
self._USER_HOME = os.path.expanduser('~')
|
|
self._USR_PATH = f"/usr/share/{app_name.lower()}"
|
|
self._CONFIG_PATH = f"{self._USER_HOME}/.config/{app_name.lower()}"
|
|
self._ICON_FILE = f"{self._CONFIG_PATH}/icon.png"
|
|
self._CSS_FILE = f"{self._CONFIG_PATH}/stylesheet.css"
|
|
|
|
if not os.path.exists(self._ICON_FILE):
|
|
self._ICON_FILE = f"{self._USR_PATH}/icon.png"
|
|
if not os.path.exists(self._ICON_FILE):
|
|
raise MissingConfigError("Unable to find the application icon.")
|
|
|
|
if not os.path.exists(self._ICON_FILE):
|
|
self._CSS_FILE = f"{self._USR_PATH}/stylesheet.css"
|
|
if not os.path.exists(self._ICON_FILE):
|
|
raise MissingConfigError("Unable to find the stylesheet.")
|
|
|
|
self.setup_win_settings()
|
|
self.setup_styling()
|
|
self.setup_signals()
|
|
self.setup_custom_event_signals()
|
|
self.add(Container())
|
|
|
|
self.show_all()
|
|
|
|
|
|
def setup_signals(self):
|
|
self.connect("delete-event", Gtk.main_quit)
|
|
|
|
def setup_win_settings(self):
|
|
self.set_icon_from_file(self._ICON_FILE)
|
|
self.set_title(app_name)
|
|
self.set_default_size(800, 200)
|
|
self.set_keep_above(True)
|
|
self.set_accept_focus(False)
|
|
self.set_skip_taskbar_hint(True)
|
|
self.set_skip_pager_hint(True)
|
|
self.set_type_hint(3) # 3 = TOOLBAR
|
|
self.set_gravity(8) # 5 = CENTER, 8 = SOUTH
|
|
self.set_position(1) # 1 = CENTER, 4 = CENTER_ALWAYS
|
|
self.stick()
|
|
|
|
def setup_styling(self):
|
|
screen = self.get_screen()
|
|
visual = screen.get_rgba_visual()
|
|
|
|
if visual != None and screen.is_composited():
|
|
self.set_visual(visual)
|
|
self.set_app_paintable(True)
|
|
self.connect("draw", self._area_draw)
|
|
|
|
css_provider = Gtk.CssProvider()
|
|
css_provider.load_from_path(self._CSS_FILE)
|
|
screen = Gdk.Screen.get_default()
|
|
style_context = Gtk.StyleContext()
|
|
style_context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)
|
|
|
|
def _area_draw(self, widget, cr):
|
|
cr.set_source_rgba(0, 0, 0, 0.54)
|
|
cr.set_operator(cairo.OPERATOR_SOURCE)
|
|
cr.paint()
|
|
cr.set_operator(cairo.OPERATOR_OVER)
|