2016-12-04 18:09:15 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
2018-08-22 18:33:43 +02:00
|
|
|
import collections
|
|
|
|
import glob
|
|
|
|
import urllib.request
|
2016-12-11 00:05:32 +01:00
|
|
|
import gettext
|
2018-09-23 13:49:19 +02:00
|
|
|
import gi
|
2016-12-08 18:11:08 +01:00
|
|
|
import json
|
|
|
|
import locale
|
2018-09-23 13:49:19 +02:00
|
|
|
import logging
|
2016-12-04 18:09:15 +01:00
|
|
|
import os
|
2017-05-25 17:05:49 +02:00
|
|
|
import subprocess
|
2016-12-06 18:54:02 +01:00
|
|
|
import sys
|
2016-12-05 18:41:28 +01:00
|
|
|
import webbrowser
|
2018-08-22 18:33:43 +02:00
|
|
|
|
2016-12-04 18:09:15 +01:00
|
|
|
gi.require_version("Gtk", "3.0")
|
2016-12-11 18:12:01 +01:00
|
|
|
from gi.repository import Gtk, GdkPixbuf
|
2016-12-04 18:09:15 +01:00
|
|
|
|
2016-12-21 15:35:54 +01:00
|
|
|
|
2019-12-03 09:18:22 +01:00
|
|
|
class EmbedManager:
|
|
|
|
"""manage included applications"""
|
|
|
|
def __init__(self, *args):
|
|
|
|
self.apps = []
|
|
|
|
self.count = 0
|
|
|
|
for app in args:
|
|
|
|
self.apps.append(app)
|
|
|
|
|
|
|
|
def get_modules(self, window: Gtk.Window):
|
|
|
|
for app in self.apps:
|
|
|
|
app.load(window)
|
|
|
|
self.count = sum((1 for x in self.apps if x.loaded))
|
|
|
|
|
|
|
|
def display(self, window: Gtk.Window):
|
|
|
|
for app in self.apps:
|
|
|
|
app.display(window)
|
|
|
|
if app.loaded:
|
|
|
|
btn = window.builder.get_object(app.name)
|
|
|
|
if self.count < 2:
|
|
|
|
btn.set_margin_start(200)
|
|
|
|
btn.set_margin_end(200)
|
|
|
|
#TODO if self.count>2 !!! ???
|
|
|
|
|
|
|
|
|
|
|
|
class Embed:
|
|
|
|
"""abstact class for include app"""
|
|
|
|
def __init__(self):
|
|
|
|
""" abstact class initialisation """
|
|
|
|
self.name = "app" + self.__class__.__name__[5:]
|
|
|
|
self.loaded = False
|
|
|
|
self.box = None
|
|
|
|
|
|
|
|
def load(self, window: Gtk.Window) -> bool:
|
|
|
|
""" load modules if installed"""
|
|
|
|
raise Exception('abstract method')
|
|
|
|
|
|
|
|
def display(self, window: Gtk.Window):
|
|
|
|
""" show btn and add page"""
|
|
|
|
window.builder.get_object(self.name).set_visible(self.loaded)
|
|
|
|
if self.loaded:
|
|
|
|
window.builder.get_object("stack").add_named(self.box, self.name + "page")
|
|
|
|
|
|
|
|
class EmbedLayouts(Embed):
|
|
|
|
"""Gnome layout switcher"""
|
|
|
|
def load(self, window: Gtk.Window) -> bool:
|
|
|
|
try:
|
|
|
|
from layoutswitcherlib.layoutsbox import LayoutBox
|
|
|
|
try:
|
|
|
|
self.box = LayoutBox(window, usehello=True)
|
|
|
|
except Exception as err:
|
|
|
|
print("Error in Embled application:", err)
|
|
|
|
except ModuleNotFoundError as err:
|
|
|
|
print(f"Info: Gnome-layout-switcher not installed")
|
|
|
|
self.loaded = self.box is not None
|
|
|
|
return self.loaded
|
|
|
|
|
|
|
|
class EmbedBrowser(Embed):
|
|
|
|
"""Application-utility"""
|
|
|
|
def load(self, window: Gtk.Window) -> bool:
|
|
|
|
try:
|
|
|
|
from application_utility.browser.application_browser import ApplicationBrowser
|
|
|
|
from application_utility.browser.exceptions import NoAppInIsoError
|
|
|
|
from application_utility.config.hello_config import HelloConfig
|
|
|
|
try:
|
|
|
|
conf = HelloConfig(application="manjaro-hello")
|
|
|
|
self.box = ApplicationBrowser(conf, window)
|
|
|
|
except Exception as err:
|
|
|
|
print("Error in Embled application:", err)
|
|
|
|
except ModuleNotFoundError as err:
|
|
|
|
print(f"Info: Application-utility not installed")
|
|
|
|
self.loaded = self.box is not None
|
|
|
|
return self.loaded
|
|
|
|
|
|
|
|
|
2018-08-22 18:33:43 +02:00
|
|
|
class Hello(Gtk.Window):
|
2017-05-25 16:13:44 +02:00
|
|
|
"""Hello"""
|
2017-02-04 11:00:52 +01:00
|
|
|
|
2016-12-04 18:09:15 +01:00
|
|
|
def __init__(self):
|
2018-08-22 18:33:43 +02:00
|
|
|
Gtk.Window.__init__(self, title="Manjaro Hello", border_width=6)
|
2016-12-05 21:49:29 +01:00
|
|
|
self.app = "manjaro-hello"
|
2017-10-07 18:54:24 +02:00
|
|
|
self.dev = "--dev" in sys.argv # Dev mode activated ?
|
2017-05-25 16:13:44 +02:00
|
|
|
|
|
|
|
# Load preferences
|
|
|
|
if self.dev:
|
|
|
|
self.preferences = read_json("data/preferences.json")
|
|
|
|
self.preferences["data_path"] = "data/"
|
2018-09-23 13:49:19 +02:00
|
|
|
self.preferences["desktop_path"] = os.getcwd() + f"/{self.app}.desktop"
|
2017-05-25 16:13:44 +02:00
|
|
|
self.preferences["locale_path"] = "locale/"
|
2018-09-23 13:49:19 +02:00
|
|
|
self.preferences["ui_path"] = f"ui/{self.app}.glade"
|
2016-12-10 17:34:29 +01:00
|
|
|
else:
|
2018-09-23 13:49:19 +02:00
|
|
|
self.preferences = read_json(f"/usr/share/{self.app}/data/preferences.json")
|
2017-05-25 16:13:44 +02:00
|
|
|
# Get saved infos
|
|
|
|
self.save = read_json(self.preferences["save_path"])
|
|
|
|
if not self.save:
|
|
|
|
self.save = {"locale": None}
|
2016-12-18 00:05:56 +01:00
|
|
|
|
2016-12-11 00:05:32 +01:00
|
|
|
# Init window
|
2017-05-25 16:13:44 +02:00
|
|
|
self.builder = Gtk.Builder.new_from_file(self.preferences["ui_path"])
|
2016-12-11 00:05:32 +01:00
|
|
|
self.builder.connect_signals(self)
|
|
|
|
self.window = self.builder.get_object("window")
|
2017-05-09 20:00:16 +02:00
|
|
|
|
|
|
|
# Subtitle of headerbar
|
2017-06-16 16:30:08 +02:00
|
|
|
self.builder.get_object("headerbar").props.subtitle = ' '.join(get_lsb_infos())
|
2016-12-11 00:05:32 +01:00
|
|
|
|
2017-05-25 16:59:03 +02:00
|
|
|
# Load images
|
2017-05-25 16:13:44 +02:00
|
|
|
if os.path.isfile(self.preferences["logo_path"]):
|
|
|
|
logo = GdkPixbuf.Pixbuf.new_from_file(self.preferences["logo_path"])
|
2017-05-07 17:59:17 +02:00
|
|
|
self.window.set_icon(logo)
|
2017-05-07 18:41:28 +02:00
|
|
|
self.builder.get_object("distriblogo").set_from_pixbuf(logo)
|
2017-05-07 17:59:17 +02:00
|
|
|
self.builder.get_object("aboutdialog").set_logo(logo)
|
2016-12-11 18:12:01 +01:00
|
|
|
|
2017-05-25 16:59:03 +02:00
|
|
|
for btn in self.builder.get_object("social").get_children():
|
|
|
|
icon_path = self.preferences["data_path"] + "img/" + btn.get_name() + ".png"
|
|
|
|
self.builder.get_object(btn.get_name()).set_from_file(icon_path)
|
|
|
|
|
|
|
|
for widget in self.builder.get_object("homepage").get_children():
|
2017-09-16 15:59:21 +02:00
|
|
|
if isinstance(widget, Gtk.Button) and \
|
2018-09-23 13:49:19 +02:00
|
|
|
widget.get_image_position() is Gtk.PositionType.RIGHT:
|
2017-05-25 17:03:35 +02:00
|
|
|
img = Gtk.Image.new_from_file(
|
|
|
|
self.preferences["data_path"] + "img/external-link.png")
|
2019-11-27 21:44:44 +01:00
|
|
|
img.set_margin_start(2)
|
2017-05-25 16:59:03 +02:00
|
|
|
widget.set_image(img)
|
|
|
|
|
2016-12-26 18:12:17 +01:00
|
|
|
# Create pages
|
2017-05-25 16:34:18 +02:00
|
|
|
self.pages = os.listdir("{}/pages/{}".format(self.preferences["data_path"],
|
2017-05-25 17:03:35 +02:00
|
|
|
self.preferences["default_locale"]))
|
2016-12-26 18:12:17 +01:00
|
|
|
for page in self.pages:
|
|
|
|
scrolled_window = Gtk.ScrolledWindow()
|
2017-02-04 16:18:08 +01:00
|
|
|
viewport = Gtk.Viewport(border_width=10)
|
2016-12-26 18:12:17 +01:00
|
|
|
label = Gtk.Label(wrap=True)
|
|
|
|
viewport.add(label)
|
|
|
|
scrolled_window.add(viewport)
|
2016-12-26 18:19:16 +01:00
|
|
|
scrolled_window.show_all()
|
2016-12-26 18:12:17 +01:00
|
|
|
self.builder.get_object("stack").add_named(scrolled_window, page + "page")
|
|
|
|
|
2016-12-09 17:28:22 +01:00
|
|
|
# Init translation
|
2016-12-11 00:05:32 +01:00
|
|
|
self.default_texts = {}
|
2017-05-25 16:13:44 +02:00
|
|
|
gettext.bindtextdomain(self.app, self.preferences["locale_path"])
|
2016-12-11 00:05:32 +01:00
|
|
|
gettext.textdomain(self.app)
|
2016-12-28 14:53:32 +01:00
|
|
|
self.builder.get_object("languages").set_active_id(self.get_best_locale())
|
2016-12-09 17:28:22 +01:00
|
|
|
|
2016-12-11 00:37:11 +01:00
|
|
|
# Set autostart switcher state
|
2017-06-22 05:49:53 +02:00
|
|
|
self.autostart = os.path.isfile(fix_path(self.preferences["autostart_path"]))
|
2016-12-18 15:34:43 +01:00
|
|
|
self.builder.get_object("autostart").set_active(self.autostart)
|
2016-12-11 00:37:11 +01:00
|
|
|
|
2016-12-08 17:39:52 +01:00
|
|
|
# Live systems
|
2018-09-23 13:49:19 +02:00
|
|
|
if os.path.exists(self.preferences["live_path"]) and os.path.isfile(self.preferences["installer_path"]):
|
2016-12-22 22:32:30 +01:00
|
|
|
self.builder.get_object("installlabel").set_visible(True)
|
2016-12-26 17:29:24 +01:00
|
|
|
self.builder.get_object("install").set_visible(True)
|
2018-09-23 13:49:19 +02:00
|
|
|
# Installed systems
|
2018-08-22 18:33:43 +02:00
|
|
|
else:
|
2019-12-03 09:18:22 +01:00
|
|
|
manager = EmbedManager(EmbedBrowser(), EmbedLayouts())
|
|
|
|
manager.get_modules(self)
|
|
|
|
manager.display(self)
|
2016-12-08 17:39:52 +01:00
|
|
|
|
2016-12-26 18:19:16 +01:00
|
|
|
self.window.show()
|
2016-12-04 18:09:15 +01:00
|
|
|
|
2016-12-20 00:17:40 +01:00
|
|
|
def get_best_locale(self):
|
2016-12-20 00:29:03 +01:00
|
|
|
"""Choose best locale, based on user's preferences.
|
|
|
|
:return: locale to use
|
|
|
|
:rtype: str
|
|
|
|
"""
|
2017-05-25 16:13:44 +02:00
|
|
|
path = self.preferences["locale_path"] + "{}/LC_MESSAGES/" + self.app + ".mo"
|
2017-05-25 21:08:35 +02:00
|
|
|
if os.path.isfile(path.format(self.save["locale"])):
|
2017-05-25 16:13:44 +02:00
|
|
|
return self.save["locale"]
|
2017-05-25 21:08:35 +02:00
|
|
|
elif self.save["locale"] == self.preferences["default_locale"]:
|
|
|
|
return self.preferences["default_locale"]
|
2016-12-20 00:17:40 +01:00
|
|
|
else:
|
2016-12-28 15:58:14 +01:00
|
|
|
sys_locale = locale.getdefaultlocale()[0]
|
2016-12-20 00:17:40 +01:00
|
|
|
# If user's locale is supported
|
2016-12-28 15:58:14 +01:00
|
|
|
if os.path.isfile(path.format(sys_locale)):
|
2017-02-05 11:15:04 +01:00
|
|
|
if "_" in sys_locale:
|
|
|
|
return sys_locale.replace("_", "-")
|
|
|
|
else:
|
|
|
|
return sys_locale
|
2016-12-20 00:17:40 +01:00
|
|
|
# If two first letters of user's locale is supported (ex: en_US -> en)
|
2016-12-28 15:58:14 +01:00
|
|
|
elif os.path.isfile(path.format(sys_locale[:2])):
|
|
|
|
return sys_locale[:2]
|
2016-12-20 00:17:40 +01:00
|
|
|
else:
|
2017-05-25 16:13:44 +02:00
|
|
|
return self.preferences["default_locale"]
|
2016-12-20 00:17:40 +01:00
|
|
|
|
2018-09-23 13:49:19 +02:00
|
|
|
def set_locale(self, use_locale):
|
2016-12-17 23:19:05 +01:00
|
|
|
"""Set locale of ui and pages.
|
2018-09-23 13:49:19 +02:00
|
|
|
:param use_locale: locale to use
|
|
|
|
:type use_locale: str
|
2016-12-17 23:19:05 +01:00
|
|
|
"""
|
2016-12-21 18:32:16 +01:00
|
|
|
try:
|
2017-09-16 15:59:21 +02:00
|
|
|
translation = gettext.translation(self.app, self.preferences[
|
2018-09-23 13:49:19 +02:00
|
|
|
"locale_path"], [use_locale], fallback=True)
|
2017-09-16 15:59:21 +02:00
|
|
|
translation.install()
|
2016-12-21 18:32:16 +01:00
|
|
|
except OSError:
|
2016-12-21 18:39:15 +01:00
|
|
|
return
|
2016-12-11 00:05:32 +01:00
|
|
|
|
2018-09-23 13:49:19 +02:00
|
|
|
self.save["locale"] = use_locale
|
2017-03-19 21:29:53 +01:00
|
|
|
|
2017-09-16 16:11:21 +02:00
|
|
|
# Real-time locale changing
|
|
|
|
|
2016-12-11 00:05:32 +01:00
|
|
|
elts = {
|
2018-09-23 13:49:19 +02:00
|
|
|
"comments": {"aboutdialog"},
|
2016-12-26 21:15:04 +01:00
|
|
|
"label": {
|
|
|
|
"autostartlabel",
|
2017-01-08 22:20:13 +01:00
|
|
|
"development",
|
2016-12-26 21:15:04 +01:00
|
|
|
"chat",
|
|
|
|
"donate",
|
|
|
|
"firstcategory",
|
2017-05-25 16:14:54 +02:00
|
|
|
"forum",
|
2016-12-26 21:15:04 +01:00
|
|
|
"install",
|
|
|
|
"installlabel",
|
|
|
|
"involved",
|
|
|
|
"mailling",
|
|
|
|
"readme",
|
|
|
|
"release",
|
|
|
|
"secondcategory",
|
|
|
|
"thirdcategory",
|
|
|
|
"welcomelabel",
|
|
|
|
"welcometitle",
|
|
|
|
"wiki"
|
|
|
|
},
|
2017-10-07 19:30:19 +02:00
|
|
|
"tooltip_text": {
|
|
|
|
"about",
|
|
|
|
"home",
|
|
|
|
"development",
|
|
|
|
"chat",
|
|
|
|
"donate",
|
|
|
|
"forum",
|
|
|
|
"mailling",
|
|
|
|
"wiki"
|
|
|
|
}
|
2016-12-11 00:05:32 +01:00
|
|
|
}
|
2016-12-26 21:15:04 +01:00
|
|
|
for method in elts:
|
2017-10-07 19:38:59 +02:00
|
|
|
if method not in self.default_texts:
|
|
|
|
self.default_texts[method] = {}
|
2016-12-26 21:15:04 +01:00
|
|
|
for elt in elts[method]:
|
2017-10-07 19:30:19 +02:00
|
|
|
if elt not in self.default_texts[method]:
|
|
|
|
self.default_texts[method][elt] = getattr(
|
2017-05-25 17:03:35 +02:00
|
|
|
self.builder.get_object(elt), "get_" + method)()
|
2017-10-07 19:30:19 +02:00
|
|
|
getattr(self.builder.get_object(elt), "set_" + method)(_(self.default_texts[method][elt]))
|
2016-12-11 00:05:32 +01:00
|
|
|
|
2016-12-26 18:12:17 +01:00
|
|
|
# Change content of pages
|
|
|
|
for page in self.pages:
|
|
|
|
child = self.builder.get_object("stack").get_child_by_name(page + "page")
|
|
|
|
label = child.get_children()[0].get_children()[0]
|
|
|
|
label.set_markup(self.get_page(page))
|
2016-12-17 00:07:49 +01:00
|
|
|
|
2016-12-26 15:50:54 +01:00
|
|
|
def set_autostart(self, autostart):
|
2016-12-17 23:19:05 +01:00
|
|
|
"""Set state of autostart.
|
|
|
|
:param autostart: wanted autostart state
|
|
|
|
:type autostart: bool
|
|
|
|
"""
|
2016-12-17 11:55:00 +01:00
|
|
|
try:
|
2017-05-25 17:24:31 +02:00
|
|
|
if autostart and not os.path.isfile(fix_path(self.preferences["autostart_path"])):
|
|
|
|
os.symlink(self.preferences["desktop_path"],
|
|
|
|
fix_path(self.preferences["autostart_path"]))
|
|
|
|
elif not autostart and os.path.isfile(fix_path(self.preferences["autostart_path"])):
|
|
|
|
os.unlink(fix_path(self.preferences["autostart_path"]))
|
2016-12-26 15:50:54 +01:00
|
|
|
# Specific to i3
|
2017-05-25 17:24:31 +02:00
|
|
|
i3_config = fix_path("~/.i3/config")
|
2016-12-26 15:50:54 +01:00
|
|
|
if os.path.isfile(i3_config):
|
2016-12-26 20:27:16 +01:00
|
|
|
i3_autostart = "exec --no-startup-id " + self.app
|
2018-09-23 13:49:19 +02:00
|
|
|
with open(i3_config, "r+") as file:
|
|
|
|
content = file.read()
|
|
|
|
file.seek(0)
|
2016-12-26 15:50:54 +01:00
|
|
|
if autostart:
|
2018-09-23 13:49:19 +02:00
|
|
|
file.write(content.replace("#" + i3_autostart, i3_autostart))
|
2016-12-26 15:50:54 +01:00
|
|
|
else:
|
2018-09-23 13:49:19 +02:00
|
|
|
file.write(content.replace(i3_autostart, "#" + i3_autostart))
|
|
|
|
file.truncate()
|
2016-12-28 23:20:36 +01:00
|
|
|
self.autostart = autostart
|
2017-02-04 11:00:52 +01:00
|
|
|
except OSError as error:
|
|
|
|
print(error)
|
2016-12-04 18:09:15 +01:00
|
|
|
|
2016-12-26 17:30:23 +01:00
|
|
|
def get_page(self, name):
|
2016-12-17 23:19:05 +01:00
|
|
|
"""Read page according to language.
|
|
|
|
:param name: name of page (filename)
|
|
|
|
:type name: str
|
|
|
|
:return: text to load
|
|
|
|
:rtype: str
|
|
|
|
"""
|
2017-05-25 16:13:44 +02:00
|
|
|
filename = self.preferences["data_path"] + "pages/{}/{}".format(self.save["locale"], name)
|
2016-12-04 20:40:34 +01:00
|
|
|
if not os.path.isfile(filename):
|
2017-05-25 17:03:35 +02:00
|
|
|
filename = self.preferences["data_path"] + \
|
2018-09-23 13:49:19 +02:00
|
|
|
"pages/{}/{}".format(self.preferences["default_locale"], name)
|
2016-12-04 18:09:15 +01:00
|
|
|
try:
|
2017-09-16 15:59:21 +02:00
|
|
|
with open(filename, "r") as fil:
|
|
|
|
return fil.read()
|
2016-12-21 18:34:34 +01:00
|
|
|
except OSError:
|
2016-12-17 12:15:27 +01:00
|
|
|
return _("Can't load page.")
|
2016-12-04 18:09:15 +01:00
|
|
|
|
|
|
|
# Handlers
|
2016-12-09 17:28:22 +01:00
|
|
|
def on_languages_changed(self, combobox):
|
2016-12-17 23:07:03 +01:00
|
|
|
"""Event for selected language."""
|
2016-12-28 14:53:32 +01:00
|
|
|
self.set_locale(combobox.get_active_id())
|
2016-12-09 17:28:22 +01:00
|
|
|
|
2016-12-17 12:21:15 +01:00
|
|
|
def on_action_clicked(self, action, _=None):
|
2016-12-17 23:07:03 +01:00
|
|
|
"""Event for differents actions."""
|
2016-12-17 12:21:15 +01:00
|
|
|
name = action.get_name()
|
2016-12-26 17:29:24 +01:00
|
|
|
if name == "install":
|
2018-05-07 21:26:41 +02:00
|
|
|
subprocess.Popen(["calamares_polkit"])
|
2016-12-17 12:21:15 +01:00
|
|
|
elif name == "autostart":
|
2016-12-28 16:04:09 +01:00
|
|
|
self.set_autostart(action.get_active())
|
2016-12-17 12:08:40 +01:00
|
|
|
elif name == "about":
|
|
|
|
dialog = self.builder.get_object("aboutdialog")
|
|
|
|
dialog.run()
|
|
|
|
dialog.hide()
|
2018-09-23 13:49:19 +02:00
|
|
|
elif name == "appBrowser":
|
|
|
|
# or use only "on_btn_clicked" ?
|
|
|
|
self.builder.get_object("home").set_sensitive(not name == "home")
|
|
|
|
self.builder.get_object("stack").set_visible_child_name(name + "page")
|
2016-12-04 18:09:15 +01:00
|
|
|
|
2016-12-17 23:55:19 +01:00
|
|
|
def on_btn_clicked(self, btn):
|
2018-09-23 13:49:19 +02:00
|
|
|
"""Event for applications button."""
|
2016-12-26 19:25:39 +01:00
|
|
|
name = btn.get_name()
|
2016-12-26 21:05:38 +01:00
|
|
|
self.builder.get_object("home").set_sensitive(not name == "home")
|
2016-12-26 19:25:39 +01:00
|
|
|
self.builder.get_object("stack").set_visible_child_name(name + "page")
|
2016-12-17 23:55:19 +01:00
|
|
|
|
2016-12-11 00:58:59 +01:00
|
|
|
def on_link_clicked(self, link, _=None):
|
2016-12-17 23:07:03 +01:00
|
|
|
"""Event for clicked link."""
|
2017-05-25 16:28:59 +02:00
|
|
|
webbrowser.open_new_tab(self.preferences["urls"][link.get_name()])
|
2016-12-05 18:41:28 +01:00
|
|
|
|
2016-12-04 18:09:15 +01:00
|
|
|
def on_delete_window(self, *args):
|
2016-12-17 23:07:03 +01:00
|
|
|
"""Event to quit app."""
|
2017-05-25 16:13:44 +02:00
|
|
|
write_json(self.preferences["save_path"], self.save)
|
2016-12-04 18:09:15 +01:00
|
|
|
Gtk.main_quit(*args)
|
|
|
|
|
2016-12-21 15:35:54 +01:00
|
|
|
|
2017-05-25 16:13:44 +02:00
|
|
|
def fix_path(path):
|
2017-05-25 20:45:00 +02:00
|
|
|
"""Make good paths.
|
|
|
|
:param path: path to fix
|
|
|
|
:type path: str
|
|
|
|
:return: fixed path
|
|
|
|
:rtype: str
|
|
|
|
"""
|
2017-05-25 16:13:44 +02:00
|
|
|
if "~" in path:
|
|
|
|
path = path.replace("~", os.path.expanduser("~"))
|
|
|
|
return path
|
|
|
|
|
|
|
|
|
2016-12-18 00:05:56 +01:00
|
|
|
def read_json(path):
|
2017-02-04 11:00:52 +01:00
|
|
|
"""Read content of a json file.
|
2017-05-25 20:45:00 +02:00
|
|
|
:param path: path to read
|
2017-05-21 20:38:21 +02:00
|
|
|
:type path: str
|
2017-02-04 11:00:52 +01:00
|
|
|
:return: json content
|
|
|
|
:rtype: str
|
|
|
|
"""
|
2017-05-25 16:13:44 +02:00
|
|
|
path = fix_path(path)
|
2016-12-18 00:05:56 +01:00
|
|
|
try:
|
2017-09-16 15:59:21 +02:00
|
|
|
with open(path, "r") as fil:
|
|
|
|
return json.load(fil)
|
2016-12-21 18:34:34 +01:00
|
|
|
except OSError:
|
2016-12-18 00:05:56 +01:00
|
|
|
return None
|
|
|
|
|
2017-05-25 16:13:44 +02:00
|
|
|
|
2017-05-21 20:38:21 +02:00
|
|
|
def write_json(path, content):
|
|
|
|
"""Write content in a json file.
|
2017-05-25 20:45:00 +02:00
|
|
|
:param path: path to write
|
2017-05-21 20:38:21 +02:00
|
|
|
:type path: str
|
|
|
|
:param content: content to write
|
|
|
|
:type path: str
|
|
|
|
"""
|
2017-05-25 16:13:44 +02:00
|
|
|
path = fix_path(path)
|
2017-05-21 20:38:21 +02:00
|
|
|
try:
|
2017-09-16 15:59:21 +02:00
|
|
|
with open(path, "w") as fil:
|
|
|
|
json.dump(content, fil)
|
2017-05-21 20:38:21 +02:00
|
|
|
except OSError as error:
|
|
|
|
print(error)
|
2016-12-21 15:35:54 +01:00
|
|
|
|
2018-08-22 18:33:43 +02:00
|
|
|
|
2017-06-16 16:30:08 +02:00
|
|
|
def get_lsb_infos():
|
|
|
|
"""Read informations from the lsb-release file.
|
|
|
|
:return: args from lsb-release file
|
|
|
|
:rtype: dict"""
|
|
|
|
lsb = {}
|
|
|
|
try:
|
2018-09-23 13:49:19 +02:00
|
|
|
with open("/etc/lsb-release") as lsb_release:
|
|
|
|
for line in lsb_release:
|
2017-06-16 16:30:08 +02:00
|
|
|
if "=" in line:
|
|
|
|
var, arg = line.rstrip().split("=")
|
2019-11-24 16:26:25 +01:00
|
|
|
if not arg:
|
|
|
|
continue
|
|
|
|
var = var.replace("DISTRIB_","")
|
|
|
|
lsb[var] = arg.strip('"')
|
2018-09-23 13:49:19 +02:00
|
|
|
except (OSError, KeyError) as error:
|
2017-06-16 16:30:08 +02:00
|
|
|
print(error)
|
2018-09-23 13:49:19 +02:00
|
|
|
return 'not Manjaro', '0.0'
|
2017-06-16 16:30:08 +02:00
|
|
|
return lsb["CODENAME"], lsb["RELEASE"]
|
|
|
|
|
2017-05-25 16:13:44 +02:00
|
|
|
|
2016-12-05 22:18:23 +01:00
|
|
|
if __name__ == "__main__":
|
2018-09-23 13:49:19 +02:00
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
2018-08-22 18:33:43 +02:00
|
|
|
hello = Hello()
|
|
|
|
hello.connect("destroy", Gtk.main_quit)
|
2016-12-05 22:18:23 +01:00
|
|
|
Gtk.main()
|