From e3747493ad857ba6c26763d5db29980304aa75f2 Mon Sep 17 00:00:00 2001 From: Daniel Cecil Date: Tue, 26 Feb 2019 10:57:31 -0800 Subject: [PATCH 01/63] Adding icon boundary wrapping to page Wrapping back to beggining or end of icon list provides better usability --- sys.py/UI/page.py | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/sys.py/UI/page.py b/sys.py/UI/page.py index 5443812..c5a3105 100644 --- a/sys.py/UI/page.py +++ b/sys.py/UI/page.py @@ -477,25 +477,20 @@ class Page(Widget): self._Ps.Draw() def MoveIconIndexPrev(self): - + self._PrevIconIndex = self._IconIndex self._IconIndex-=1 if self._IconIndex < 0: - self._IconIndex = 0 - self._PrevIconIndex = self._IconIndex + self._IconIndex = max(0, self._IconNumbers - 1) # Wrap Icon Index return False - self._PrevIconIndex = self._IconIndex+1 return True def MoveIconIndexNext(self): - #True for Moved,False is boundary + self._PrevIconIndex = self._IconIndex self._IconIndex+=1 if self._IconIndex > (self._IconNumbers - 1): - self._IconIndex = self._IconNumbers -1 - self._PrevIconIndex = self._IconIndex + self._IconIndex = 0 # Wrap Icon Index return False - self._PrevIconIndex = self._IconIndex-1 return True - def IconClick(self): @@ -614,25 +609,36 @@ class Page(Widget): if event.key == CurKeys["Right"]: if self.MoveIconIndexNext() == True: if self._IconIndex == (self._IconNumbers -1) or self._PrevIconIndex == 0: - self.IconSmoothUp(icon_width+ self._PageIconMargin) # only move up selected icon,no horizontal translation + self.IconSmoothUp(icon_width + self._PageIconMargin) else: self.IconsEasingLeft(icon_width + self._PageIconMargin) + else: + screen_icons = int(math.floor(self._Screen._Width / (icon_width + self._PageIconMargin))) + if self._IconNumbers > screen_icons: + self.IconsEasingRight((icon_width + self._PageIconMargin) * (self._IconNumbers - screen_icons)) + elif self._IconNumbers > 0: + self.IconSmoothUp(icon_width+ self._PageIconMargin) - self._PsIndex = self._IconIndex - self._Screen.Draw() - self._Screen.SwapAndShow() - + self._PsIndex = self._IconIndex + self._Screen.Draw() + self._Screen.SwapAndShow() if event.key == CurKeys["Left"]: if self.MoveIconIndexPrev() == True: if self._IconIndex == 0 or self._PrevIconIndex == (self._IconNumbers -1): - self.IconSmoothUp(icon_width+ self._PageIconMargin) + self.IconSmoothUp(icon_width + self._PageIconMargin) else: self.IconsEasingRight(icon_width + self._PageIconMargin) + else: + screen_icons = int(math.floor(self._Screen._Width / (icon_width + self._PageIconMargin))) + if self._IconNumbers > screen_icons: + self.IconsEasingLeft((icon_width + self._PageIconMargin) * (self._IconNumbers - screen_icons)) + elif self._IconNumbers > 0: + self.IconSmoothUp(icon_width+ self._PageIconMargin) - self._PsIndex = self._IconIndex - self._Screen.Draw() - self._Screen.SwapAndShow() + self._PsIndex = self._IconIndex + self._Screen.Draw() + self._Screen.SwapAndShow() if IsKeyStartOrA(event.key): self.IconClick() From 5d1dba34797a912c08412c6cbb7e4c205f9bdac6 Mon Sep 17 00:00:00 2001 From: Song Xie Date: Sat, 23 Mar 2019 01:30:21 -0700 Subject: [PATCH 02/63] Chinese translation for menu items in Settings --- sys.py/langs/03_简体中文.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sys.py/langs/03_简体中文.ini b/sys.py/langs/03_简体中文.ini index 69d6c0b..48f29e3 100644 --- a/sys.py/langs/03_简体中文.ini +++ b/sys.py/langs/03_简体中文.ini @@ -106,3 +106,8 @@ Music Library=乐库 Play/Pause=播放/暂停 my favorite music=我的音乐库 Check Update=检查更新 +Switch to LauncherGo=切换至LauncherGo +GPU driver switch=切换GPU驱动 +Network gateway switch=切换网关 +Rebooting to LauncherGo=正在重启至LauncherGo... +Awaiting Input=等待输入中... From 6f855dc36fda1e3dc12a74dd4fca5daec5b80e14 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 17 Apr 2019 14:52:43 +0800 Subject: [PATCH 03/63] update pico8 zip md5sum --- Menu/GameShell/50_PICO-8/compkginfo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Menu/GameShell/50_PICO-8/compkginfo.json b/Menu/GameShell/50_PICO-8/compkginfo.json index bc24d41..83b4192 100644 --- a/Menu/GameShell/50_PICO-8/compkginfo.json +++ b/Menu/GameShell/50_PICO-8/compkginfo.json @@ -4,6 +4,6 @@ "NotFoundMsg":["Please purchase the PICO-8 \n|None|varela16", "and copy it to the \"~/games/PICO-8\"|None|varela16"], -"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932"}, +"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932","pico-8_0.1.12_raspi.zip":"08eda95570e63089a2b9f5531503431e"}, "Post-Up":"bash Post-Up.sh" } From d3b508c3a12db2296542da37bdf40768424cc337 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 26 Apr 2019 14:01:36 +0800 Subject: [PATCH 04/63] fix fds leak and remove SkinMap --- sys.py/UI/fonts.py | 2 +- sys.py/UI/foot_bar.py | 6 ++++-- sys.py/UI/icon_pool.py | 4 ++-- sys.py/UI/main_screen.py | 10 ++++----- sys.py/UI/skin_manager.py | 25 ++++++++++++++++++++-- sys.py/UI/title_bar.py | 5 +++-- sys.py/UI/untitled_icon.py | 4 ++-- sys.py/UI/util_funcs.py | 21 ------------------- sys.py/config.py | 2 +- sys.py/run.py | 43 +++++++++++++++++++++++++++++++++++++- 10 files changed, 83 insertions(+), 39 deletions(-) diff --git a/sys.py/UI/fonts.py b/sys.py/UI/fonts.py index 13903e1..20c4926 100644 --- a/sys.py/UI/fonts.py +++ b/sys.py/UI/fonts.py @@ -13,7 +13,7 @@ if not pygame.font.get_init(): fonts = {} if not fonts: - skinpath = "../skin/"+config.SKIN+"/truetype" + skinpath = config.SKIN+"/truetype" fonts_path = {} fonts_path["varela"] = "%s/VarelaRound-Regular.ttf" % skinpath diff --git a/sys.py/UI/foot_bar.py b/sys.py/UI/foot_bar.py index 2e80e5e..d908e64 100644 --- a/sys.py/UI/foot_bar.py +++ b/sys.py/UI/foot_bar.py @@ -6,7 +6,7 @@ import os ##local import from constants import Width,Height,ICON_TYPES,ALIGN -from util_funcs import FileExists,midRect,SkinMap +from util_funcs import FileExists,midRect from icon_item import IconItem from fonts import fonts from multi_icon_item import MultiIconItem @@ -14,7 +14,9 @@ from icon_pool import MyIconPool from libs.roundrects import aa_round_rect from lang_manager import MyLangManager from widget import Widget -icon_base_path = SkinMap("gameshell/footbar_icons/") +from skin_manager import MySkinManager + +icon_base_path = MySkinManager.GiveIcon("gameshell/footbar_icons/") class FootBarIcon(MultiIconItem): diff --git a/sys.py/UI/icon_pool.py b/sys.py/UI/icon_pool.py index dc04b1c..256a6af 100644 --- a/sys.py/UI/icon_pool.py +++ b/sys.py/UI/icon_pool.py @@ -6,12 +6,12 @@ from sys import exit import os import sys -from util_funcs import SkinMap +from skin_manager import MySkinManager ##pool only store surfaces class IconPool(object): - _GameShellIconPath = SkinMap("gameshell/icons/") + _GameShellIconPath = MySkinManager.GiveIcon("gameshell/icons/") _Icons = {} _Sizes = {} def __init__(self): diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py index ffb96bc..50c6973 100644 --- a/sys.py/UI/main_screen.py +++ b/sys.py/UI/main_screen.py @@ -20,7 +20,7 @@ from page import Page,PageStack from title_bar import TitleBar from foot_bar import FootBar from constants import Width,Height,bg_color -from util_funcs import midRect,FileExists,ReplaceSuffix,ReadTheFileContent,CmdClean,MakeExecutable,SkinMap +from util_funcs import midRect,FileExists,ReplaceSuffix,ReadTheFileContent,CmdClean,MakeExecutable from keys_def import CurKeys from label import Label from untitled_icon import UntitledIcon @@ -469,8 +469,8 @@ class MainScreen(Widget): iconitem.AddLabel(MyLangManager.Tr(i2),self._IconFont) if FileExists( _dir+"/"+i+"/"+i2+".png"): ### 20_Prog/Prog.png , cut 20_ iconitem._ImageName = _dir+"/"+i+"/"+i2+".png" - elif FileExists( SkinMap(_dir+"/"+i2+".png") ): - iconitem._ImageName = SkinMap(_dir+"/"+i2+".png") + elif FileExists( MySkinManager.GiveIcon(_dir+"/"+i2+".png") ): + iconitem._ImageName = MySkinManager.GiveIcon(_dir+"/"+i2+".png") else: untitled = UntitledIcon() untitled.Init() @@ -577,8 +577,8 @@ class MainScreen(Widget): iconitem._CmdPath = os.path.realpath(_dir+"/"+i) MakeExecutable(iconitem._CmdPath) iconitem._MyType = ICON_TYPES["EXE"] - if FileExists( SkinMap( _dir+"/"+ReplaceSuffix(i2,"png"))): - iconitem._ImageName = SkinMap(_dir+"/"+ReplaceSuffix(i2,"png")) + if FileExists( MySkinManager.GiveIcon( _dir+"/"+ReplaceSuffix(i2,"png"))): + iconitem._ImageName = MySkinManager.GiveIcon(_dir+"/"+ReplaceSuffix(i2,"png")) else: untitled = UntitledIcon() untitled.Init() diff --git a/sys.py/UI/skin_manager.py b/sys.py/UI/skin_manager.py index 1deee6a..9cb2fc9 100644 --- a/sys.py/UI/skin_manager.py +++ b/sys.py/UI/skin_manager.py @@ -4,6 +4,8 @@ import pygame import config import ConfigParser +from util_funcs import FileExists + class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr @@ -21,7 +23,8 @@ class SkinManager(object): _Colors = {} _Config = None - + DefaultSkin = "../skin/default" + def __init__(self): self.Init() @@ -52,7 +55,7 @@ class SkinManager(object): self._Config = CaseConfigParser() - fname = "../skin/"+config.SKIN+"/config.cfg" + fname = config.SKIN+"/config.ini" try: self._Config.read(fname) @@ -78,6 +81,24 @@ class SkinManager(object): else: return pygame.Color(255,0,0) + def GiveIcon(self,orig_file_or_dir): + #doing a wrapper for items under /home/cpi/apps/Menu/*, to be like Menu/GameShell/* + if orig_file_or_dir.startswith("/home/cpi/apps/Menu"): + orig_file_or_dir = orig_file_or_dir.replace("/home/cpi/apps/Menu/","../Menu/GameShell/") + + if orig_file_or_dir.startswith(".."): + ret = orig_file_or_dir.replace("..",config.SKIN) + if FileExists(ret) == False: + ret = orig_file_or_dir.replace("..",self.DefaultSkin) + else: + ret = config.SKIN+"/sys.py/"+orig_file_or_dir + if FileExists(ret) == False: + ret = self.DefaultSkin+"/sys.py/"+orig_file_or_dir + + if FileExists( ret ): + return ret + else: ## if not existed both in default or custom skin ,return where it is + return orig_file_or_dir ##global MySkinManager Handler MySkinManager = None diff --git a/sys.py/UI/title_bar.py b/sys.py/UI/title_bar.py index 18a0514..28f88ff 100644 --- a/sys.py/UI/title_bar.py +++ b/sys.py/UI/title_bar.py @@ -18,7 +18,8 @@ from icon_item import IconItem from multi_icon_item import MultiIconItem from icon_pool import MyIconPool from lang_manager import MyLangManager -from util_funcs import midRect,SwapAndShow,SkinMap +from util_funcs import midRect,SwapAndShow +from skin_manager import MySkinManager from widget import Widget from config import Battery @@ -26,7 +27,7 @@ from libs.roundrects import aa_round_rect from libs.DBUS import is_wifi_connected_now,wifi_strength -icon_base_path = SkinMap("gameshell/titlebar_icons/") +icon_base_path = MySkinManager.GiveIcon("gameshell/titlebar_icons/") class TitleBar(Widget): _Width = Width _Height = 25 diff --git a/sys.py/UI/untitled_icon.py b/sys.py/UI/untitled_icon.py index c7f2b70..7fae615 100644 --- a/sys.py/UI/untitled_icon.py +++ b/sys.py/UI/untitled_icon.py @@ -11,12 +11,12 @@ from datetime import datetime import base64 from beeprint import pp -from util_funcs import midRect, SkinMap +from util_funcs import midRect from fonts import fonts from skin_manager import MySkinManager -BlankPng = SkinMap("gameshell/blank.png") # 80x80 +BlankPng = MySkinManager.GiveIcon("gameshell/blank.png") # 80x80 ## use blank circle as bg, Two alpha As Icon Label #Upper and Lower diff --git a/sys.py/UI/util_funcs.py b/sys.py/UI/util_funcs.py index 68262bf..3ca4f10 100644 --- a/sys.py/UI/util_funcs.py +++ b/sys.py/UI/util_funcs.py @@ -13,27 +13,6 @@ import string from Xlib import X,display import config -def SkinMap(orig_file_or_dir): - DefaultSkin = "default" - - #doing a wrapper for items under /home/cpi/apps/Menu/*, to be like Menu/GameShell/* - if orig_file_or_dir.startswith("/home/cpi/apps/Menu"): - orig_file_or_dir = orig_file_or_dir.replace("/home/cpi/apps/Menu/","../Menu/GameShell/") - - if orig_file_or_dir.startswith(".."): - ret = orig_file_or_dir.replace("..","../skin/"+config.SKIN) - if FileExists(ret) == False: - ret = orig_file_or_dir.replace("..","../skin/"+DefaultSkin) - else: - ret = "../skin/"+config.SKIN+"/sys.py/"+orig_file_or_dir - if FileExists(ret) == False: - ret = "../skin/"+DefaultSkin+"/sys.py/"+orig_file_or_dir - - if FileExists( ret ): - return ret - else: ## if not existed both in default or custom skin ,return where it is - return orig_file_or_dir - def get_git_revision_hash(): return subprocess.check_output(['git', 'rev-parse', 'HEAD']) diff --git a/sys.py/config.py b/sys.py/config.py index e5184a3..4225c11 100644 --- a/sys.py/config.py +++ b/sys.py/config.py @@ -14,7 +14,7 @@ UPDATE_URL="https://raw.githubusercontent.com/clockworkpi/CPI/master/launcher_ve VERSION="stable 1.24" -SKIN="default" +SKIN="../skin/default" ## three timer values in seconds: dim screen, close screen,PowerOff ## zero means no action diff --git a/sys.py/run.py b/sys.py/run.py index f2143a8..d53adaa 100644 --- a/sys.py/run.py +++ b/sys.py/run.py @@ -4,6 +4,9 @@ import dbus import dbus.service import sys import commands +import logging +import errno + from wicd import misc ##misc.to_bool ##misc.misc.noneToString @@ -288,7 +291,36 @@ def RecordKeyDns(thekey,main_screen): return True return False + + + +def release_self_fds(): + fds_flags= ["pipe","socket",".ttf"] + """List process currently open FDs and their target """ + if sys.platform != 'linux2': + raise NotImplementedError('Unsupported platform: %s' % sys.platform) + + ret = {} + base = '/proc/self/fd' + for num in os.listdir(base): + path = None + try: + path = os.readlink(os.path.join(base, num)) + except OSError as err: + # Last FD is always the "listdir" one (which may be closed) + if err.errno != errno.ENOENT: + raise + ret[int(num)] = path + for key in ret: + if ret[key] != None and isinstance(ret[key], str): + for i in fds_flags: + if i in ret[key]: + os.close(key) + break + return ret + + def event_process(event,main_screen): global sound_patch global everytime_keydown @@ -316,6 +348,7 @@ def event_process(event,main_screen): exec_app_cmd += event.message exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) + release_self_fds() os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd) os.chdir( GetExePath()) os.exelp("python","python"," "+myscriptname) @@ -334,6 +367,7 @@ def event_process(event,main_screen): exec_app_cmd += event.message exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) + release_self_fds() os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd) os.chdir( GetExePath()) os.exelp("python","python"," "+myscriptname) @@ -541,7 +575,14 @@ def PreparationInAdv(): if "arm" not in platform.machine(): return - + + if FileExists("%s/.gameshell_skin" % os.path.expanduser('~')) == True: + with open("%s/.gameshell_skin" % os.path.expanduser('~'),"r") as f: + gameshell_skin = f.read() + + gameshell_skin = gameshell_skin.strip() + config.SKIN= gameshell_skin + if FileExists(".powerlevel") == False: os.system("touch .powerlevel") From 25a191a4d062834c9327e41c1a162cc9e41fef57 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 26 Apr 2019 17:33:44 +0800 Subject: [PATCH 05/63] empty fonts.py --- Menu/GameShell/10_Settings/About/__init__.py | 9 ++- .../10_Settings/Airplane/__init__.py | 1 - .../10_Settings/Bluetooth/__init__.py | 7 +- .../10_Settings/Bluetooth/net_item.py | 1 - .../10_Settings/Brightness/brightness_page.py | 1 - .../10_Settings/ButtonsLayout/__init__.py | 2 - .../GameShell/10_Settings/GateWay/__init__.py | 3 +- .../10_Settings/Languages/__init__.py | 3 +- Menu/GameShell/10_Settings/Lima/__init__.py | 3 +- .../10_Settings/Notification/__init__.py | 3 +- .../10_Settings/PowerOptions/__init__.py | 3 +- .../GameShell/10_Settings/Sound/sound_page.py | 1 - .../GameShell/10_Settings/Storage/__init__.py | 7 +- Menu/GameShell/10_Settings/Time/list_item.py | 1 - .../Time/timezone_lib_list_page.py | 7 +- Menu/GameShell/10_Settings/Update/__init__.py | 5 +- Menu/GameShell/10_Settings/Wifi/net_item.py | 1 - Menu/GameShell/10_Settings/Wifi/wifi_list.py | 5 +- Menu/GameShell/10_Settings/list_item.py | 1 - Menu/GameShell/10_Settings/list_page.py | 1 - Menu/GameShell/97_Music Player/list_item.py | 1 - .../97_Music Player/mpd_spectrum_page.py | 6 +- .../97_Music Player/music_lib_list_page.py | 3 +- .../97_Music Player/play_list_page.py | 3 +- Menu/GameShell/98_TinyCloud/__init__.py | 3 +- .../UI/CommercialSoftwarePackage/__init__.py | 1 - sys.py/UI/Emulator/fav_list_page.py | 3 +- sys.py/UI/Emulator/list_item.py | 1 - sys.py/UI/Emulator/rom_list_page.py | 3 +- sys.py/UI/Emulator/rom_so_confirm_page.py | 1 - sys.py/UI/above_all_patch.py | 4 +- sys.py/UI/confirm_page.py | 1 - sys.py/UI/counter_screen.py | 9 +-- sys.py/UI/delete_confirm_page.py | 1 - sys.py/UI/download_process_page.py | 1 - sys.py/UI/fonts.py | 65 ------------------- sys.py/UI/foot_bar.py | 1 - sys.py/UI/keyboard.py | 5 +- sys.py/UI/lang_manager.py | 6 +- sys.py/UI/skin_manager.py | 36 ++++++++++ sys.py/UI/text_bulletinboard.py | 1 - sys.py/UI/textarea.py | 4 +- sys.py/UI/title_bar.py | 6 +- sys.py/UI/untitled_icon.py | 3 +- 44 files changed, 84 insertions(+), 149 deletions(-) diff --git a/Menu/GameShell/10_Settings/About/__init__.py b/Menu/GameShell/10_Settings/About/__init__.py index 94e0821..30cafc1 100644 --- a/Menu/GameShell/10_Settings/About/__init__.py +++ b/Menu/GameShell/10_Settings/About/__init__.py @@ -12,15 +12,14 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyMenuOrB from UI.scroller import ListScroller from UI.icon_pool import MyIconPool from UI.icon_item import IconItem from UI.multilabel import MultiLabel - - +from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager class InfoPageListItem(object): _PosX = 0 @@ -79,7 +78,7 @@ class InfoPageListItem(object): class AboutPage(Page): _FootMsg = ["Nav.","","","Back",""] _MyList = [] - _ListFontObj = fonts["varela13"] + _ListFontObj = MyLangManager.TrFont("varela13") _AList = {} @@ -229,7 +228,7 @@ class AboutPage(Page): li._PosY = start_y + last_height li._Width = Width li._Fonts["normal"] = self._ListFontObj - li._Fonts["small"] = fonts["varela12"] + li._Fonts["small"] = MySkinManager.GiveFont("varela12") if self._AList[u]["label"] != "": li.Init( self._AList[u]["label"] ) diff --git a/Menu/GameShell/10_Settings/Airplane/__init__.py b/Menu/GameShell/10_Settings/Airplane/__init__.py index 917a7c1..f2a11a8 100644 --- a/Menu/GameShell/10_Settings/Airplane/__init__.py +++ b/Menu/GameShell/10_Settings/Airplane/__init__.py @@ -12,7 +12,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller diff --git a/Menu/GameShell/10_Settings/Bluetooth/__init__.py b/Menu/GameShell/10_Settings/Bluetooth/__init__.py index 2c3b5ac..4a943ab 100644 --- a/Menu/GameShell/10_Settings/Bluetooth/__init__.py +++ b/Menu/GameShell/10_Settings/Bluetooth/__init__.py @@ -15,7 +15,6 @@ from libs.DBUS import bus, adapter,devices from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller @@ -100,8 +99,8 @@ class BleInfoPage(Page): _FootMsg = ["Nav","Forget","Disconnect","Back",""] _MyList = [] _ListFontObj = MyLangManager.TrFont("varela15") - _ListSmFontObj = fonts["varela12"] # small font - _ListSm2FontObj= fonts["varela11"] + _ListSmFontObj = MySkinManager.GiveFont("varela12") # small font + _ListSm2FontObj= MySkinManager.GiveFont("varela11") _AList = {} _Path = "" @@ -380,7 +379,7 @@ class BluetoothPage(Page): _LastStatusMsg = "" _FootMsg = ["Nav","Info","Scan","Back","TryConnect"] _Scroller = None - _ListFontObj = fonts["notosanscjk15"] + _ListFontObj = MyLangManager.TrFont("notosanscjk15") _InfoPage = None diff --git a/Menu/GameShell/10_Settings/Bluetooth/net_item.py b/Menu/GameShell/10_Settings/Bluetooth/net_item.py index c3d173d..a9aa511 100644 --- a/Menu/GameShell/10_Settings/Bluetooth/net_item.py +++ b/Menu/GameShell/10_Settings/Bluetooth/net_item.py @@ -5,7 +5,6 @@ import pygame ## local UI import from UI.page import Page from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.multi_icon_item import MultiIconItem from UI.icon_pool import MyIconPool diff --git a/Menu/GameShell/10_Settings/Brightness/brightness_page.py b/Menu/GameShell/10_Settings/Brightness/brightness_page.py index 7912acc..7494ff8 100644 --- a/Menu/GameShell/10_Settings/Brightness/brightness_page.py +++ b/Menu/GameShell/10_Settings/Brightness/brightness_page.py @@ -10,7 +10,6 @@ from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label from UI.icon_item import IconItem -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyMenuOrB from UI.slider import Slider diff --git a/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py index 7add4a9..53a09f3 100644 --- a/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py +++ b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py @@ -9,7 +9,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, GetButtonsLayoutMode, SetButtonsLayoutMode, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller @@ -117,7 +116,6 @@ class UpdateConfirmPage(ConfirmPage): class ButtonsLayoutPage(Page): _FootMsg = ["Nav.","","UpdateRetroArch","Back","Toggle"] _MyList = [] - _ListFontObj = fonts["varela13"] _AList = {} diff --git a/Menu/GameShell/10_Settings/GateWay/__init__.py b/Menu/GameShell/10_Settings/GateWay/__init__.py index df66c1b..0c83c80 100644 --- a/Menu/GameShell/10_Settings/GateWay/__init__.py +++ b/Menu/GameShell/10_Settings/GateWay/__init__.py @@ -11,7 +11,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES,RESTARTUI from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect,FileExists from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller @@ -78,7 +77,7 @@ class PageListItem(InfoPageListItem): class GateWayPage(Page): _FootMsg = ["Nav","Clear All","","Back","Select"] _MyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.TrFont("notosanscjk15") _AList = {} diff --git a/Menu/GameShell/10_Settings/Languages/__init__.py b/Menu/GameShell/10_Settings/Languages/__init__.py index 556327a..a6cc2b1 100644 --- a/Menu/GameShell/10_Settings/Languages/__init__.py +++ b/Menu/GameShell/10_Settings/Languages/__init__.py @@ -11,7 +11,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES,RESTARTUI from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller @@ -77,7 +76,7 @@ class PageListItem(InfoPageListItem): class LanguagesPage(Page): _FootMsg = ["Nav","","","Back","Select"] _MyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.TrFont("notosanscjk15") _AList = {} diff --git a/Menu/GameShell/10_Settings/Lima/__init__.py b/Menu/GameShell/10_Settings/Lima/__init__.py index 0dcba13..b0a15d2 100644 --- a/Menu/GameShell/10_Settings/Lima/__init__.py +++ b/Menu/GameShell/10_Settings/Lima/__init__.py @@ -11,7 +11,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES,RESTARTUI from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect,FileExists from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller @@ -77,7 +76,7 @@ class PageListItem(InfoPageListItem): class GPUDriverPage(Page): _FootMsg = ["Nav","","","Back","Select"] _MyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.TrFont("notosanscjk15") _AList = {} diff --git a/Menu/GameShell/10_Settings/Notification/__init__.py b/Menu/GameShell/10_Settings/Notification/__init__.py index 30971d4..e5cb530 100644 --- a/Menu/GameShell/10_Settings/Notification/__init__.py +++ b/Menu/GameShell/10_Settings/Notification/__init__.py @@ -15,7 +15,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect,FileExists,IsExecutable from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller @@ -126,7 +125,7 @@ class NotificationPage(Page): li._PosY = start_y + counter*InfoPageListItem._Height li._Width = Width-10 li._Fonts["normal"] = self._ListFontObj - li._Fonts["small"] = fonts["varela12"] + li._Fonts["small"] = MySkinManager.GiveFont("varela12") if IsExecutable(v): li._ReadOnly = True diff --git a/Menu/GameShell/10_Settings/PowerOptions/__init__.py b/Menu/GameShell/10_Settings/PowerOptions/__init__.py index b04442f..b92cce9 100644 --- a/Menu/GameShell/10_Settings/PowerOptions/__init__.py +++ b/Menu/GameShell/10_Settings/PowerOptions/__init__.py @@ -12,7 +12,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES,POWEROPT from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller @@ -292,7 +291,7 @@ class InfoPage(Page): class PowerOptionsPage(Page): _FootMsg = ["Nav","Detail","","Back","Select"] _MyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.TrFont("notosanscjk15") _AList = {} diff --git a/Menu/GameShell/10_Settings/Sound/sound_page.py b/Menu/GameShell/10_Settings/Sound/sound_page.py index 06d8ebb..fd18b9c 100644 --- a/Menu/GameShell/10_Settings/Sound/sound_page.py +++ b/Menu/GameShell/10_Settings/Sound/sound_page.py @@ -11,7 +11,6 @@ from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.icon_item import IconItem from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyMenuOrB from UI.slider import Slider diff --git a/Menu/GameShell/10_Settings/Storage/__init__.py b/Menu/GameShell/10_Settings/Storage/__init__.py index 7a9aeea..0cd306a 100644 --- a/Menu/GameShell/10_Settings/Storage/__init__.py +++ b/Menu/GameShell/10_Settings/Storage/__init__.py @@ -11,7 +11,6 @@ from UI.constants import ICON_TYPES,Width,Height from UI.icon_item import IconItem from UI.icon_pool import MyIconPool from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from libs.roundrects import aa_round_rect @@ -59,7 +58,7 @@ class StoragePage(Page): self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self - self._BGpng.AddLabel(self._BGmsg % (self._DskUsg[1]-self._DskUsg[0], self._DskUsg[1]), fonts["varela15"]) + self._BGpng.AddLabel(self._BGmsg % (self._DskUsg[1]-self._DskUsg[0], self._DskUsg[1]), MySkinManager.GiveFont("varela15")) self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) @@ -68,12 +67,12 @@ class StoragePage(Page): usage_percent = (self._DskUsg[0]/self._DskUsg[1] )*100.0 - self._BGlabel.Init("%d%%"% int(usage_percent),fonts["varela25"]) + self._BGlabel.Init("%d%%"% int(usage_percent),MySkinManager.GiveFont("varela25")) self._BGlabel.SetColor( self._HighColor ) self._FreeLabel = Label() self._FreeLabel.SetCanvasHWND(self._CanvasHWND) - self._FreeLabel.Init("Free",fonts["varela13"]) + self._FreeLabel.Init("Free",MySkinManager.GiveFont("varela13")) self._FreeLabel.SetColor(self._BGlabel._Color) diff --git a/Menu/GameShell/10_Settings/Time/list_item.py b/Menu/GameShell/10_Settings/Time/list_item.py index 6de8281..7463b0f 100644 --- a/Menu/GameShell/10_Settings/Time/list_item.py +++ b/Menu/GameShell/10_Settings/Time/list_item.py @@ -7,7 +7,6 @@ from libs.roundrects import aa_round_rect from UI.constants import ICON_TYPES from UI.page import Page from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.util_funcs import midRect from UI.skin_manager import MySkinManager diff --git a/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py b/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py index 35dacd4..f4f9a87 100644 --- a/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py +++ b/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py @@ -10,7 +10,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB @@ -18,7 +17,7 @@ from UI.multi_icon_item import MultiIconItem from UI.icon_pool import MyIconPool from UI.scroller import ListScroller from UI.skin_manager import MySkinManager - +from UI.lang_manager import MyLangManager from list_item import ListItem @@ -86,7 +85,7 @@ class TimezoneListPage(Page): _FootMsg = ["Nav","","","Back","Select"] _MyList = [] _SwapMyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.TrFont("notosanscjk15") _MyStack = None _Scroller = None @@ -189,7 +188,7 @@ class TimezoneListPage(Page): self._BGpng._ImgSurf = MyIconPool._Icons["empty"] self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self - self._BGpng.AddLabel("No timezones found on system!", fonts["varela22"]) + self._BGpng.AddLabel("No timezones found on system!", MyLangManager.TrFont("varela22")) self._BGpng.SetLableColor(MySkinManager.GiveColor('Disabled')) self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) diff --git a/Menu/GameShell/10_Settings/Update/__init__.py b/Menu/GameShell/10_Settings/Update/__init__.py index 96e77e0..9058dba 100644 --- a/Menu/GameShell/10_Settings/Update/__init__.py +++ b/Menu/GameShell/10_Settings/Update/__init__.py @@ -13,7 +13,6 @@ from UI.constants import ICON_TYPES,Width,Height,RUNEVT,RUNSH from UI.icon_item import IconItem from UI.icon_pool import MyIconPool from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect,CmdClean,get_git_revision_short_hash from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.confirm_page import ConfirmPage @@ -157,7 +156,7 @@ class UpdatePage(Page): _Icons = {} _FootMsg = ["Nav","","Check Update","Back",""] - _ListFontObj = fonts["varela15"] + _ListFontObj = MyLangManager.TrFont("varela15") _ConfirmPage = None _AList = {} _MyList = [] @@ -177,7 +176,7 @@ class UpdatePage(Page): li._PosY = start_y + i*InfoPageListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFontObj - li._Fonts["small"] = fonts["varela12"] + li._Fonts["small"] = MySkinManager.GiveFont("varela12") if self._AList[v]["label"] != "": li.Init( self._AList[v]["label"] ) diff --git a/Menu/GameShell/10_Settings/Wifi/net_item.py b/Menu/GameShell/10_Settings/Wifi/net_item.py index 9888852..dc4ba88 100644 --- a/Menu/GameShell/10_Settings/Wifi/net_item.py +++ b/Menu/GameShell/10_Settings/Wifi/net_item.py @@ -5,7 +5,6 @@ import pygame ## local UI import from UI.page import Page from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.multi_icon_item import MultiIconItem from UI.icon_pool import MyIconPool diff --git a/Menu/GameShell/10_Settings/Wifi/wifi_list.py b/Menu/GameShell/10_Settings/Wifi/wifi_list.py index 433ff1b..fa042ae 100644 --- a/Menu/GameShell/10_Settings/Wifi/wifi_list.py +++ b/Menu/GameShell/10_Settings/Wifi/wifi_list.py @@ -10,7 +10,6 @@ from wicd import misc from UI.constants import Width,Height from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect,SwapAndShow from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller @@ -94,7 +93,7 @@ class WifiInfoPage(Page): li._PosY = start_y + i*InfoPageListItem._Height li._Width = Width li._Fonts["normal"] = self._ListFontObj - li._Fonts["small"] = fonts["varela12"] + li._Fonts["small"] = MyLangManager.TrFont("varela12") if self._AList[v]["label"] != "": li.Init( self._AList[v]["label"] ) @@ -267,7 +266,7 @@ class WifiList(Page): _FootMsg = ["Nav","Info","Scan","Back","Enter"] _EncMethods = None _Scroller = None - _ListFontObj = fonts["notosanscjk15"] + _ListFontObj = MyLangManager.TrFont("notosanscjk15") _InfoPage = None _CurBssid = "" diff --git a/Menu/GameShell/10_Settings/list_item.py b/Menu/GameShell/10_Settings/list_item.py index d0dcb23..52f83ca 100644 --- a/Menu/GameShell/10_Settings/list_item.py +++ b/Menu/GameShell/10_Settings/list_item.py @@ -7,7 +7,6 @@ import pygame ## local UI import from UI.page import Page from UI.label import Label -from UI.fonts import fonts from UI.lang_manager import MyLangManager # a item for List # - - - - - - - - - - - -- diff --git a/Menu/GameShell/10_Settings/list_page.py b/Menu/GameShell/10_Settings/list_page.py index e126587..5b222ca 100644 --- a/Menu/GameShell/10_Settings/list_page.py +++ b/Menu/GameShell/10_Settings/list_page.py @@ -9,7 +9,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect,FileExists from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller diff --git a/Menu/GameShell/97_Music Player/list_item.py b/Menu/GameShell/97_Music Player/list_item.py index 186201a..23ba788 100644 --- a/Menu/GameShell/97_Music Player/list_item.py +++ b/Menu/GameShell/97_Music Player/list_item.py @@ -7,7 +7,6 @@ from libs.roundrects import aa_round_rect from UI.constants import ICON_TYPES from UI.page import Page from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.util_funcs import midRect from UI.skin_manager import MySkinManager diff --git a/Menu/GameShell/97_Music Player/mpd_spectrum_page.py b/Menu/GameShell/97_Music Player/mpd_spectrum_page.py index 6429193..fbd5e9c 100644 --- a/Menu/GameShell/97_Music Player/mpd_spectrum_page.py +++ b/Menu/GameShell/97_Music Player/mpd_spectrum_page.py @@ -15,12 +15,12 @@ from beeprint import pp from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.icon_item import IconItem from UI.icon_pool import MyIconPool from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager from threading import Thread @@ -79,8 +79,8 @@ class MPDSpectrumPage(Page): _Selector=None _FootMsg = ["Nav","","","Back",""] _MyList = [] - _ListFont = fonts["veramono12"] - _SongFont = fonts["notosanscjk12"] + _ListFont = MyLangManager.TrFont("veramono12") + _SongFont = MyLangManager.TrFont("notosanscjk12") _PIFI = None _FIFO = None _Color = MySkinManager.GiveColor('Front') diff --git a/Menu/GameShell/97_Music Player/music_lib_list_page.py b/Menu/GameShell/97_Music Player/music_lib_list_page.py index 6d821e0..5bcc1b4 100644 --- a/Menu/GameShell/97_Music Player/music_lib_list_page.py +++ b/Menu/GameShell/97_Music Player/music_lib_list_page.py @@ -8,7 +8,6 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB @@ -85,7 +84,7 @@ class MusicLibListPage(Page): _FootMsg = ["Nav","","Scan","Back","Add to Playlist"] _MyList = [] _SwapMyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.TrFont("notosanscjk15") _MyStack = None _Scroller = None diff --git a/Menu/GameShell/97_Music Player/play_list_page.py b/Menu/GameShell/97_Music Player/play_list_page.py index e88346e..4cc6a4e 100644 --- a/Menu/GameShell/97_Music Player/play_list_page.py +++ b/Menu/GameShell/97_Music Player/play_list_page.py @@ -10,7 +10,6 @@ from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.icon_item import IconItem from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.icon_pool import MyIconPool @@ -63,7 +62,7 @@ class PlayListPage(Page): _Selector=None _FootMsg = ["Nav","Remove","RTA","Back","Play/Pause"] _MyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.TrFont("notosanscjk15") _Scroller = None _CurSongTime="0:0" diff --git a/Menu/GameShell/98_TinyCloud/__init__.py b/Menu/GameShell/98_TinyCloud/__init__.py index 767b104..46c8d69 100644 --- a/Menu/GameShell/98_TinyCloud/__init__.py +++ b/Menu/GameShell/98_TinyCloud/__init__.py @@ -6,7 +6,6 @@ from UI.constants import Width,Height,ICON_TYPES from UI.simple_name_space import SimpleNamespace from UI.page import Page from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.icon_pool import MyIconPool from UI.keys_def import CurKeys, IsKeyMenuOrB @@ -19,7 +18,7 @@ class TinyCloudPage(Page): _FootMsg = ["Nav","","","Back",""] _MyList = [] - _ListFontObj = fonts["varela13"] + _ListFontObj = MyLangManager.TrFont("varela13") _AList = {} _Labels = {} diff --git a/sys.py/UI/CommercialSoftwarePackage/__init__.py b/sys.py/UI/CommercialSoftwarePackage/__init__.py index eb33084..484dffa 100644 --- a/sys.py/UI/CommercialSoftwarePackage/__init__.py +++ b/sys.py/UI/CommercialSoftwarePackage/__init__.py @@ -27,7 +27,6 @@ from UI.constants import Width,Height,ICON_TYPES,RUNEVT,RESTARTUI #from UI.simple_name_space import SimpleNamespace from UI.page import Page from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.icon_pool import MyIconPool from UI.keys_def import CurKeys diff --git a/sys.py/UI/Emulator/fav_list_page.py b/sys.py/UI/Emulator/fav_list_page.py index f20735a..dc3f7d8 100644 --- a/sys.py/UI/Emulator/fav_list_page.py +++ b/sys.py/UI/Emulator/fav_list_page.py @@ -11,7 +11,6 @@ from UI.constants import Width,Height,ICON_TYPES,RUNEVT from UI.page import Page,PageSelector from UI.label import Label from UI.icon_item import IconItem -from UI.fonts import fonts from UI.util_funcs import midRect,CmdClean,FileExists from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.multi_icon_item import MultiIconItem @@ -94,7 +93,7 @@ class FavListPage(Page): _Selector=None _FootMsg = ["Nav","Remove","Scan","","Run"] _MyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.TrFont("notosanscjk15") _MyStack = None _Emulator = None _Parent = None diff --git a/sys.py/UI/Emulator/list_item.py b/sys.py/UI/Emulator/list_item.py index e46df36..adc4886 100644 --- a/sys.py/UI/Emulator/list_item.py +++ b/sys.py/UI/Emulator/list_item.py @@ -8,7 +8,6 @@ import os from UI.constants import ICON_TYPES from UI.page import Page from UI.label import Label -from UI.fonts import fonts from UI.icon_item import IconItem from UI.util_funcs import midRect from UI.skin_manager import MySkinManager diff --git a/sys.py/UI/Emulator/rom_list_page.py b/sys.py/UI/Emulator/rom_list_page.py index fa89d06..ef5a4a0 100644 --- a/sys.py/UI/Emulator/rom_list_page.py +++ b/sys.py/UI/Emulator/rom_list_page.py @@ -18,7 +18,6 @@ from UI.constants import Width,Height,ICON_TYPES,RUNEVT from UI.page import Page,PageSelector from UI.label import Label from UI.icon_item import IconItem -from UI.fonts import fonts from UI.util_funcs import midRect,CmdClean,FileExists from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.multi_icon_item import MultiIconItem @@ -101,7 +100,7 @@ class RomListPage(Page): _Selector=None _FootMsg = ["Nav","Del","Scan","Back","Run","AddFav"] _MyList = [] - _ListFont = fonts["notosanscjk15"] + _ListFont = MyLangManager.Tr("notosanscjk15") _MyStack = None _Emulator = None _Parent = None diff --git a/sys.py/UI/Emulator/rom_so_confirm_page.py b/sys.py/UI/Emulator/rom_so_confirm_page.py index 43af7dd..34db516 100644 --- a/sys.py/UI/Emulator/rom_so_confirm_page.py +++ b/sys.py/UI/Emulator/rom_so_confirm_page.py @@ -15,7 +15,6 @@ from libs.roundrects import aa_round_rect from UI.confirm_page import ConfirmPage from UI.download_process_page import DownloadProcessPage from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB -from UI.fonts import fonts from UI.multilabel import MultiLabel from UI.lang_manager import MyLangManager diff --git a/sys.py/UI/above_all_patch.py b/sys.py/UI/above_all_patch.py index 0a28f69..fee6853 100644 --- a/sys.py/UI/above_all_patch.py +++ b/sys.py/UI/above_all_patch.py @@ -14,10 +14,10 @@ from title_bar import TitleBar from foot_bar import FootBar from constants import Width,Height,bg_color from util_funcs import midRect -from fonts import fonts from keys_def import CurKeys from label import Label from skin_manager import MySkinManager +from lang_manager import MyLangManager from widget import Widget @@ -28,7 +28,7 @@ class AboveAllPatch(Widget): _Height=120 _Text ="" - _FontObj=fonts["veramono20"] + _FontObj= MyLangManager.TrFont("veramono20") _Parent =None _Color = MySkinManager.GiveColor('Text') _ValColor = MySkinManager.GiveColor('URL') diff --git a/sys.py/UI/confirm_page.py b/sys.py/UI/confirm_page.py index d932510..56e2ba0 100644 --- a/sys.py/UI/confirm_page.py +++ b/sys.py/UI/confirm_page.py @@ -9,7 +9,6 @@ from libs.roundrects import aa_round_rect from constants import Width,Height,ICON_TYPES from page import Page,PageSelector from label import Label -from fonts import fonts from util_funcs import midRect from keys_def import CurKeys from skin_manager import MySkinManager diff --git a/sys.py/UI/counter_screen.py b/sys.py/UI/counter_screen.py index b7a3928..36bcd69 100644 --- a/sys.py/UI/counter_screen.py +++ b/sys.py/UI/counter_screen.py @@ -6,17 +6,18 @@ import commands ## local package import from constants import Width,Height,RUNSYS from label import Label -from fonts import fonts + from full_screen import FullScreen from skin_manager import MySkinManager +from lang_manager import MyLangManager import config class CounterScreen(FullScreen): - _CounterFont = fonts["varela120"] - _TextFont1 = fonts["varela15"] - _TextFont2 = fonts["varela12"] + _CounterFont = MyLangManager.TrFont("varela120") + _TextFont1 = MyLangManager.TrFont("varela15") + _TextFont2 = MyLangManager.TrFont("varela12") _TopLabel = None _BottomLabel = None diff --git a/sys.py/UI/delete_confirm_page.py b/sys.py/UI/delete_confirm_page.py index b8167fa..177977a 100644 --- a/sys.py/UI/delete_confirm_page.py +++ b/sys.py/UI/delete_confirm_page.py @@ -9,7 +9,6 @@ import shutil from constants import Width,Height,ICON_TYPES from page import Page,PageSelector from label import Label -from fonts import fonts from util_funcs import midRect from keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from confirm_page import ConfirmPage diff --git a/sys.py/UI/download_process_page.py b/sys.py/UI/download_process_page.py index db94c05..c1bfc43 100644 --- a/sys.py/UI/download_process_page.py +++ b/sys.py/UI/download_process_page.py @@ -13,7 +13,6 @@ from UI.constants import Width,Height,ICON_TYPES,RUNEVT from UI.page import Page,PageSelector from UI.label import Label from UI.icon_item import IconItem -from UI.fonts import fonts from UI.util_funcs import midRect,CmdClean,FileExists from UI.keys_def import CurKeys, IsKeyMenuOrB from UI.multi_icon_item import MultiIconItem diff --git a/sys.py/UI/fonts.py b/sys.py/UI/fonts.py index 20c4926..555c783 100644 --- a/sys.py/UI/fonts.py +++ b/sys.py/UI/fonts.py @@ -1,67 +1,2 @@ # -*- coding: utf-8 -*- -import pygame -from pygame.locals import * -from sys import exit -import os -import sys - -import config - -if not pygame.font.get_init(): - pygame.font.init() - -fonts = {} -if not fonts: - skinpath = config.SKIN+"/truetype" - fonts_path = {} - - fonts_path["varela"] = "%s/VarelaRound-Regular.ttf" % skinpath - fonts_path["veramono"] = "%s/VeraMono.ttf" % skinpath - fonts_path["noto"] = "%s/NotoSansMono-Regular.ttf" % skinpath - fonts_path["notocjk"] = "%s/NotoSansCJK-Regular.ttf" % skinpath - - fonts["varela10"] = pygame.font.Font(fonts_path["varela"],10) - fonts["varela11"] = pygame.font.Font(fonts_path["varela"],11) - fonts["varela12"] = pygame.font.Font(fonts_path["varela"],12) - fonts["varela13"] = pygame.font.Font(fonts_path["varela"],13) - fonts["varela14"] = pygame.font.Font(fonts_path["varela"],14) - fonts["varela15"] = pygame.font.Font(fonts_path["varela"],15) - - fonts["varela16"] = pygame.font.Font(fonts_path["varela"],16) - fonts["varela18"] = pygame.font.Font(fonts_path["varela"],18) - fonts["varela20"] = pygame.font.Font(fonts_path["varela"],20) - fonts["varela22"] = pygame.font.Font(fonts_path["varela"],22) - fonts["varela23"] = pygame.font.Font(fonts_path["varela"],23) - fonts["varela24"] = pygame.font.Font(fonts_path["varela"],24) - fonts["varela25"] = pygame.font.Font(fonts_path["varela"],25) - fonts["varela26"] = pygame.font.Font(fonts_path["varela"],26) - fonts["varela27"] = pygame.font.Font(fonts_path["varela"],27) - fonts["varela28"] = pygame.font.Font(fonts_path["varela"],28) - fonts["varela34"] = pygame.font.Font(fonts_path["varela"],34) - fonts["varela40"] = pygame.font.Font(fonts_path["varela"],40) - fonts["varela120"] = pygame.font.Font(fonts_path["varela"],120) - - fonts["veramono25"] = pygame.font.Font(fonts_path["veramono"],25) - fonts["veramono24"] = pygame.font.Font(fonts_path["veramono"],24) - fonts["veramono23"] = pygame.font.Font(fonts_path["veramono"],23) - fonts["veramono22"] = pygame.font.Font(fonts_path["veramono"],22) - fonts["veramono21"] = pygame.font.Font(fonts_path["veramono"],21) - fonts["veramono20"] = pygame.font.Font(fonts_path["veramono"],20) - fonts["veramono18"] = pygame.font.Font(fonts_path["veramono"],18) - fonts["veramono16"] = pygame.font.Font(fonts_path["veramono"],16) - fonts["veramono15"] = pygame.font.Font(fonts_path["veramono"],15) - fonts["veramono14"] = pygame.font.Font(fonts_path["veramono"],14) - fonts["veramono13"] = pygame.font.Font(fonts_path["veramono"],13) - fonts["veramono12"] = pygame.font.Font(fonts_path["veramono"],12) - fonts["veramono11"] = pygame.font.Font(fonts_path["veramono"],11) - fonts["veramono10"] = pygame.font.Font(fonts_path["veramono"],10) - - for i in range(10,28): - fonts["notosansmono"+str(i)] = pygame.font.Font(fonts_path["noto"],i) - - for i in range(10,28): - fonts["notosanscjk"+str(i)] = pygame.font.Font(fonts_path["notocjk"],i) - - fonts["arial"] = pygame.font.SysFont("arial",16) - diff --git a/sys.py/UI/foot_bar.py b/sys.py/UI/foot_bar.py index d908e64..1a8f53c 100644 --- a/sys.py/UI/foot_bar.py +++ b/sys.py/UI/foot_bar.py @@ -8,7 +8,6 @@ import os from constants import Width,Height,ICON_TYPES,ALIGN from util_funcs import FileExists,midRect from icon_item import IconItem -from fonts import fonts from multi_icon_item import MultiIconItem from icon_pool import MyIconPool from libs.roundrects import aa_round_rect diff --git a/sys.py/UI/keyboard.py b/sys.py/UI/keyboard.py index 6bc2027..bd71987 100644 --- a/sys.py/UI/keyboard.py +++ b/sys.py/UI/keyboard.py @@ -8,7 +8,6 @@ from libs import easing from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.util_funcs import midRect from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.icon_item import IconItem @@ -108,7 +107,7 @@ class Keyboard(Page): self._Width = self._Screen._Width self._Height = self._Screen._Height - fontobj = fonts["veramono24"] + fontobj = MySkinManager.GiveFont("veramono24") word_margin = 15 start_x = (self._Width - fontobj.size( "".join(self._Secs[0][0]))[0]-len(self._Secs[0][0])*word_margin)/2+word_margin/2 @@ -141,7 +140,7 @@ class Keyboard(Page): else: if val == "_S": val = "Space" - ti._FontObj = fonts["veramono15"] + ti._FontObj = MySkinManager.GiveFont("veramono15") ti._Bold = True cur_alpha_size = ti._FontObj.size( val) diff --git a/sys.py/UI/lang_manager.py b/sys.py/UI/lang_manager.py index 5a027e7..f2b86f2 100644 --- a/sys.py/UI/lang_manager.py +++ b/sys.py/UI/lang_manager.py @@ -3,8 +3,8 @@ import os import pygame import config import ConfigParser +from skin_manager import MySkinManager from util_funcs import FileExists -from fonts import fonts class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): @@ -97,12 +97,12 @@ class LangManager(object): raise Exception('font string format error') if "English.ini" in self._ConfigFileName: - return fonts[orig_font_str] + return MySkinManager.GiveFont(orig_font_str) else: if font_size_number > 28: raise Exception('cjk font string format error '+ str(font_size_number)) - return fonts["notosanscjk"+str(font_size_number)] + return MySkinManager.GiveFont("notosanscjk%d" % font_size_number) ##global MyLangManager Handler MyLangManager = None diff --git a/sys.py/UI/skin_manager.py b/sys.py/UI/skin_manager.py index 9cb2fc9..c0cbdb0 100644 --- a/sys.py/UI/skin_manager.py +++ b/sys.py/UI/skin_manager.py @@ -23,6 +23,7 @@ class SkinManager(object): _Colors = {} _Config = None + _Fonts = {} DefaultSkin = "../skin/default" def __init__(self): @@ -36,7 +37,39 @@ class SkinManager(object): def Init(self): if not SkinManager._Colors: self.SetColors() + if not SkinManager._Fonts: + self.SetFonts() + + def SetFonts(self): + if not pygame.font.get_init(): + pygame.font.init() + + skinpath = config.SKIN+"/truetype" + fonts_path = {} + fonts_path["varela"] = "%s/VarelaRound-Regular.ttf" % skinpath + print(fonts_path["varela"]) + fonts_path["veramono"] = "%s/VeraMono.ttf" % skinpath + fonts_path["noto"] = "%s/NotoSansMono-Regular.ttf" % skinpath + fonts_path["notocjk"] = "%s/NotoSansCJK-Regular.ttf" % skinpath + + for i in range(10,29): + self._Fonts["varela%d"%i] = pygame.font.Font(fonts_path["varela"],i) + + self._Fonts["varela34"] = pygame.font.Font(fonts_path["varela"],34) + self._Fonts["varela40"] = pygame.font.Font(fonts_path["varela"],40) + self._Fonts["varela120"] = pygame.font.Font(fonts_path["varela"],120) + + for i in range(10,26): + self._Fonts["veramono%d"%i] = pygame.font.Font(fonts_path["veramono"],i) + + for i in range(10,28): + self._Fonts["notosansmono%d"%i] = pygame.font.Font(fonts_path["noto"],i) + for i in range(10,28): + self._Fonts["notosanscjk%d"%i] = pygame.font.Font(fonts_path["notocjk"],i) + + self._Fonts["arial"] = pygame.font.SysFont("arial",16) + def SetColors(self): Colors = {} Colors["High"] = pygame.Color(51, 166, 255) @@ -75,6 +108,9 @@ class SkinManager(object): print("error in ConvertToRGB %s" % str(e)) continue + def GiveFont(self,name): + return SkinManager._Fonts[name] + def GiveColor(self,name): if name in SkinManager._Colors: return SkinManager._Colors[name] diff --git a/sys.py/UI/text_bulletinboard.py b/sys.py/UI/text_bulletinboard.py index 408d840..52f9c86 100644 --- a/sys.py/UI/text_bulletinboard.py +++ b/sys.py/UI/text_bulletinboard.py @@ -6,7 +6,6 @@ from libs.roundrects import aa_round_rect ## local UI import from page import Page,PageStack,PageSelector from label import Label -from fonts import fonts from skin_manager import MySkinManager from lang_manager import MyLangManager from widget import Widget diff --git a/sys.py/UI/textarea.py b/sys.py/UI/textarea.py index 7b96fd1..5708223 100644 --- a/sys.py/UI/textarea.py +++ b/sys.py/UI/textarea.py @@ -6,8 +6,8 @@ from libs.roundrects import aa_round_rect ## local UI import from UI.page import Page,PageStack,PageSelector from UI.label import Label -from UI.fonts import fonts from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager from UI.widget import Widget class Textarea(Widget): @@ -26,7 +26,7 @@ class Textarea(Widget): pass def Init(self): - self._FontObj = fonts["veramono24"] + self._FontObj = MyLangManager.TrFont("veramono24") #pygame.font.Font(fonts_path["veramono"],24) def SubTextIndex(self): diff --git a/sys.py/UI/title_bar.py b/sys.py/UI/title_bar.py index 28f88ff..2f27b89 100644 --- a/sys.py/UI/title_bar.py +++ b/sys.py/UI/title_bar.py @@ -13,7 +13,6 @@ import alsaaudio ##local import from constants import ICON_TYPES,Width,Height -from fonts import fonts from icon_item import IconItem from multi_icon_item import MultiIconItem from icon_pool import MyIconPool @@ -300,13 +299,14 @@ class TitleBar(Widget): self._Title = title cur_time = datetime.now().strftime("%H:%M") - time_text_size = fonts["varela12"].size(cur_time) + time_text_font = MySkinManager.GiveFont("varela12") + time_text_size = time_text_font.size(cur_time) title_text_size = MyLangManager.TrFont("varela16").size(title) self._CanvasHWND.blit(MyLangManager.TrFont("varela16").render(title,True,self._SkinManager.GiveColor("Text")),midRect(title_text_size[0]/2+self._LOffset, title_text_size[1]/2+(self._BarHeight-title_text_size[1])/2, title_text_size[0],title_text_size[1],Width,Height)) - self._CanvasHWND.blit( fonts["varela12"].render(cur_time,True,self._SkinManager.GiveColor("Text")),midRect(Width-time_text_size[0]/2-self._ROffset, + self._CanvasHWND.blit( time_text_font.render(cur_time,True,self._SkinManager.GiveColor("Text")),midRect(Width-time_text_size[0]/2-self._ROffset, time_text_size[1]/2+(self._BarHeight-time_text_size[1])/2, time_text_size[0],time_text_size[1],Width,Height)) diff --git a/sys.py/UI/untitled_icon.py b/sys.py/UI/untitled_icon.py index 7fae615..978edaf 100644 --- a/sys.py/UI/untitled_icon.py +++ b/sys.py/UI/untitled_icon.py @@ -12,7 +12,6 @@ import base64 from beeprint import pp from util_funcs import midRect -from fonts import fonts from skin_manager import MySkinManager @@ -28,7 +27,7 @@ class UntitledIcon(object): _Height = 80 _Words = ["G", "s"] - _FontObj = fonts["varela40"] + _FontObj = MySkinManager.GiveFont("varela40") _BG = None # initial surface From 0981ac4c597a8b5d5aaee20dc8f0958880089914 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 26 Apr 2019 17:34:23 +0800 Subject: [PATCH 06/63] delete sys.py/UI/fonts.py --- sys.py/UI/fonts.py | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 sys.py/UI/fonts.py diff --git a/sys.py/UI/fonts.py b/sys.py/UI/fonts.py deleted file mode 100644 index 555c783..0000000 --- a/sys.py/UI/fonts.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- - From bd88c1730e50766c5ae7a217d4d24d9afb40e795 Mon Sep 17 00:00:00 2001 From: Miguel Guilherme Date: Sat, 27 Apr 2019 23:13:27 +0100 Subject: [PATCH 07/63] Add support for pico-8 latest version pico-8_0.1.12c --- Menu/GameShell/50_PICO-8/compkginfo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Menu/GameShell/50_PICO-8/compkginfo.json b/Menu/GameShell/50_PICO-8/compkginfo.json index 83b4192..19d7eda 100644 --- a/Menu/GameShell/50_PICO-8/compkginfo.json +++ b/Menu/GameShell/50_PICO-8/compkginfo.json @@ -4,6 +4,6 @@ "NotFoundMsg":["Please purchase the PICO-8 \n|None|varela16", "and copy it to the \"~/games/PICO-8\"|None|varela16"], -"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932","pico-8_0.1.12_raspi.zip":"08eda95570e63089a2b9f5531503431e"}, +"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932","pico-8_0.1.12_raspi.zip":"08eda95570e63089a2b9f5531503431e","pico-8_0.1.12c_raspi.zip":"1a62b0d7d4e4be65f89f23ec9757cb66"}, "Post-Up":"bash Post-Up.sh" } From 201f2fb89c37b41d5003ca5475bf645470f3a50a Mon Sep 17 00:00:00 2001 From: cuu Date: Sun, 5 May 2019 15:54:02 +0800 Subject: [PATCH 08/63] add pico-8.zip --- Menu/GameShell/50_PICO-8/compkginfo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Menu/GameShell/50_PICO-8/compkginfo.json b/Menu/GameShell/50_PICO-8/compkginfo.json index 83b4192..79b54df 100644 --- a/Menu/GameShell/50_PICO-8/compkginfo.json +++ b/Menu/GameShell/50_PICO-8/compkginfo.json @@ -4,6 +4,6 @@ "NotFoundMsg":["Please purchase the PICO-8 \n|None|varela16", "and copy it to the \"~/games/PICO-8\"|None|varela16"], -"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932","pico-8_0.1.12_raspi.zip":"08eda95570e63089a2b9f5531503431e"}, +"MD5":{"pico-8_0.1.11g_raspi.zip":"a3f2995cf117499f880bd964d6a0e1f2","pico-8_0.1.11g_amd64.zip":"6726141c784afd4a41be6b7414c1b932","pico-8_0.1.12_raspi.zip":"08eda95570e63089a2b9f5531503431e","pico-8.zip":"whatever it takes"}, "Post-Up":"bash Post-Up.sh" } From 0dc85f2407881126b458d28eabe17be9f52c08e8 Mon Sep 17 00:00:00 2001 From: cuu Date: Sun, 5 May 2019 18:32:55 +0800 Subject: [PATCH 09/63] add absolute path in .cpirc --- .cpirc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.cpirc b/.cpirc index 87099cb..41038d5 100644 --- a/.cpirc +++ b/.cpirc @@ -1,9 +1,9 @@ SCREEN=`cat /sys/class/graphics/fb0/modes` -XORG_CONF="~/launcher/.xorg.conf" -if [ -f ~/.lima ] +XORG_CONF="/home/cpi/launcher/.xorg.conf" +if [ -f /home/cpi/.lima ] then -XORG_CONF="~/launcher/.xorg_lima.conf" +XORG_CONF="/home/cpi/launcher/.xorg_lima.conf" fi if [ -f /tmp/autologin ] From 8ee95d9648bfb4a8115c135840a01dde7f73a4da Mon Sep 17 00:00:00 2001 From: cuu Date: Tue, 7 May 2019 13:04:12 +0800 Subject: [PATCH 10/63] bug fix download_process_page.py --- sys.py/UI/download_process_page.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys.py/UI/download_process_page.py b/sys.py/UI/download_process_page.py index c1bfc43..2f99dd9 100644 --- a/sys.py/UI/download_process_page.py +++ b/sys.py/UI/download_process_page.py @@ -75,11 +75,11 @@ class DownloadProcessPage(Page): self._FileNameLabel = Label() self._FileNameLabel.SetCanvasHWND(self._CanvasHWND) - self._FileNameLabel.Init("", fonts["varela12"]) + self._FileNameLabel.Init("", MyLangManager.TrFont("varela12")) self._SizeLabel = Label() self._SizeLabel.SetCanvasHWND(self._CanvasHWND) - self._SizeLabel.Init("0/0Kb",fonts["varela12"]) + self._SizeLabel.Init("0/0Kb",MyLangManager.TrFont("varela12")) self._SizeLabel.SetColor( self._URLColor ) From d6a5294afba9d8a8bccde13877351aa687588bea Mon Sep 17 00:00:00 2001 From: cuu Date: Tue, 7 May 2019 13:30:31 +0800 Subject: [PATCH 11/63] bug fix --- sys.py/UI/Emulator/rom_list_page.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys.py/UI/Emulator/rom_list_page.py b/sys.py/UI/Emulator/rom_list_page.py index ef5a4a0..edc5d8a 100644 --- a/sys.py/UI/Emulator/rom_list_page.py +++ b/sys.py/UI/Emulator/rom_list_page.py @@ -100,7 +100,7 @@ class RomListPage(Page): _Selector=None _FootMsg = ["Nav","Del","Scan","Back","Run","AddFav"] _MyList = [] - _ListFont = MyLangManager.Tr("notosanscjk15") + _ListFont = MyLangManager.TrFont("notosanscjk15") _MyStack = None _Emulator = None _Parent = None From 67148d102b9b5fa50a685f88fded5eef032c236f Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 9 May 2019 17:00:14 +0800 Subject: [PATCH 12/63] off to OFF --- Menu/GameShell/10_Settings/list_page.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Menu/GameShell/10_Settings/list_page.py b/Menu/GameShell/10_Settings/list_page.py index 5b222ca..7a422c0 100644 --- a/Menu/GameShell/10_Settings/list_page.py +++ b/Menu/GameShell/10_Settings/list_page.py @@ -63,7 +63,7 @@ class ListPage(Page): ["","Notification","Notification"], ["","Update", ""], ["","About", "About"], - ["","PowerOFF","Power off"], + ["","PowerOFF","Power OFF"], ["","ButtonsLayout","Buttons Layout"], ["","LauncherGo","Switch to LauncherGo"], ["","Lima","GPU driver switch"], From 1590ea44b831752d5cc03d1cf72e5a5f73f7cb4f Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 9 May 2019 20:31:12 +0800 Subject: [PATCH 13/63] wifi_list bug fix --- Menu/GameShell/10_Settings/Wifi/wifi_list.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Menu/GameShell/10_Settings/Wifi/wifi_list.py b/Menu/GameShell/10_Settings/Wifi/wifi_list.py index fa042ae..c1d1037 100644 --- a/Menu/GameShell/10_Settings/Wifi/wifi_list.py +++ b/Menu/GameShell/10_Settings/Wifi/wifi_list.py @@ -568,7 +568,9 @@ class WifiList(Page): password_inputed = "".join(myvars.PasswordPage._Textarea._MyWords) if is_wifi_connected_now() == False: self.ConfigWireless(password_inputed) - + else: + self.ShowBox(MyLangManager.Tr("Disconnect first")) + def OnReturnBackCb(self): pass @@ -621,8 +623,8 @@ class WifiList(Page): for i in wicd_wirelss_encrypt_pwd: if "preshared_key" in i: if i["preshared_key"] != None: - if len(i["preshared_key"]) > 0: - thepass = i["preshared_key"] + if len(str(i["preshared_key"])) > 0: + thepass = str(i["preshared_key"]) break myvars.PasswordPage.SetPassword(thepass) From 75975dea37b6980ba9b2f839fe57119a2a55a6c5 Mon Sep 17 00:00:00 2001 From: GNU Date: Fri, 10 May 2019 19:03:04 +0800 Subject: [PATCH 14/63] Update LICENSE --- LICENSE | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 94a9ed0..f288702 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. From ce725856328d4c32fe3db597ca2bbee58402a4be Mon Sep 17 00:00:00 2001 From: cuu Date: Sat, 11 May 2019 17:53:17 +0800 Subject: [PATCH 15/63] TrFont bug fix --- sys.py/UI/lang_manager.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys.py/UI/lang_manager.py b/sys.py/UI/lang_manager.py index f2b86f2..cacef47 100644 --- a/sys.py/UI/lang_manager.py +++ b/sys.py/UI/lang_manager.py @@ -100,9 +100,10 @@ class LangManager(object): return MySkinManager.GiveFont(orig_font_str) else: if font_size_number > 28: - raise Exception('cjk font string format error '+ str(font_size_number)) - - return MySkinManager.GiveFont("notosanscjk%d" % font_size_number) + # raise Exception('cjk font string format error '+ str(font_size_number)) + return MySkinManager.GiveFont(orig_font_str) + else: + return MySkinManager.GiveFont("notosanscjk%d" % font_size_number) ##global MyLangManager Handler MyLangManager = None From ed8699d6d4135147daa26d1d1687767c85a5af9e Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 13 May 2019 19:43:43 +0800 Subject: [PATCH 16/63] except the python UnicodeDecodeError in Emulator --- sys.py/UI/Emulator/fav_list_page.py | 11 +++++++++-- sys.py/UI/Emulator/rom_list_page.py | 12 ++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/sys.py/UI/Emulator/fav_list_page.py b/sys.py/UI/Emulator/fav_list_page.py index dc3f7d8..0ae379f 100644 --- a/sys.py/UI/Emulator/fav_list_page.py +++ b/sys.py/UI/Emulator/fav_list_page.py @@ -129,8 +129,11 @@ class FavListPage(Page): stats = os.stat(v) if stats.st_gid != self._Parent._FavGID: ## only favs continue + try: + dirmap["gamedir"] = v.decode("utf8","ignore") + except: + dirmap["gamedir"] = v.decode("ascii","ignore") - dirmap["gamedir"] = v.decode("utf8") ret.append(dirmap) if os.path.isfile(v) and self._Emulator["FILETYPE"] == "file": stats = os.stat(v) @@ -141,7 +144,11 @@ class FavListPage(Page): pieces = bname.split(".") if len(pieces) > 1: if pieces[ len(pieces)-1 ].lower() in self._Emulator["EXT"]: - dirmap["file"] = v.decode("utf8") + try: + dirmap["file"] = v.decode("utf8","ignore") + except: + dirmap["file"] = v.decode("ascii","ignore") + ret.append(dirmap) # else: diff --git a/sys.py/UI/Emulator/rom_list_page.py b/sys.py/UI/Emulator/rom_list_page.py index edc5d8a..a0c7508 100644 --- a/sys.py/UI/Emulator/rom_list_page.py +++ b/sys.py/UI/Emulator/rom_list_page.py @@ -143,7 +143,11 @@ class RomListPage(Page): continue if FileExists(v+"/"+gameshell_bat): - dirmap["gamedir"] = v.decode("utf8") + try: + dirmap["gamedir"] = v.decode("utf8","ignore") + except: + dirmap["gamedir"] = v.decode("ascii","ignore") + ret.append(dirmap) if os.path.isfile(v) and self._Emulator["FILETYPE"] == "file": stats = os.stat(v) @@ -162,7 +166,11 @@ class RomListPage(Page): pieces = bname.split(".") if len(pieces) > 1: if pieces[ len(pieces)-1 ].lower() in self._Emulator["EXT"]: - dirmap["file"] = v.decode("utf8") + try: + dirmap["file"] = v.decode("utf8","ignore") + except: + dirmap["file"] = v.decode("ascii","ignore") + ret.append(dirmap) # else: # print("not file or dir") From 24d711e538d5164a7e868d57bbe18d048167b2b0 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 1 Jun 2019 16:56:02 -0500 Subject: [PATCH 17/63] Allows for the rendering and rescaling of images to be used as a background to the launcher --- sys.py/UI/page.py | 143 ++++++++++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 62 deletions(-) diff --git a/sys.py/UI/page.py b/sys.py/UI/page.py index c5a3105..b29350c 100644 --- a/sys.py/UI/page.py +++ b/sys.py/UI/page.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import pygame from pygame.locals import * @@ -6,104 +6,120 @@ from sys import exit import os import sys import math +import fnmatch +import random + from libs import easing -#import base64 -#from beeprint import pp +# import base64 +# from beeprint import pp -### local import -from constants import ALIGN,icon_width,icon_height,Width,Height,ICON_TYPES -from util_funcs import midRect -from keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB -from icon_pool import MyIconPool +# local import +from constants import ALIGN, icon_width, icon_height, Width, Height, ICON_TYPES +from util_funcs import midRect +from keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from icon_pool import MyIconPool from lang_manager import MyLangManager -from widget import Widget +from widget import Widget + class PageStack: def __init__(self): self.stack = list() - def Push(self,data): + def Push(self, data): if data not in self.stack: self.stack.append(data) return True return False def Pop(self): - if len(self.stack)<=0: - return None,False - return self.stack.pop(),True - + if len(self.stack) <= 0: + return None, False + return self.stack.pop(), True + def Length(self): return len(self.stack) + class PageSelector(Widget): _Parent = None - _Alpha = 0 + _Alpha = 0 _OnShow = True - _IconSurf = None + _IconSurf = None + def __init__(self): pass - def Init(self,x,y,w,h,alpha): - self._PosX = x - self._PosY = y - self._Width = w - self._Height = h - self._Alpha = alpha + def Init(self, x, y, w, h, alpha): + self._PosX = x + self._PosY = y + self._Width = w + self._Height = h + self._Alpha = alpha - def Adjust(self,x,y,w,h,alpha): - self._PosX = x - self._PosY = y - self._Width = w - self._Height = h - self._Alpha = alpha + def Adjust(self, x, y, w, h, alpha): + self._PosX = x + self._PosY = y + self._Width = w + self._Height = h + self._Alpha = alpha def Draw(self): - canvas = self._Parent._CanvasHWND - idx = self._Parent._PsIndex + canvas = self._Parent._CanvasHWND + idx = self._Parent._PsIndex iconidx = self._Parent._IconIndex if idx < len(self._Parent._Icons): - x = self._Parent._Icons[idx]._PosX+self._Parent._PosX - y = self._Parent._Icons[iconidx]._PosY ## only use current icon's PosY - - rect = midRect(x,y,self._Width,self._Height,self._Parent._Width,self._Parent._Height) - if rect.width <=0 or rect.height <= 0 : + x = self._Parent._Icons[idx]._PosX+self._Parent._PosX + # only use current icon's PosY + y = self._Parent._Icons[iconidx]._PosY + + rect = midRect(x, y, self._Width, self._Height, + self._Parent._Width, self._Parent._Height) + if rect.width <= 0 or rect.height <= 0: return - #color = (244,197,66,50) - #pygame.draw.rect(canvas,color,rect,1) + # color = (244,197,66,50) + # pygame.draw.rect(canvas,color,rect,1) if self._IconSurf != None: - self._Parent._CanvasHWND.blit(self._IconSurf,rect) - + self._Parent._CanvasHWND.blit(self._IconSurf, rect) + + class Page(Widget): _Icons = [] _Ps = None _PsIndex = 0 _IconNumbers = 0 - _IconIndex = 0 ## shows which icon current selected, the Selector can not move here - _PrevIconIndex = 0 ## for remember the Highlighted Icon ,restore it's PosY to average + _IconIndex = 0 # shows which icon current selected, the Selector can not move here + _PrevIconIndex = 0 # for remember the Highlighted Icon ,restore it's PosY to average _Index = 0 _Align = ALIGN["SLeft"] - _CanvasHWND = None # - _HWND = None # - _OnShow = False - _Name = "" - _Screen = None ## Should be the Screen Class + _CanvasHWND = None + _HWND = None + _OnShow = False + _Name = "" + _Screen = None # Should be the Screen Class _PageIconMargin = 20 - _FootMsg = ["Nav","","","","Enter"] ## Default Page Foot info - - _SelectedIconTopOffset=20 - _EasingDur = 30 - _Padding = pygame.Rect(0,0,0,0)# x,y,w,h - _Margin = pygame.Rect(0,0,0,0) + _FootMsg = ["Nav", "", "", "", "Enter"] # Default Page Foot info + _Wallpaper = None + _SelectedIconTopOffset = 20 + _EasingDur = 30 + _Padding = pygame.Rect(0, 0, 0, 0) # x,y,w,h + _Margin = pygame.Rect(0, 0, 0, 0) _ScrollStep = 1 - + def __init__(self): self._Icons = [] + path = '/home/cpi/launcher/skin/default/Menu/GameShell/Wallpaper/' + + if os.path.exists(path): + image = os.listdir(path)[0] + if image: + self._Wallpaper = pygame.transform.scale(pygame.image.load(path+image).convert(), (320,240)) + def AdjustHLeftAlign(self): ## adjust coordinator and append the PageSelector @@ -185,7 +201,7 @@ class Page(Widget): it._Parent = self it._Index = 0 it.Adjust(start_x,start_y,icon_width,icon_height,0) - #it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) + # it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) elif self._IconNumbers == 2: start_x = (self._Width - self._PageIconMargin - self._IconNumbers*icon_width) / 2 + icon_width/2 @@ -196,7 +212,7 @@ class Page(Widget): it._Parent = self it._Index = i it.Adjust(start_x+i*self._PageIconMargin + i*icon_width,start_y, icon_width, icon_height,0) - #it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) + # it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) elif self._IconNumbers > 2: for i in range(0,self._IconNumbers): @@ -204,7 +220,7 @@ class Page(Widget): it._Parent = self it._Index = i it.Adjust(start_x+i*self._PageIconMargin + i*icon_width,start_y,icon_width,icon_height,0) - #it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) + # it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) ps = PageSelector() ps._IconSurf = MyIconPool._Icons["blueselector"] @@ -512,7 +528,7 @@ class Page(Widget): self._Screen._CurrentPage = child_page elif cur_icon._MyType == ICON_TYPES["FUNC"]: print("IconClick API: %d"%(cur_icon._Index)) - #print("%s"% cur_icon._CmdPath) + # print("%s"% cur_icon._CmdPath) api_cb = getattr(cur_icon._CmdPath,"API",None) if api_cb != None: if callable(api_cb): @@ -523,7 +539,7 @@ class Page(Widget): def ReturnToUpLevelPage(self): pop_page,ok = self._Screen._MyPageStack.Pop() if ok == True: - #self._Screen._CurrentPage.ResetPageSelector() + # self._Screen._CurrentPage.ResetPageSelector() pop_page.Draw() self._Screen._CurrentPage = pop_page on_return_back_cb = getattr(self._Screen._CurrentPage,"OnReturnBackCb",None) @@ -538,8 +554,12 @@ class Page(Widget): print("OnTopLevel ",self._Screen._PageIndex) def ClearCanvas(self): - self._CanvasHWND.fill(self._Screen._SkinManager.GiveColor("White")) - + if self._Wallpaper: + self._CanvasHWND.blit(self._Wallpaper,(0,0)) + else: + self._CanvasHWND.fill(self._Screen._SkinManager.GiveColor("White")) + + def ClearIcons(self): for i in range(0,self._IconNumbers): self._Icons[i].Clear() @@ -548,7 +568,7 @@ class Page(Widget): for i in range(0,self._IconNumbers): self._Icons[i].Draw() - ##make sure the Class has the _MyList + # make sure the Class has the _MyList def ScrollDown(self): if len(self._MyList) == 0: return @@ -650,4 +670,3 @@ class Page(Widget): self.DrawIcons() self.DrawPageSelector() - From 858540bb7db6f05f0e327fea1b2a12c31635460d Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 10 Jun 2019 13:52:35 +0800 Subject: [PATCH 18/63] CommercialSoftwarePackage keys --- sys.py/UI/CommercialSoftwarePackage/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sys.py/UI/CommercialSoftwarePackage/__init__.py b/sys.py/UI/CommercialSoftwarePackage/__init__.py index 484dffa..a6add87 100644 --- a/sys.py/UI/CommercialSoftwarePackage/__init__.py +++ b/sys.py/UI/CommercialSoftwarePackage/__init__.py @@ -29,7 +29,7 @@ from UI.page import Page from UI.label import Label from UI.icon_item import IconItem from UI.icon_pool import MyIconPool -from UI.keys_def import CurKeys +from UI.keys_def import CurKeys,IsKeyMenuOrB,IsKeyStartOrA from UI.skin_manager import MySkinManager from UI.lang_manager import MyLangManager from UI.text_bulletinboard import Textbulletinboard,Text @@ -208,13 +208,13 @@ class HashErrPage(Page): self._Board.SetAndBlitText(a.Words()+b.Words()) def KeyDown(self,event): - if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + if IsKeyMenuOrB(event.key): self.ReturnToUpLevelPage() self._Screen.Draw() self._Screen.SwapAndShow() return - if event.key == CurKeys["B"]: + if IsKeyStartOrA(event.key): self._Leader.InstallPackage(self._Screen) return From fe44274594be0c8d3217ab00721a59b8614c2b2f Mon Sep 17 00:00:00 2001 From: cuu Date: Tue, 11 Jun 2019 19:48:06 +0800 Subject: [PATCH 19/63] Because the high version of xorg prohibits the use of absolute paths for xf86config parameters, changes to relative paths in dotcpirc --- .cpirc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.cpirc b/.cpirc index 41038d5..28838b1 100644 --- a/.cpirc +++ b/.cpirc @@ -1,9 +1,9 @@ SCREEN=`cat /sys/class/graphics/fb0/modes` -XORG_CONF="/home/cpi/launcher/.xorg.conf" +XORG_CONF="~/launcher/.xorg.conf" if [ -f /home/cpi/.lima ] then -XORG_CONF="/home/cpi/launcher/.xorg_lima.conf" +XORG_CONF="~/launcher/.xorg_lima.conf" fi if [ -f /tmp/autologin ] From e73c9138ea32cf34373a7a1f47e9f0faa17ae51b Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 12 Jun 2019 20:10:00 +0800 Subject: [PATCH 20/63] rename modesetting_drv.so to toggle lima driver --- Menu/GameShell/10_Settings/Lima/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Menu/GameShell/10_Settings/Lima/__init__.py b/Menu/GameShell/10_Settings/Lima/__init__.py index b0a15d2..cb61004 100644 --- a/Menu/GameShell/10_Settings/Lima/__init__.py +++ b/Menu/GameShell/10_Settings/Lima/__init__.py @@ -172,8 +172,10 @@ class GPUDriverPage(Page): if "modesetting" in cur_li._Value: os.system("touch %s/.lima" % os.path.expanduser('~') ) + os.system("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima") else: os.system("rm %s/.lima" % os.path.expanduser('~') ) + os.system("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima /usr/lib/xorg/modules/drivers/modesetting_drv.so") pygame.time.delay(800) os.system("sudo reboot") From 8c77f3ffc56e3123387f676cb53c310da2801911 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 12 Jun 2019 20:15:52 +0800 Subject: [PATCH 21/63] ... --- Menu/GameShell/10_Settings/Lima/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Menu/GameShell/10_Settings/Lima/__init__.py b/Menu/GameShell/10_Settings/Lima/__init__.py index cb61004..73e4a88 100644 --- a/Menu/GameShell/10_Settings/Lima/__init__.py +++ b/Menu/GameShell/10_Settings/Lima/__init__.py @@ -172,10 +172,10 @@ class GPUDriverPage(Page): if "modesetting" in cur_li._Value: os.system("touch %s/.lima" % os.path.expanduser('~') ) - os.system("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima") + os.system("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima /usr/lib/xorg/modules/drivers/modesetting_drv.so") else: os.system("rm %s/.lima" % os.path.expanduser('~') ) - os.system("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima /usr/lib/xorg/modules/drivers/modesetting_drv.so") + os.system("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima") pygame.time.delay(800) os.system("sudo reboot") From 0302741ac21013b91d8ff091939c94007bbd9b6c Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 12 Jun 2019 23:10:36 +0800 Subject: [PATCH 22/63] MySkinManager.GiveColor instead of RGB --- Menu/GameShell/10_Settings/About/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Menu/GameShell/10_Settings/About/__init__.py b/Menu/GameShell/10_Settings/About/__init__.py index 30cafc1..cb73a74 100644 --- a/Menu/GameShell/10_Settings/About/__init__.py +++ b/Menu/GameShell/10_Settings/About/__init__.py @@ -329,7 +329,7 @@ class AboutPage(Page): self._DrawOnce = True if self._HWND != None: - self._HWND.fill((255,255,255)) + self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) From bac3f7899d2bdcc4a8a47e1e4333916b4127c368 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 13 Jun 2019 14:55:15 +0800 Subject: [PATCH 23/63] add skins selection --- .../GameShell/10_Settings/GateWay/__init__.py | 2 +- .../10_Settings/Languages/__init__.py | 2 +- Menu/GameShell/10_Settings/Lima/__init__.py | 2 +- .../10_Settings/PowerOptions/__init__.py | 2 +- Menu/GameShell/10_Settings/Skins/__init__.py | 284 ++++++++++++++++++ Menu/GameShell/10_Settings/list_page.py | 1 + 6 files changed, 289 insertions(+), 4 deletions(-) create mode 100644 Menu/GameShell/10_Settings/Skins/__init__.py diff --git a/Menu/GameShell/10_Settings/GateWay/__init__.py b/Menu/GameShell/10_Settings/GateWay/__init__.py index 0c83c80..3ada322 100644 --- a/Menu/GameShell/10_Settings/GateWay/__init__.py +++ b/Menu/GameShell/10_Settings/GateWay/__init__.py @@ -318,7 +318,7 @@ class GateWayPage(Page): i.Draw() if self._HWND != None: - self._HWND.fill((255,255,255)) + self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) diff --git a/Menu/GameShell/10_Settings/Languages/__init__.py b/Menu/GameShell/10_Settings/Languages/__init__.py index a6cc2b1..26b66c0 100644 --- a/Menu/GameShell/10_Settings/Languages/__init__.py +++ b/Menu/GameShell/10_Settings/Languages/__init__.py @@ -278,7 +278,7 @@ class LanguagesPage(Page): i.Draw() if self._HWND != None: - self._HWND.fill((255,255,255)) + self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) diff --git a/Menu/GameShell/10_Settings/Lima/__init__.py b/Menu/GameShell/10_Settings/Lima/__init__.py index 73e4a88..ef9672e 100644 --- a/Menu/GameShell/10_Settings/Lima/__init__.py +++ b/Menu/GameShell/10_Settings/Lima/__init__.py @@ -267,7 +267,7 @@ class GPUDriverPage(Page): i.Draw() if self._HWND != None: - self._HWND.fill((255,255,255)) + self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) diff --git a/Menu/GameShell/10_Settings/PowerOptions/__init__.py b/Menu/GameShell/10_Settings/PowerOptions/__init__.py index b92cce9..ed9444a 100644 --- a/Menu/GameShell/10_Settings/PowerOptions/__init__.py +++ b/Menu/GameShell/10_Settings/PowerOptions/__init__.py @@ -521,7 +521,7 @@ class PowerOptionsPage(Page): i.Draw() if self._HWND != None: - self._HWND.fill((255,255,255)) + self._HWND.fill(MySkinManager.GiveColor("White")) self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) diff --git a/Menu/GameShell/10_Settings/Skins/__init__.py b/Menu/GameShell/10_Settings/Skins/__init__.py new file mode 100644 index 0000000..91a8853 --- /dev/null +++ b/Menu/GameShell/10_Settings/Skins/__init__.py @@ -0,0 +1,284 @@ +# -*- coding: utf-8 -*- +import os +import pygame +import platform +#import commands +import glob +#from beeprint import pp +from libs.roundrects import aa_round_rect + +## local UI import +from UI.constants import Width,Height,ICON_TYPES,RESTARTUI +from UI.page import Page,PageSelector +from UI.label import Label +from UI.util_funcs import midRect,FileExists +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multilabel import MultiLabel +from UI.skin_manager import MySkinManager +from UI.lang_manager import MyLangManager +from UI.info_page_list_item import InfoPageListItem +from UI.info_page_selector import InfoPageSelector + +import config + +class ListPageSelector(InfoPageSelector): + def Draw(self): + idx = self._Parent._PsIndex + + if idx < len(self._Parent._MyList): + x = self._Parent._MyList[idx]._PosX+2 ## ++ + y = self._Parent._MyList[idx]._PosY+1 + h = self._Parent._MyList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) + + +class PageListItem(InfoPageListItem): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Labels = {} + _Icons = {} + _Fonts = {} + + _LinkObj = None + + _Active = False + _Value = "" + + def Draw(self): + + self._Labels["Text"]._PosY = self._PosY+ (self._Height- self._Labels["Text"]._Height)/2 + + if self._Active == True: + self._Parent._Icons["done"].NewCoord( self._Parent._Width-30,self._PosY+5) + self._Parent._Icons["done"].Draw() + + self._Labels["Text"].Draw(self._Active) + + if "Small" in self._Labels: + self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width -10 + self._Labels["Small"]._PosY = self._PosY + (self._Height- self._Labels["Small"]._Height)/2 + self._Labels["Small"].Draw() + + pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) + +class SkinsPage(Page): + _FootMsg = ["Nav","","","Back","Select"] + _MyList = [] + _ListFont = MyLangManager.TrFont("notosanscjk15") + + _AList = {} + + _Scrolled = 0 + + _BGwidth = 320 + _BGheight = 240-24-20 + + _DrawOnce = False + _Scroller = None + _InfoPage = None + + def __init__(self): + Page.__init__(self) + self._Icons = {} + + def GenList(self): + + self._MyList = [] + + start_x = 0 + start_y = 0 + last_height = 0 + + + skins = [["../skin/default","Default"]] + files_path = glob.glob("/home/cpi/skins/*") + + for i ,v in enumerate(files_path): + if os.path.isdir(v): + bname = os.path.basename(v) + print(v,bname) + skins.append([v,bname]) + + for i,u in enumerate( skins ): + #print(i,u) + li = PageListItem() + li._Parent = self + li._PosX = start_x + li._PosY = start_y + last_height + li._Width = Width + li._Fonts["normal"] = self._ListFont + li._Active = False + li._Value = u[0] + li.Init( u[1] ) + + last_height += li._Height + + self._MyList.append(li) + + def Init(self): + if self._Screen != None: + if self._Screen._CanvasHWND != None and self._CanvasHWND == None: + self._HWND = self._Screen._CanvasHWND + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + + self._PosX = self._Index*self._Screen._Width + self._Width = self._Screen._Width ## equal to screen width + self._Height = self._Screen._Height + + done = IconItem() + done._ImgSurf = MyIconPool._Icons["done"] + done._MyType = ICON_TYPES["STAT"] + done._Parent = self + self._Icons["done"] = done + + ps = ListPageSelector() + ps._Parent = self + self._Ps = ps + self._PsIndex = 0 + + self.GenList() + + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = self._Width - 10 + self._Scroller._PosY = 2 + self._Scroller.Init() + self._Scroller.SetCanvasHWND(self._HWND) + + def Click(self): + if len(self._MyList) == 0: + return + + cur_li = self._MyList[self._PsIndex] + if cur_li._Active == True: + return + + print(cur_li._Value) + + for i in self._MyList: + i._Active = False + + cur_li._Active = True + self._Screen._MsgBox.SetText("Applying") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + + if "../skin/default" in cur_li._Value: + os.system("rm %s/.gameshell_skin" % os.path.expanduser('~') ) + else: + os.system("echo %s > %s/.gameshell_skin" % (cur_li._Value,os.path.expanduser('~') )) + + pygame.time.delay(700) + pygame.event.post( pygame.event.Event(RESTARTUI, message="")) + + def OnLoadCb(self): + self._Scrolled = 0 + self._PosY = 0 + self._DrawOnce = False + + for i in self._MyList: + i._Active = False + + for i in self._MyList: + if config.SKIN in i._Value: + i._Active = True + + def OnReturnBackCb(self): + pass + """ + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + """ + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self.Click() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + + def Draw(self): + + self.ClearCanvas() + if len(self._MyList) == 0: + return + + else: + if len(self._MyList) * PageListItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + self._Scroller.UpdateSize( len(self._MyList)*PageListItem._Height, self._PsIndex*PageListItem._Height) + self._Scroller.Draw() + + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._MyList: + if i._PosY > self._Height + self._Height/2: + break + if i._PosY < 0: + continue + i.Draw() + + if self._HWND != None: + self._HWND.fill(MySkinManager.GiveColor("White")) + + self._HWND.blit(self._CanvasHWND,(self._PosX,self._PosY,self._Width, self._Height ) ) + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = SkinsPage() + self._Page._Screen = main_screen + self._Page._Name ="Skin selection" + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) + + diff --git a/Menu/GameShell/10_Settings/list_page.py b/Menu/GameShell/10_Settings/list_page.py index 7a422c0..99f3585 100644 --- a/Menu/GameShell/10_Settings/list_page.py +++ b/Menu/GameShell/10_Settings/list_page.py @@ -65,6 +65,7 @@ class ListPage(Page): ["","About", "About"], ["","PowerOFF","Power OFF"], ["","ButtonsLayout","Buttons Layout"], + ["","Skins","Skins"], ["","LauncherGo","Switch to LauncherGo"], ["","Lima","GPU driver switch"], ["","GateWay","Network gateway switch"]] From 58fd2e6a1a149670f892ea8289bf169a99713214 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 13 Jun 2019 15:13:26 +0800 Subject: [PATCH 24/63] add skin rescan --- Menu/GameShell/10_Settings/Skins/__init__.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Menu/GameShell/10_Settings/Skins/__init__.py b/Menu/GameShell/10_Settings/Skins/__init__.py index 91a8853..1034c7b 100644 --- a/Menu/GameShell/10_Settings/Skins/__init__.py +++ b/Menu/GameShell/10_Settings/Skins/__init__.py @@ -74,7 +74,7 @@ class PageListItem(InfoPageListItem): pygame.draw.line(self._Parent._CanvasHWND,MySkinManager.GiveColor('Line'),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) class SkinsPage(Page): - _FootMsg = ["Nav","","","Back","Select"] + _FootMsg = ["Nav","","Scan","Back","Select"] _MyList = [] _ListFont = MyLangManager.TrFont("notosanscjk15") @@ -94,7 +94,6 @@ class SkinsPage(Page): self._Icons = {} def GenList(self): - self._MyList = [] start_x = 0 @@ -221,7 +220,19 @@ class SkinsPage(Page): self.ScrollDown() self._Screen.Draw() self._Screen.SwapAndShow() - + + if event.key == CurKeys["X"]: + self.GenList() + + for i in self._MyList: + i._Active = False + + for i in self._MyList: + if config.SKIN in i._Value: + i._Active = True + + self._Screen.Draw() + self._Screen.SwapAndShow() def Draw(self): From d75fcc6f1c1e3514bd6fad071a312e287f4120c1 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 13 Jun 2019 15:58:08 +0800 Subject: [PATCH 25/63] PreparationInAdv to config.py --- .../10_Settings/LauncherGo/__init__.py | 7 ++- Menu/GameShell/10_Settings/Skins/__init__.py | 1 - sys.py/UI/above_all_patch.py | 2 +- sys.py/UI/constants.py | 2 - sys.py/UI/main_screen.py | 2 +- sys.py/UI/util_funcs.py | 13 ++++- sys.py/config.py | 37 +++++++++++++- sys.py/run.py | 48 ++++--------------- 8 files changed, 61 insertions(+), 51 deletions(-) diff --git a/Menu/GameShell/10_Settings/LauncherGo/__init__.py b/Menu/GameShell/10_Settings/LauncherGo/__init__.py index d49e35d..80708ab 100644 --- a/Menu/GameShell/10_Settings/LauncherGo/__init__.py +++ b/Menu/GameShell/10_Settings/LauncherGo/__init__.py @@ -3,11 +3,11 @@ import os import pygame #import math #mport subprocess -import platform #from beeprint import pp from libs.roundrects import aa_round_rect ## local UI import +from UI.util_funcs import ArmSystem from UI.lang_manager import MyLangManager class APIOBJ(object): @@ -24,9 +24,8 @@ class APIOBJ(object): main_screen._MsgBox.Draw() main_screen.SwapAndShow() pygame.time.delay(300) - if "arm" in platform.machine(): - os.system("sed -i s/launcher/launchergo/g ~/.bashrc" ) - os.system("sudo reboot") + ArmSystem("sed -i s/launcher/launchergo/g ~/.bashrc" ) + ArmSystem("sudo reboot") OBJ = APIOBJ() def Init(main_screen): diff --git a/Menu/GameShell/10_Settings/Skins/__init__.py b/Menu/GameShell/10_Settings/Skins/__init__.py index 1034c7b..64d0cf6 100644 --- a/Menu/GameShell/10_Settings/Skins/__init__.py +++ b/Menu/GameShell/10_Settings/Skins/__init__.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- import os import pygame -import platform #import commands import glob #from beeprint import pp diff --git a/sys.py/UI/above_all_patch.py b/sys.py/UI/above_all_patch.py index fee6853..55e172a 100644 --- a/sys.py/UI/above_all_patch.py +++ b/sys.py/UI/above_all_patch.py @@ -12,7 +12,7 @@ from icon_item import IconItem from page import Page,PageStack from title_bar import TitleBar from foot_bar import FootBar -from constants import Width,Height,bg_color +from constants import Width,Height from util_funcs import midRect from keys_def import CurKeys from label import Label diff --git a/sys.py/UI/constants.py b/sys.py/UI/constants.py index ebf0e40..4e4df95 100644 --- a/sys.py/UI/constants.py +++ b/sys.py/UI/constants.py @@ -12,12 +12,10 @@ from pygame.locals import * #from beeprint import pp #UI lib -from skin_manager import MySkinManager Width = 320 Height = 240 -bg_color = MySkinManager.GiveColor('White') icon_width = 80 icon_height = 80 diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py index 50c6973..8f7715e 100644 --- a/sys.py/UI/main_screen.py +++ b/sys.py/UI/main_screen.py @@ -19,7 +19,7 @@ from icon_item import IconItem from page import Page,PageStack from title_bar import TitleBar from foot_bar import FootBar -from constants import Width,Height,bg_color +from constants import Width,Height from util_funcs import midRect,FileExists,ReplaceSuffix,ReadTheFileContent,CmdClean,MakeExecutable from keys_def import CurKeys from label import Label diff --git a/sys.py/UI/util_funcs.py b/sys.py/UI/util_funcs.py index 3ca4f10..f913516 100644 --- a/sys.py/UI/util_funcs.py +++ b/sys.py/UI/util_funcs.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- - +import platform import pygame import os import subprocess @@ -110,3 +110,14 @@ def DrawText(canvas,text, x,y,width,height,canWidth,canHeight,fontObj):# text fo def SwapAndShow(): pygame.display.update() + +def ArmSystem(cmd): + if "arm" not in platform.machine(): + return + os.system(cmd) + +def InGameShell(): + if "arm" not in platform.machine(): + return True + else: + return False diff --git a/sys.py/config.py b/sys.py/config.py index 4225c11..d912b4d 100644 --- a/sys.py/config.py +++ b/sys.py/config.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +import os +import platform +from UI.util_funcs import FileExists,ArmSystem CurKeySet = "GameShell" ## >>> PC or GameShell <<< @@ -14,7 +17,7 @@ UPDATE_URL="https://raw.githubusercontent.com/clockworkpi/CPI/master/launcher_ve VERSION="stable 1.24" -SKIN="../skin/default" +SKIN=None ## three timer values in seconds: dim screen, close screen,PowerOff ## zero means no action @@ -26,5 +29,37 @@ PowerLevels["balance_saving"] = [40,0,0] PowerLevel = "balance_saving" +def PreparationInAdv(): + global SKIN + + if SKIN != None: + return + + SKIN= "../skin/default" + + if FileExists("%s/.gameshell_skin" % os.path.expanduser('~')) == True: + with open("%s/.gameshell_skin" % os.path.expanduser('~'),"r") as f: + gameshell_skin = f.read() + + gameshell_skin = gameshell_skin.strip() + SKIN= gameshell_skin + + if FileExists(".powerlevel") == False: + os.system("touch .powerlevel") + + with open(".powerlevel","r") as f: + powerlevel = f.read() + + powerlevel = powerlevel.strip() + if powerlevel != "": + config.PowerLevel = powerlevel + if powerlevel != "supersaving": + ArmSystem("sudo iw wlan0 set power_save off >/dev/null") + else: + ArmSystem("sudo iw wlan0 set power_save on > /dev/null") + else: + ArmSystem("sudo iw wlan0 set power_save off >/dev/null") + +PreparationInAdv() ##sys.py/.powerlevel diff --git a/sys.py/run.py b/sys.py/run.py index d53adaa..93fd8e0 100644 --- a/sys.py/run.py +++ b/sys.py/run.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import platform + import dbus import dbus.service import sys @@ -24,7 +24,7 @@ import pygame from sys import exit import os -from beeprint import pp +#from beeprint import pp ######## if getattr(dbus, 'version', (0, 0, 0)) < (0, 80, 0): import dbus.glib @@ -32,10 +32,10 @@ else: from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) - +import config #local UI import -from UI.constants import Width,Height,bg_color,icon_width,icon_height,DT,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT,RESTARTUI,RUNSH -from UI.util_funcs import ReplaceSuffix,FileExists, ReadTheFileContent,midRect,color_surface,SwapAndShow,GetExePath,X_center_mouse +from UI.constants import Width,Height,icon_width,icon_height,DT,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT,RESTARTUI,RUNSH +from UI.util_funcs import ReplaceSuffix,FileExists, ReadTheFileContent,midRect,color_surface,SwapAndShow,GetExePath,X_center_mouse,ArmSystem from UI.page import PageStack,PageSelector,Page from UI.label import Label from UI.icon_item import IconItem @@ -46,10 +46,9 @@ from UI.main_screen import MainScreen from UI.above_all_patch import SoundPatch from UI.icon_pool import MyIconPool from UI.createby_screen import CreateByScreen - +from UI.skin_manager import MySkinManager from libs.DBUS import setup_dbus -import config if not pygame.display.get_init(): pygame.display.init() @@ -555,7 +554,7 @@ def big_loop(): sound_patch.Init() #pp(main_screen._Pages[0],True,6) - screen.fill(bg_color) + screen.fill(MySkinManager.GiveColor("White")) main_screen.Draw() main_screen.SwapAndShow() @@ -571,34 +570,6 @@ def big_loop(): gobject_loop() -def PreparationInAdv(): - - if "arm" not in platform.machine(): - return - - if FileExists("%s/.gameshell_skin" % os.path.expanduser('~')) == True: - with open("%s/.gameshell_skin" % os.path.expanduser('~'),"r") as f: - gameshell_skin = f.read() - - gameshell_skin = gameshell_skin.strip() - config.SKIN= gameshell_skin - - if FileExists(".powerlevel") == False: - os.system("touch .powerlevel") - - with open(".powerlevel","r") as f: - powerlevel = f.read() - - powerlevel = powerlevel.strip() - if powerlevel != "": - config.PowerLevel = powerlevel - if powerlevel != "supersaving": - os.system("sudo iw wlan0 set power_save off >/dev/null") - else: - os.system("sudo iw wlan0 set power_save on > /dev/null") - else: - os.system("sudo iw wlan0 set power_save off >/dev/null") - ###MAIN()### if __name__ == '__main__': @@ -614,8 +585,7 @@ if __name__ == '__main__': pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,RUNEVT,RUNSYS,POWEROPT,RESTARTUI,RUNSH]) pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2) - - + MyIconPool.Init() setup_dbus() @@ -632,8 +602,6 @@ if __name__ == '__main__': exit() - PreparationInAdv() - crt_screen = CreateByScreen() crt_screen.Init() crt_screen._HWND = screen From 5aa744cb6b20b0d3ba3df8f5dbf773df06bb3e9d Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 13 Jun 2019 15:59:24 +0800 Subject: [PATCH 26/63] PreparationInAdv fix --- sys.py/config.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sys.py/config.py b/sys.py/config.py index d912b4d..825c45c 100644 --- a/sys.py/config.py +++ b/sys.py/config.py @@ -31,7 +31,8 @@ PowerLevel = "balance_saving" def PreparationInAdv(): global SKIN - + global PowerLevel + if SKIN != None: return @@ -52,7 +53,7 @@ def PreparationInAdv(): powerlevel = powerlevel.strip() if powerlevel != "": - config.PowerLevel = powerlevel + PowerLevel = powerlevel if powerlevel != "supersaving": ArmSystem("sudo iw wlan0 set power_save off >/dev/null") else: From baae2545f12dcf078b161d44ca741e834c3eedd1 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 13 Jun 2019 16:17:51 +0800 Subject: [PATCH 27/63] IconPool --- sys.py/UI/icon_pool.py | 15 ++++++++++++++- sys.py/UI/skin_manager.py | 2 +- sys.py/run.py | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/sys.py/UI/icon_pool.py b/sys.py/UI/icon_pool.py index 256a6af..effd54c 100644 --- a/sys.py/UI/icon_pool.py +++ b/sys.py/UI/icon_pool.py @@ -33,7 +33,20 @@ class IconPool(object): def Height(self,keyname): if keyname in self._Sizes: return self._Sizes[keyname][1] - + + def GiveIconSurface(self,imgname): ## imgname is the png file name without .png + if imgname in self._Icons: + return self._Icons[imgname] + else: + icon_file = MySkinManager.GiveIcon("gameshell/icons/"+imgname+".png") + if os.path.isfile(icon_file): + keyname = imgname + self._Icons[keyname] = pygame.image.load(icon_file).convert_alpha() + self._Sizes[keyname] = self._Icons[keyname].get_size() + return self._Icons[keyname] + + return None # this will cause panic,if not found both in theme and default skin folder + ##global Handler MyIconPool = None diff --git a/sys.py/UI/skin_manager.py b/sys.py/UI/skin_manager.py index c0cbdb0..53c3571 100644 --- a/sys.py/UI/skin_manager.py +++ b/sys.py/UI/skin_manager.py @@ -117,7 +117,7 @@ class SkinManager(object): else: return pygame.Color(255,0,0) - def GiveIcon(self,orig_file_or_dir): + def GiveIcon(self,orig_file_or_dir): ## return is string,not Surface #doing a wrapper for items under /home/cpi/apps/Menu/*, to be like Menu/GameShell/* if orig_file_or_dir.startswith("/home/cpi/apps/Menu"): orig_file_or_dir = orig_file_or_dir.replace("/home/cpi/apps/Menu/","../Menu/GameShell/") diff --git a/sys.py/run.py b/sys.py/run.py index 93fd8e0..a16525a 100644 --- a/sys.py/run.py +++ b/sys.py/run.py @@ -377,6 +377,7 @@ def event_process(event,main_screen): os.chdir(GetExePath()) exec_app_cmd = " sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) + release_self_fds() os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd) os.chdir( GetExePath()) os.exelp("python","python"," "+myscriptname) @@ -385,6 +386,7 @@ def event_process(event,main_screen): pygame.quit() gobject_main_loop.quit() exec_app_cmd = event.message +";" + release_self_fds() os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd) sys.exit(-1) return From c5597284546a84e31f976dda4b943719285c1e48 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 13 Jun 2019 21:24:56 +0800 Subject: [PATCH 28/63] replace all MyIconPool._Icons to be MyIconPool.GiveIconSurface --- Menu/GameShell/10_Settings/About/__init__.py | 2 +- Menu/GameShell/10_Settings/Airplane/__init__.py | 8 ++++---- Menu/GameShell/10_Settings/Bluetooth/net_item.py | 2 +- .../10_Settings/Brightness/brightness_page.py | 4 ++-- .../10_Settings/ButtonsLayout/__init__.py | 2 +- Menu/GameShell/10_Settings/GateWay/__init__.py | 2 +- Menu/GameShell/10_Settings/Languages/__init__.py | 2 +- Menu/GameShell/10_Settings/Lima/__init__.py | 2 +- .../GameShell/10_Settings/Notification/__init__.py | 2 +- .../GameShell/10_Settings/PowerOptions/__init__.py | 2 +- Menu/GameShell/10_Settings/Skins/__init__.py | 2 +- Menu/GameShell/10_Settings/Sound/sound_page.py | 4 ++-- Menu/GameShell/10_Settings/Storage/__init__.py | 2 +- .../10_Settings/Time/timezone_lib_list_page.py | 4 ++-- Menu/GameShell/10_Settings/Wifi/net_item.py | 4 ++-- .../GameShell/97_Music Player/mpd_spectrum_page.py | 8 ++++---- .../97_Music Player/music_lib_list_page.py | 4 ++-- Menu/GameShell/97_Music Player/play_list_page.py | 2 +- Menu/GameShell/98_TinyCloud/__init__.py | 4 ++-- sys.py/UI/CommercialSoftwarePackage/__init__.py | 4 ++-- sys.py/UI/Emulator/__init__.py | 2 +- sys.py/UI/Emulator/fav_list_page.py | 2 +- sys.py/UI/Emulator/rom_list_page.py | 2 +- sys.py/UI/download_process_page.py | 4 ++-- sys.py/UI/foot_bar.py | 2 +- sys.py/UI/keyboard.py | 2 +- sys.py/UI/page.py | 14 +++++++------- sys.py/UI/title_bar.py | 2 +- 28 files changed, 48 insertions(+), 48 deletions(-) diff --git a/Menu/GameShell/10_Settings/About/__init__.py b/Menu/GameShell/10_Settings/About/__init__.py index cb73a74..44992ff 100644 --- a/Menu/GameShell/10_Settings/About/__init__.py +++ b/Menu/GameShell/10_Settings/About/__init__.py @@ -254,7 +254,7 @@ class AboutPage(Page): self._Height = self._Screen._Height bgpng = IconItem() - bgpng._ImgSurf = MyIconPool._Icons["about_bg"] + bgpng._ImgSurf = MyIconPool.GiveIconSurface("about_bg") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) diff --git a/Menu/GameShell/10_Settings/Airplane/__init__.py b/Menu/GameShell/10_Settings/Airplane/__init__.py index f2a11a8..3338d90 100644 --- a/Menu/GameShell/10_Settings/Airplane/__init__.py +++ b/Menu/GameShell/10_Settings/Airplane/__init__.py @@ -65,21 +65,21 @@ class AirplanePage(Page): airwire = IconItem() - airwire._ImgSurf = MyIconPool._Icons["airwire"] + airwire._ImgSurf = MyIconPool.GiveIconSurface("airwire") airwire._MyType = ICON_TYPES["STAT"] airwire._Parent = self airwire.Adjust(0,0,5,43,0) self._Icons["airwire"] = airwire GS = IconItem() - GS._ImgSurf = MyIconPool._Icons["GS"] + GS._ImgSurf = MyIconPool.GiveIconSurface("GS") GS._MyType = ICON_TYPES["STAT"] GS._Parent = self GS.Adjust(0,0,72,95,0) self._Icons["GS"] = GS DialogBoxs = MultiIconItem() - DialogBoxs._ImgSurf = MyIconPool._Icons["DialogBoxs"] + DialogBoxs._ImgSurf = MyIconPool.GiveIconSurface("DialogBoxs") DialogBoxs._MyType = ICON_TYPES["STAT"] DialogBoxs._Parent = self DialogBoxs._IconWidth = 134 @@ -90,7 +90,7 @@ class AirplanePage(Page): """ bgpng = MultiIconItem() - bgpng._ImgSurf = MyIconPool._Icons["about_bg"] + bgpng._ImgSurf = MyIconPool.GiveIconSurface("about_bg") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) diff --git a/Menu/GameShell/10_Settings/Bluetooth/net_item.py b/Menu/GameShell/10_Settings/Bluetooth/net_item.py index a9aa511..cc37882 100644 --- a/Menu/GameShell/10_Settings/Bluetooth/net_item.py +++ b/Menu/GameShell/10_Settings/Bluetooth/net_item.py @@ -98,7 +98,7 @@ class NetItem(object): self._Labels["mac_addr"] = name_label done_icon = NetItemIcon() - done_icon._ImgSurf = MyIconPool._Icons["done"] + done_icon._ImgSurf = MyIconPool.GiveIconSurface("done") done_icon._CanvasHWND = self._Parent._CanvasHWND done_icon._Parent = self diff --git a/Menu/GameShell/10_Settings/Brightness/brightness_page.py b/Menu/GameShell/10_Settings/Brightness/brightness_page.py index 7494ff8..8b56473 100644 --- a/Menu/GameShell/10_Settings/Brightness/brightness_page.py +++ b/Menu/GameShell/10_Settings/Brightness/brightness_page.py @@ -39,7 +39,7 @@ class BSlider(Slider): self._Height = self._Parent._Height bgpng = IconItem() - bgpng._ImgSurf = MyIconPool._Icons["light"] + bgpng._ImgSurf = MyIconPool.GiveIconSurface("light") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.Adjust(0,0,self._BGwidth,self._BGheight,0) @@ -49,7 +49,7 @@ class BSlider(Slider): scale = MultiIconItem() scale._MyType = ICON_TYPES["STAT"] scale._Parent = self - scale._ImgSurf = MyIconPool._Icons["scale"] + scale._ImgSurf = MyIconPool.GiveIconSurface("scale") scale._IconWidth = 82 scale._IconHeight = 63 scale.Adjust(0,0,82,63,0) diff --git a/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py index 53a09f3..70ad3da 100644 --- a/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py +++ b/Menu/GameShell/10_Settings/ButtonsLayout/__init__.py @@ -153,7 +153,7 @@ class ButtonsLayoutPage(Page): self._Height = self._Screen._Height DialogBoxs = MultiIconItem() - DialogBoxs._ImgSurf = MyIconPool._Icons["buttonslayout"] + DialogBoxs._ImgSurf = MyIconPool.GiveIconSurface("buttonslayout") DialogBoxs._MyType = ICON_TYPES["STAT"] DialogBoxs._Parent = self DialogBoxs._IconWidth = 300 diff --git a/Menu/GameShell/10_Settings/GateWay/__init__.py b/Menu/GameShell/10_Settings/GateWay/__init__.py index 3ada322..8a5bc0a 100644 --- a/Menu/GameShell/10_Settings/GateWay/__init__.py +++ b/Menu/GameShell/10_Settings/GateWay/__init__.py @@ -133,7 +133,7 @@ class GateWayPage(Page): self._Height = self._Screen._Height done = IconItem() - done._ImgSurf = MyIconPool._Icons["done"] + done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done diff --git a/Menu/GameShell/10_Settings/Languages/__init__.py b/Menu/GameShell/10_Settings/Languages/__init__.py index 26b66c0..49ab84e 100644 --- a/Menu/GameShell/10_Settings/Languages/__init__.py +++ b/Menu/GameShell/10_Settings/Languages/__init__.py @@ -133,7 +133,7 @@ class LanguagesPage(Page): self._Height = self._Screen._Height done = IconItem() - done._ImgSurf = MyIconPool._Icons["done"] + done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done diff --git a/Menu/GameShell/10_Settings/Lima/__init__.py b/Menu/GameShell/10_Settings/Lima/__init__.py index ef9672e..9131709 100644 --- a/Menu/GameShell/10_Settings/Lima/__init__.py +++ b/Menu/GameShell/10_Settings/Lima/__init__.py @@ -132,7 +132,7 @@ class GPUDriverPage(Page): self._Height = self._Screen._Height done = IconItem() - done._ImgSurf = MyIconPool._Icons["done"] + done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done diff --git a/Menu/GameShell/10_Settings/Notification/__init__.py b/Menu/GameShell/10_Settings/Notification/__init__.py index e5cb530..d2bdc6a 100644 --- a/Menu/GameShell/10_Settings/Notification/__init__.py +++ b/Menu/GameShell/10_Settings/Notification/__init__.py @@ -44,7 +44,7 @@ class NotifyJobListItem(InfoPageListItem): self._Labels["Text"] = l done_icon = IconItem() - done_icon._ImgSurf = MyIconPool._Icons["done"] + done_icon._ImgSurf = MyIconPool.GiveIconSurface("done") done_icon._CanvasHWND = self._Parent._CanvasHWND done_icon._Parent = self diff --git a/Menu/GameShell/10_Settings/PowerOptions/__init__.py b/Menu/GameShell/10_Settings/PowerOptions/__init__.py index ed9444a..e80e68c 100644 --- a/Menu/GameShell/10_Settings/PowerOptions/__init__.py +++ b/Menu/GameShell/10_Settings/PowerOptions/__init__.py @@ -378,7 +378,7 @@ class PowerOptionsPage(Page): self._Height = self._Screen._Height done = IconItem() - done._ImgSurf = MyIconPool._Icons["done"] + done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done diff --git a/Menu/GameShell/10_Settings/Skins/__init__.py b/Menu/GameShell/10_Settings/Skins/__init__.py index 64d0cf6..33fe53c 100644 --- a/Menu/GameShell/10_Settings/Skins/__init__.py +++ b/Menu/GameShell/10_Settings/Skins/__init__.py @@ -136,7 +136,7 @@ class SkinsPage(Page): self._Height = self._Screen._Height done = IconItem() - done._ImgSurf = MyIconPool._Icons["done"] + done._ImgSurf = MyIconPool.GiveIconSurface("done") done._MyType = ICON_TYPES["STAT"] done._Parent = self self._Icons["done"] = done diff --git a/Menu/GameShell/10_Settings/Sound/sound_page.py b/Menu/GameShell/10_Settings/Sound/sound_page.py index fd18b9c..2a3c026 100644 --- a/Menu/GameShell/10_Settings/Sound/sound_page.py +++ b/Menu/GameShell/10_Settings/Sound/sound_page.py @@ -43,7 +43,7 @@ class SoundSlider(Slider): self._Height = self._Parent._Height self._BGpng = IconItem() - self._BGpng._ImgSurf = MyIconPool._Icons["vol"] + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("vol") self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) @@ -53,7 +53,7 @@ class SoundSlider(Slider): self._Scale = MultiIconItem() self._Scale._MyType = ICON_TYPES["STAT"] self._Scale._Parent = self - self._Scale._ImgSurf = MyIconPool._Icons["scale"] + self._Scale._ImgSurf = MyIconPool.GiveIconSurface("scale") self._Scale._IconWidth = 82 self._Scale._IconHeight = 63 self._Scale.Adjust(0,0,82,63,0) diff --git a/Menu/GameShell/10_Settings/Storage/__init__.py b/Menu/GameShell/10_Settings/Storage/__init__.py index 0cd306a..0af1f8a 100644 --- a/Menu/GameShell/10_Settings/Storage/__init__.py +++ b/Menu/GameShell/10_Settings/Storage/__init__.py @@ -54,7 +54,7 @@ class StoragePage(Page): self._Height = self._Screen._Height self._BGpng = IconItem() - self._BGpng._ImgSurf = MyIconPool._Icons["icon_sd"] + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("icon_sd") self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self diff --git a/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py b/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py index f4f9a87..4297ce9 100644 --- a/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py +++ b/Menu/GameShell/10_Settings/Time/timezone_lib_list_page.py @@ -176,7 +176,7 @@ class TimezoneListPage(Page): self.SyncList("/usr/share/zoneinfo/posix") icon_for_list = MultiIconItem() - icon_for_list._ImgSurf = MyIconPool._Icons["sys"] + icon_for_list._ImgSurf = MyIconPool.GiveIconSurface("sys") icon_for_list._MyType = ICON_TYPES["STAT"] icon_for_list._Parent = self @@ -185,7 +185,7 @@ class TimezoneListPage(Page): self._BGpng = IconItem() - self._BGpng._ImgSurf = MyIconPool._Icons["empty"] + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("empty") self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.AddLabel("No timezones found on system!", MyLangManager.TrFont("varela22")) diff --git a/Menu/GameShell/10_Settings/Wifi/net_item.py b/Menu/GameShell/10_Settings/Wifi/net_item.py index dc4ba88..d01b22b 100644 --- a/Menu/GameShell/10_Settings/Wifi/net_item.py +++ b/Menu/GameShell/10_Settings/Wifi/net_item.py @@ -137,13 +137,13 @@ class NetItem(Widget): lock_icon = NetItemIcon() - lock_icon._ImgSurf = MyIconPool._Icons["lock"] + lock_icon._ImgSurf = MyIconPool.GiveIconSurface("lock") lock_icon._CanvasHWND = self._Parent._CanvasHWND lock_icon._Parent = self self._Icons["lock"] = lock_icon done_icon = NetItemIcon() - done_icon._ImgSurf = MyIconPool._Icons["done"] + done_icon._ImgSurf = MyIconPool.GiveIconSurface("done") done_icon._CanvasHWND = self._Parent._CanvasHWND done_icon._Parent = self diff --git a/Menu/GameShell/97_Music Player/mpd_spectrum_page.py b/Menu/GameShell/97_Music Player/mpd_spectrum_page.py index fbd5e9c..92bf899 100644 --- a/Menu/GameShell/97_Music Player/mpd_spectrum_page.py +++ b/Menu/GameShell/97_Music Player/mpd_spectrum_page.py @@ -136,26 +136,26 @@ class MPDSpectrumPage(Page): """ self._BGpng = IconItem() - self._BGpng._ImgSurf = MyIconPool._Icons["sheep_bg"] + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("sheep_bg") self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.Adjust(0,0,self._BGwidth,self._BGheight,0) self._SheepHead = IconItem() - self._SheepHead._ImgSurf = MyIconPool._Icons["sheep_head"] + self._SheepHead._ImgSurf = MyIconPool.GiveIconSurface("sheep_head") self._SheepHead._MyType = ICON_TYPES["STAT"] self._SheepHead._Parent = self self._SheepHead.Adjust(0,0,self._SheepHeadW,self._SheepHeadH,0) self._SheepBody = IconItem() - self._SheepBody._ImgSurf = MyIconPool._Icons["sheep_body"] + self._SheepBody._ImgSurf = MyIconPool.GiveIconSurface("sheep_body") self._SheepBody._MyType = ICON_TYPES["STAT"] self._SheepBody._Parent = self self._SheepBody.Adjust(0,0,self._SheepBodyW,self._SheepBodyH,0) """ self._cwp_png = IconItem() - self._cwp_png._ImgSurf = MyIconPool._Icons["tape"] + self._cwp_png._ImgSurf = MyIconPool.GiveIconSurface("tape") self._cwp_png._MyType = ICON_TYPES["STAT"] self._cwp_png._Parent = self self._cwp_png.Adjust(0,0,79,79,0) diff --git a/Menu/GameShell/97_Music Player/music_lib_list_page.py b/Menu/GameShell/97_Music Player/music_lib_list_page.py index 5bcc1b4..61e88c6 100644 --- a/Menu/GameShell/97_Music Player/music_lib_list_page.py +++ b/Menu/GameShell/97_Music Player/music_lib_list_page.py @@ -172,7 +172,7 @@ class MusicLibListPage(Page): self.SyncList("/") icon_for_list = MultiIconItem() - icon_for_list._ImgSurf = MyIconPool._Icons["sys"] + icon_for_list._ImgSurf = MyIconPool.GiveIconSurface("sys") icon_for_list._MyType = ICON_TYPES["STAT"] icon_for_list._Parent = self @@ -181,7 +181,7 @@ class MusicLibListPage(Page): self._BGpng = IconItem() - self._BGpng._ImgSurf = MyIconPool._Icons["empty"] + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("empty") self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.AddLabel(MyLangManager.Tr("Please upload data over Wi-Fi"), MyLangManager.TrFont("varela22")) diff --git a/Menu/GameShell/97_Music Player/play_list_page.py b/Menu/GameShell/97_Music Player/play_list_page.py index 4cc6a4e..790c2ab 100644 --- a/Menu/GameShell/97_Music Player/play_list_page.py +++ b/Menu/GameShell/97_Music Player/play_list_page.py @@ -180,7 +180,7 @@ class PlayListPage(Page): gobject.timeout_add(850,self.GObjectInterval) self._BGpng = IconItem() - self._BGpng._ImgSurf = MyIconPool._Icons["heart"] + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface("heart") self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.AddLabel(MyLangManager.Tr("my favorite music"), MyLangManager.TrFont("varela18")) diff --git a/Menu/GameShell/98_TinyCloud/__init__.py b/Menu/GameShell/98_TinyCloud/__init__.py index 46c8d69..8ebc531 100644 --- a/Menu/GameShell/98_TinyCloud/__init__.py +++ b/Menu/GameShell/98_TinyCloud/__init__.py @@ -155,7 +155,7 @@ class TinyCloudPage(Page): self._PngSize["online"] = (75,122) bgpng = IconItem() - bgpng._ImgSurf = MyIconPool._Icons["needwifi_bg"] + bgpng._ImgSurf = MyIconPool.GiveIconSurface("needwifi_bg") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0) @@ -163,7 +163,7 @@ class TinyCloudPage(Page): self._Icons["bg"] = bgpng onlinepng = IconItem() - onlinepng._ImgSurf = MyIconPool._Icons["online"] + onlinepng._ImgSurf = MyIconPool.GiveIconSurface("online") onlinepng._MyType = ICON_TYPES["STAT"] onlinepng._Parent = self onlinepng.Adjust(0,0,self._PngSize["online"][0], self._PngSize["online"][1],0) diff --git a/sys.py/UI/CommercialSoftwarePackage/__init__.py b/sys.py/UI/CommercialSoftwarePackage/__init__.py index a6add87..6a412a5 100644 --- a/sys.py/UI/CommercialSoftwarePackage/__init__.py +++ b/sys.py/UI/CommercialSoftwarePackage/__init__.py @@ -49,7 +49,7 @@ class NotFoundPage(Page): self._CanvasHWND = self._Screen._CanvasHWND self._BGpng = IconItem() - self._BGpng._ImgSurf = MyIconPool._Icons[self._BG] + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface(self._BG) self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self #print( MyIconPool.Width(self._BG),MyIconPool.Height(self._BG) ) @@ -143,7 +143,7 @@ class HashErrPage(Page): self._CanvasHWND = self._Screen._CanvasHWND self._BGpng = IconItem() - self._BGpng._ImgSurf = MyIconPool._Icons[self._BG] + self._BGpng._ImgSurf = MyIconPool.GiveIconSurface(self._BG) self._BGpng._MyType = ICON_TYPES["STAT"] self._BGpng._Parent = self self._BGpng.Adjust(0,0,MyIconPool.Width(self._BG),MyIconPool.Height(self._BG),0) diff --git a/sys.py/UI/Emulator/__init__.py b/sys.py/UI/Emulator/__init__.py index b180722..fdf2935 100644 --- a/sys.py/UI/Emulator/__init__.py +++ b/sys.py/UI/Emulator/__init__.py @@ -70,7 +70,7 @@ class MyEmulator(object): keyname = i.split(".")[0] self._Icons[keyname] = pygame.image.load(basepath+"/"+i).convert_alpha() """ - self._Icons["sys"] = MyIconPool._Icons["sys"] + self._Icons["sys"] = MyIconPool.GiveIconSurface("sys") def InitDeleteConfirmPage(self,main_screen): diff --git a/sys.py/UI/Emulator/fav_list_page.py b/sys.py/UI/Emulator/fav_list_page.py index 0ae379f..0b5121d 100644 --- a/sys.py/UI/Emulator/fav_list_page.py +++ b/sys.py/UI/Emulator/fav_list_page.py @@ -234,7 +234,7 @@ class FavListPage(Page): bgpng = IconItem() - bgpng._ImgSurf = MyIconPool._Icons["star"] + bgpng._ImgSurf = MyIconPool.GiveIconSurface("star") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.AddLabel(MyLangManager.Tr("MyFavGames"), MyLangManager.TrFont("varela18")) diff --git a/sys.py/UI/Emulator/rom_list_page.py b/sys.py/UI/Emulator/rom_list_page.py index a0c7508..2398764 100644 --- a/sys.py/UI/Emulator/rom_list_page.py +++ b/sys.py/UI/Emulator/rom_list_page.py @@ -269,7 +269,7 @@ class RomListPage(Page): bgpng = IconItem() - bgpng._ImgSurf = MyIconPool._Icons["empty"] + bgpng._ImgSurf = MyIconPool.GiveIconSurface("empty") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.AddLabel(MyLangManager.Tr("Please upload data over Wi-Fi"), MyLangManager.TrFont("varela22")) diff --git a/sys.py/UI/download_process_page.py b/sys.py/UI/download_process_page.py index 2f99dd9..74e191a 100644 --- a/sys.py/UI/download_process_page.py +++ b/sys.py/UI/download_process_page.py @@ -58,14 +58,14 @@ class DownloadProcessPage(Page): self._PngSize["needwifi_bg"] = (253,132) bgpng = IconItem() - bgpng._ImgSurf = MyIconPool._Icons["rom_download"] + bgpng._ImgSurf = MyIconPool.GiveIconSurface("rom_download") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self bgpng.Adjust(0,0,self._PngSize["bg"][0],self._PngSize["bg"][1],0) self._Icons["bg"] = bgpng needwifi_bg = IconItem() - needwifi_bg._ImgSurf = MyIconPool._Icons["needwifi_bg"] + needwifi_bg._ImgSurf = MyIconPool.GiveIconSurface("needwifi_bg") needwifi_bg._MyType = ICON_TYPES["STAT"] needwifi_bg._Parent = self needwifi_bg.Adjust(0,0,self._PngSize["needwifi_bg"][0],self._PngSize["needwifi_bg"][1],0) diff --git a/sys.py/UI/foot_bar.py b/sys.py/UI/foot_bar.py index 1a8f53c..b2cc8e2 100644 --- a/sys.py/UI/foot_bar.py +++ b/sys.py/UI/foot_bar.py @@ -94,7 +94,7 @@ class FootBar(Widget): round_corners._MyType = ICON_TYPES["STAT"] round_corners._Parent = self - round_corners._ImgSurf = MyIconPool._Icons["roundcorners"] + round_corners._ImgSurf = MyIconPool.GiveIconSurface("roundcorners") round_corners.Adjust(0,0,10,10,0) self._Icons["round_corners"] = round_corners diff --git a/sys.py/UI/keyboard.py b/sys.py/UI/keyboard.py index bd71987..51aa395 100644 --- a/sys.py/UI/keyboard.py +++ b/sys.py/UI/keyboard.py @@ -128,7 +128,7 @@ class Keyboard(Page): if val == "_L" or val == "_R": it = KeyboardIcon() - it._ImgSurf = MyIconPool._Icons[val] + it._ImgSurf = MyIconPool.GiveIconSurface(val) it._Parent = self it._Str = val it.Init(start_x+it._ImgSurf.get_width()/2 ,start_y,it._ImgSurf.get_width(),it._ImgSurf.get_height(),0) diff --git a/sys.py/UI/page.py b/sys.py/UI/page.py index b29350c..8986b12 100644 --- a/sys.py/UI/page.py +++ b/sys.py/UI/page.py @@ -147,7 +147,7 @@ class Page(Widget): cnt+=1 ps = PageSelector() - ps._IconSurf = MyIconPool._Icons["blueselector"] + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") ps._Parent = self ps.Init(icon_width/2, TitleBar._BarHeight+icon_height/2,92,92,128) self._Ps = ps @@ -171,7 +171,7 @@ class Page(Widget): it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) ps = PageSelector() - ps._IconSurf = MyIconPool._Icons["blueselector"] + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") ps._Parent = self ps.Init(start_x,start_y,92,92,128) @@ -223,7 +223,7 @@ class Page(Widget): # it._ImgSurf = pygame.transform.smoothscale(it._ImgSurf,(it._Width,it._Height)) ps = PageSelector() - ps._IconSurf = MyIconPool._Icons["blueselector"] + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") ps._Parent = self ps.Init(start_x,start_y,92,92,128) @@ -261,7 +261,7 @@ class Page(Widget): cnt+=1 ps = PageSelector() - ps._IconSurf = MyIconPool._Icons["blueselector"] + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") ps._Parent = self ps.Init(icon_width/2,icon_height/2,92,92,128) self._Ps = ps @@ -284,7 +284,7 @@ class Page(Widget): it.Adjust(start_x+i*icon_width,start_y,icon_width,icon_height,0) ps = PageSelector() - ps._IconSurf = MyIconPool._Icons["blueselector"] + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") ps._Parent = self ps.Init(start_x,start_y,92,92,128) self._Ps = ps @@ -303,7 +303,7 @@ class Page(Widget): ps = PageSelector() - ps._IconSurf = MyIconPool._Icons["blueselector"] + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") ps._Parent = self ps.Init(start_x,start_y-self._SelectedIconTopOffset,92,92,128) @@ -339,7 +339,7 @@ class Page(Widget): if self._IconNumbers > 0: ps = PageSelector() - ps._IconSurf = MyIconPool._Icons["blueselector"] + ps._IconSurf = MyIconPool.GiveIconSurface("blueselector") ps._Parent = self ps.Init(start_x,start_y,icon_width+4,icon_height+4,128) self._Ps = ps diff --git a/sys.py/UI/title_bar.py b/sys.py/UI/title_bar.py index 2f27b89..cfe3c96 100644 --- a/sys.py/UI/title_bar.py +++ b/sys.py/UI/title_bar.py @@ -259,7 +259,7 @@ class TitleBar(Widget): round_corners._MyType = ICON_TYPES["STAT"] round_corners._Parent = self - round_corners._ImgSurf = MyIconPool._Icons["roundcorners"] + round_corners._ImgSurf = MyIconPool.GiveIconSurface("roundcorners") round_corners.Adjust(0,0,10,10,0) self._Icons["round_corners"] = round_corners From 29cbe9297adcf7dad805e4ac496c6dbb962edc2c Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 17 Jun 2019 18:18:18 +0800 Subject: [PATCH 29/63] switch lima improvements --- Menu/GameShell/10_Settings/Lima/__init__.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Menu/GameShell/10_Settings/Lima/__init__.py b/Menu/GameShell/10_Settings/Lima/__init__.py index 9131709..96d3ed0 100644 --- a/Menu/GameShell/10_Settings/Lima/__init__.py +++ b/Menu/GameShell/10_Settings/Lima/__init__.py @@ -11,7 +11,7 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES,RESTARTUI from UI.page import Page,PageSelector from UI.label import Label -from UI.util_funcs import midRect,FileExists +from UI.util_funcs import midRect,FileExists,ArmSystem from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.scroller import ListScroller from UI.icon_pool import MyIconPool @@ -170,12 +170,16 @@ class GPUDriverPage(Page): self._Screen._MsgBox.Draw() self._Screen.SwapAndShow() - if "modesetting" in cur_li._Value: + if "modesetting" in cur_li._Value: ## enable lima os.system("touch %s/.lima" % os.path.expanduser('~') ) - os.system("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima /usr/lib/xorg/modules/drivers/modesetting_drv.so") - else: + ArmSystem("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima /usr/lib/xorg/modules/drivers/modesetting_drv.so") + ArmSystem("sudo sed -i '/^#.*lima/s/^#//' /etc/ld.so.conf.d/00-arm-linux-gnueabihf.conf") + ArmSystem("sudo ldconfig") + else: #disable lima os.system("rm %s/.lima" % os.path.expanduser('~') ) - os.system("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima") + ArmSystem("sudo mv /usr/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/modesetting_drv.so.lima") + ArmSystem("sudo sed -i 's/^[^#]*lima/#&/' /etc/ld.so.conf.d/00-arm-linux-gnueabihf.conf") + ArmSystem("sudo ldconfig") pygame.time.delay(800) os.system("sudo reboot") From 4d67c053ff7a60ffbb3571e76628b035911fd884 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 20 Jun 2019 14:23:01 +0800 Subject: [PATCH 30/63] ChocoDM --- Menu/GameShell/32_ChocoDM/action.config | 6 ++++++ Menu/GameShell/32_freeDM.sh | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 Menu/GameShell/32_ChocoDM/action.config delete mode 100755 Menu/GameShell/32_freeDM.sh diff --git a/Menu/GameShell/32_ChocoDM/action.config b/Menu/GameShell/32_ChocoDM/action.config new file mode 100644 index 0000000..706a84f --- /dev/null +++ b/Menu/GameShell/32_ChocoDM/action.config @@ -0,0 +1,6 @@ +ROM=/home/cpi/games/ChocoDM +ROM_SO= +EXT=wad +LAUNCHER=chocolate-doom -iwad +TITLE=ChocoDM +SO_URL= diff --git a/Menu/GameShell/32_freeDM.sh b/Menu/GameShell/32_freeDM.sh deleted file mode 100755 index 5613ef0..0000000 --- a/Menu/GameShell/32_freeDM.sh +++ /dev/null @@ -1 +0,0 @@ -chocolate-doom -iwad /home/cpi/games/FreeDM/freedoom1.wad From 055ee12867cdbfdf73ee32161f2011ff7ceb5642 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 12:16:44 +0800 Subject: [PATCH 31/63] add launcher and os version in About --- Menu/GameShell/10_Settings/About/__init__.py | 36 ++++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/Menu/GameShell/10_Settings/About/__init__.py b/Menu/GameShell/10_Settings/About/__init__.py index 44992ff..ab8b654 100644 --- a/Menu/GameShell/10_Settings/About/__init__.py +++ b/Menu/GameShell/10_Settings/About/__init__.py @@ -12,7 +12,7 @@ from libs.roundrects import aa_round_rect from UI.constants import Width,Height,ICON_TYPES from UI.page import Page,PageSelector from UI.label import Label -from UI.util_funcs import midRect +from UI.util_funcs import midRect,FileExists from UI.keys_def import CurKeys, IsKeyMenuOrB from UI.scroller import ListScroller from UI.icon_pool import MyIconPool @@ -21,6 +21,8 @@ from UI.multilabel import MultiLabel from UI.lang_manager import MyLangManager from UI.skin_manager import MySkinManager +from config import VERSION + class InfoPageListItem(object): _PosX = 0 _PosY = 0 @@ -206,7 +208,32 @@ class AboutPage(Page): memory["value"] = str( int(parts[1].strip())/1000.0) +" MB" self._AList["memory"] = memory break - + + def LauncherVersion(self): + launcher_version = {} + launcher_version["key"] = "launcher_ver" + launcher_version["label"] = "Launcher:" + launcher_version["value"] = VERSION + self._AList["launcher_ver"] = launcher_version + + def OsImageVersion(self): + if FileExists("/etc/clockworkpi_os_image_version"): + try: + with open("/etc/clockworkpi_os_image_version") as f: + content = f.readlines() + content = [x.strip() for x in content] + + except: + print("open %s failed" % "/etc/clockworkpi_os_image_version") + content = None + + if content != None and len(content) > 0: + os_image_ver = {} + os_image_ver["key"] = "os_image_ver" + os_image_ver["label"] = "OS Image:" + os_image_ver["value"] = content[0][:12] + self._AList["os_image_ver"] = os_image_ver + def GenList(self): self._MyList = [] @@ -215,7 +242,7 @@ class AboutPage(Page): start_y = 10 last_height = 0 - for i,u in enumerate( ["processor","armcores","cpuscalemhz","features","memory","uname"] ): + for i,u in enumerate( ["processor","armcores","cpuscalemhz","features","memory","uname","launcher_ver","os_image_ver"] ): #for i,u in enumerate( ["processor","cpucores","cpumhz","flags","memory","uname"] ): if u not in self._AList: continue @@ -266,6 +293,9 @@ class AboutPage(Page): self.CpuMhz() self.Uname() + self.LauncherVersion() + self.OsImageVersion() + self.GenList() self._Scroller = ListScroller() From dd92daa60ff0b34beffde6db9ac6207d065df374 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 12:44:34 +0800 Subject: [PATCH 32/63] add DrawRect in multi_icon_item --- Menu/GameShell/10_Settings/About/__init__.py | 13 ++++++++----- sys.py/UI/multi_icon_item.py | 6 +++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Menu/GameShell/10_Settings/About/__init__.py b/Menu/GameShell/10_Settings/About/__init__.py index ab8b654..e100d87 100644 --- a/Menu/GameShell/10_Settings/About/__init__.py +++ b/Menu/GameShell/10_Settings/About/__init__.py @@ -16,7 +16,7 @@ from UI.util_funcs import midRect,FileExists from UI.keys_def import CurKeys, IsKeyMenuOrB from UI.scroller import ListScroller from UI.icon_pool import MyIconPool -from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem from UI.multilabel import MultiLabel from UI.lang_manager import MyLangManager from UI.skin_manager import MySkinManager @@ -280,7 +280,7 @@ class AboutPage(Page): self._Width = self._Screen._Width ## equal to screen width self._Height = self._Screen._Height - bgpng = IconItem() + bgpng = MultiIconItem() bgpng._ImgSurf = MyIconPool.GiveIconSurface("about_bg") bgpng._MyType = ICON_TYPES["STAT"] bgpng._Parent = self @@ -350,14 +350,17 @@ class AboutPage(Page): self.ClearCanvas() #self._Ps.Draw() - self._Icons["bg"].NewCoord(self._Width/2,self._Height/2 + (self._BGheight - Height)/2 + self._Screen._TitleBar._Height) - self._Icons["bg"].Draw() - for i in self._MyList: i.Draw() self._DrawOnce = True + self._Icons["bg"].DrawRect((230,0,82,184),(228,0,82,184)) + + y = self._MyList[len(self._MyList)-1]._PosY+30 + + self._Icons["bg"].DrawRect(( (self._Width-191)/2,y,191,68),(65,232,191,68)) + if self._HWND != None: self._HWND.fill(MySkinManager.GiveColor("White")) diff --git a/sys.py/UI/multi_icon_item.py b/sys.py/UI/multi_icon_item.py index 58b2af1..9400b46 100644 --- a/sys.py/UI/multi_icon_item.py +++ b/sys.py/UI/multi_icon_item.py @@ -43,7 +43,11 @@ class MultiIconItem(IconItem): self._PosY+self._Parent._PosY, self._Width,self._Height), (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight)) - + + def DrawRect(self,rect1,rect2): + if self._ImgSurf != None: + self._Parent._CanvasHWND.blit(self._ImgSurf,rect1,rect2) + def Draw(self): if self._Align==ALIGN["VCenter"]: #default if self._Label != None: From 3ad1c48fce4ea2af6e1e60e672e88571898dca9b Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 13:18:31 +0800 Subject: [PATCH 33/63] stretch canvas of about --- Menu/GameShell/10_Settings/About/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Menu/GameShell/10_Settings/About/__init__.py b/Menu/GameShell/10_Settings/About/__init__.py index e100d87..4a5c0c3 100644 --- a/Menu/GameShell/10_Settings/About/__init__.py +++ b/Menu/GameShell/10_Settings/About/__init__.py @@ -274,7 +274,7 @@ class AboutPage(Page): if self._Screen != None: if self._Screen._CanvasHWND != None and self._CanvasHWND == None: self._HWND = self._Screen._CanvasHWND - self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight) ) + self._CanvasHWND = pygame.Surface( (self._Screen._Width,self._BGheight+50) ) self._PosX = self._Index*self._Screen._Width self._Width = self._Screen._Width ## equal to screen width @@ -307,7 +307,7 @@ class AboutPage(Page): def ScrollDown(self): dis = 10 - if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 50: + if abs(self._Scrolled) < (self._BGheight - self._Height)/2 + 100: self._PosY -= dis self._Scrolled -= dis From 8468102ee516ddbc1a45cb141c91ca9723bdcd68 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 17:38:47 +0800 Subject: [PATCH 34/63] remove Pcsx submodule --- .gitmodules | 3 --- Menu/GameShell/20_Retro Games/Pcsx | 1 - 2 files changed, 4 deletions(-) delete mode 100644 .gitmodules delete mode 160000 Menu/GameShell/20_Retro Games/Pcsx diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 25dc9ba..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "Pcsx"] - path = Menu/GameShell/20_Retro Games/Pcsx - url = https://github.com/cuu/Pcsx.git diff --git a/Menu/GameShell/20_Retro Games/Pcsx b/Menu/GameShell/20_Retro Games/Pcsx deleted file mode 160000 index c532ced..0000000 --- a/Menu/GameShell/20_Retro Games/Pcsx +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c532cedb5387697c633777f37a52e11f95fa3352 From b435507935def59afcd9c4876f4549dcd9c89df4 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 17:44:19 +0800 Subject: [PATCH 35/63] add pcsx action.config --- Menu/GameShell/20_Retro Games/Pcsx/action.config | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Menu/GameShell/20_Retro Games/Pcsx/action.config diff --git a/Menu/GameShell/20_Retro Games/Pcsx/action.config b/Menu/GameShell/20_Retro Games/Pcsx/action.config new file mode 100644 index 0000000..7d7aec1 --- /dev/null +++ b/Menu/GameShell/20_Retro Games/Pcsx/action.config @@ -0,0 +1,6 @@ +ROM=/home/cpi/games/PCSX +ROM_SO= +EXT=iso +LAUNCHER=/home/cpi/apps/emulators/pcsx +TITLE=PS Roms +SO_URL=https://github.com/cuu/Pcsx/raw/master/pcsx From 16f521b8daaf819214f376a6d5f1b49ed8d1b1cb Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 17:47:23 +0800 Subject: [PATCH 36/63] pcsx extensions --- Menu/GameShell/20_Retro Games/Pcsx/action.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Menu/GameShell/20_Retro Games/Pcsx/action.config b/Menu/GameShell/20_Retro Games/Pcsx/action.config index 7d7aec1..a3249ec 100644 --- a/Menu/GameShell/20_Retro Games/Pcsx/action.config +++ b/Menu/GameShell/20_Retro Games/Pcsx/action.config @@ -1,6 +1,6 @@ ROM=/home/cpi/games/PCSX ROM_SO= -EXT=iso +EXT=bin,cue,img,mdf,pbp,toc,cbn,m3u,ccd LAUNCHER=/home/cpi/apps/emulators/pcsx TITLE=PS Roms SO_URL=https://github.com/cuu/Pcsx/raw/master/pcsx From 77707a811881eaad88dd3bb4bd9d61386b9ac475 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 18:30:13 +0800 Subject: [PATCH 37/63] pcsx action.config bug fix --- Menu/GameShell/20_Retro Games/Pcsx/action.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Menu/GameShell/20_Retro Games/Pcsx/action.config b/Menu/GameShell/20_Retro Games/Pcsx/action.config index a3249ec..87d8fa6 100644 --- a/Menu/GameShell/20_Retro Games/Pcsx/action.config +++ b/Menu/GameShell/20_Retro Games/Pcsx/action.config @@ -1,6 +1,6 @@ ROM=/home/cpi/games/PCSX -ROM_SO= +ROM_SO=/home/cpi/apps/emulators/pcsx EXT=bin,cue,img,mdf,pbp,toc,cbn,m3u,ccd -LAUNCHER=/home/cpi/apps/emulators/pcsx +LAUNCHER= TITLE=PS Roms -SO_URL=https://github.com/cuu/Pcsx/raw/master/pcsx +SO_URL=https://github.com/cuu/Pcsx/raw/master/pcsx.zip From 380c972b1397c683a8f06667a0f11262e0fd7141 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 18:32:43 +0800 Subject: [PATCH 38/63] ignore pcsx addtional files ,folders,log --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index e812c3b..59335b9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ sys.py/.lang !**/Jobs/00_lowpower.sh !**/Jobs/00_lowpower.alias .done +bios +.pcsx +*.log From 68d3ec052c0ff46e03d2846a958ec346d3a50f33 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 18:35:40 +0800 Subject: [PATCH 39/63] ... --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 59335b9..0eda52c 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,9 @@ sys.py/.lang !**/Jobs/00_lowpower.alias .done bios +bios/* +screenshots +screenshots/* .pcsx +.pcsx/* *.log From a9a179fe471392c27b095be81907a481b15e505b Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 21 Jun 2019 18:49:59 +0800 Subject: [PATCH 40/63] In special cases, allow ROM_SO to become LAUNCHER-like functionality in Emulator --- sys.py/UI/Emulator/fav_list_page.py | 2 +- sys.py/UI/Emulator/rom_list_page.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sys.py/UI/Emulator/fav_list_page.py b/sys.py/UI/Emulator/fav_list_page.py index 0b5121d..d49191e 100644 --- a/sys.py/UI/Emulator/fav_list_page.py +++ b/sys.py/UI/Emulator/fav_list_page.py @@ -342,7 +342,7 @@ class FavListPage(Page): if self._Emulator["ROM_SO"] =="": #empty means No needs for rom so pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) else: - if FileExists(self._Emulator["ROM_SO"]): + if FileExists(self._Emulator["ROM_SO"].split(" ")[0]): pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) else: self._Screen.PushPage(self._RomSoConfirmDownloadPage) diff --git a/sys.py/UI/Emulator/rom_list_page.py b/sys.py/UI/Emulator/rom_list_page.py index 2398764..6ba45ff 100644 --- a/sys.py/UI/Emulator/rom_list_page.py +++ b/sys.py/UI/Emulator/rom_list_page.py @@ -384,7 +384,7 @@ class RomListPage(Page): if self._Emulator["ROM_SO"] =="": #empty means No needs for rom so pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) else: - if FileExists(self._Emulator["ROM_SO"]): + if FileExists(self._Emulator["ROM_SO"].split(" ")[0]): pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath)) else: self._Screen.PushPage(self._RomSoConfirmDownloadPage) From ef0d5a6b52a40f378d32c511b1c29e30ae0fa1db Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 24 Jun 2019 13:18:48 +0800 Subject: [PATCH 41/63] update icons for mame,mgba,nestopia,pcsx --- .../Menu/GameShell/20_Retro Games/MAME.png | Bin 3339 -> 2062 bytes .../Menu/GameShell/20_Retro Games/MGBA.png | Bin 2931 -> 1983 bytes .../GameShell/20_Retro Games/NESTOPIA.png | Bin 3072 -> 2028 bytes .../Menu/GameShell/20_Retro Games/Pcsx.png | Bin 0 -> 2351 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 skin/default/Menu/GameShell/20_Retro Games/Pcsx.png diff --git a/skin/default/Menu/GameShell/20_Retro Games/MAME.png b/skin/default/Menu/GameShell/20_Retro Games/MAME.png index 9a859f53b8a9ab98f44ac1c88a4c86adf91d4eb4..401ea39595cac0d37c6d788be53b7700f5cf0d12 100644 GIT binary patch delta 2049 zcmV+c2>$nr8jcW5ioCq<`ifKuENtJMzch`{3h| z&aedK+0&;Mf3dOTd4YNk>wePZWxz|1mm92ie|__&msB4zF#`tRZ1Ym!#X-PK2mt8v z(&nYf0Ui9W0OY{!^Or3IPZk%MBpAgw0B*o_9DFMnYvVx3(&XimU#Bs%03zFtcsWG1 zq-yA52VFz=a({4u97+9wi8WqMC&kK4Ou+S!6}3s*E3~VJ$aZVeKxPa#9)LTRfUCx# zN+V3iu>>Tv=X9z7f7O$^`v59jbz{?Rk5fwa;8&gv@#VKAW@d5Dy>f`#F4RP%{p>`?GOh?>; zeJf#KZR|T!1`u7ni1SL*9^)ATv4MK}PFwhr2Y1NP<00b<|;sd6^J>wk*)t@b6@y)pK%hSg)lW-J4bFl6aX zYgQ#@5Gy#7%1Kky`v4-sha`GW^yY2hjBswcZxXH5)m8R*bCbP3J7fKRAO3VEf_`iR+|yJ}vWY6Z zCCHE^&O=PuYO`eB0lf9~b+)*;7{~2uWQv!gDlEY3&RX2JFh3u6T-c?UWhHNQnMN$3 zZ2AzhtmLKK6rZtjNioY}w%H<1AeHfsl7FE$wt#_l%06W^wkd$!6qnE+Qc3>cRPtnzbY$~BV=yuQ9>|9tusH-G{w&j#jZS(kQqciE3GUU)N-1SB`K zfpL4_^@k7HcZC9*Us#xBPi)U6(SRTJ_SnY8hWGwGSHYiNzEr-}`T05fz1{XyIe!Vs zCUH|MpC7*eT2uAF{v`!oVgUATZXN#n1Uqj+;!t6lk@lzusV86#WKci_4a**Rq@ys) z0OrY@(UCv&n8(!@fHW-oBidqIGJLc;=!uJl_iePW3JcVK%imdf@F2gmv}FD9?p=F= zgZLG@T}hin|GL1yNjxkhR`MJ4iGNVMd2V@md7pz<`0L|Gi^p$m?gSd+@{s&@b!3lbLZL4j`etR z6Vm=2%nFT?KXDS@B-1Isx+{^QjCI@K>Y%`?m!9*)OkN zF?ju%zhVc+X+i_1P&q8LZsD^m!zmUCdg(wOh8UVSj#&7E68sJ**p&X4s_8|Z881Kbaz6Y-AMMt zfT`Ldm<VYH}9a0@hcru-c#}S0-NEv3^W^aNq@qH$b!s(i{?f> zlpWGedGh^}CtmUUOo2T%{(hjbPk39x>J~tZ+W>$&Pai3=a2ma_7W)tr3kRTa4?vXR z^T3LY6t?A?DFjf<{t-;>JbWbsc&f?5?hG){)nOlE$99VY+K! zFp7aP3svGdQ{LE1x_=r<`P*dPJ%|W?C5U~#0OAd*8rh4sWOI}S7K;om7&$8Jld?-y zKk%~wswlQOiGw8)v4gO73?)GaQYYCZ-|cRrR^>zv%^A02aZ)Or&*#08Ly8#echqU=MZF7}hNy)l}^F z`(6=srnaULiGAb{3Nd9Hxl=XFvgQGLq0rmlbrK6Ej$=}_e?G?>jNPf44XKiJ8+^-e z*J1zzZI--*3ZQ*X?g(|fK{g~SdZZ;6-L&z^DmVpB_G@FhNg`zcW0N z=>d!y-Yz`?)DRofLufS{ogRZcK_G?40~LznAZ{3}Gd4>HagR`?^eA{ktW5tIfnj?! f)Bg_RKLG{+*`e6&{WaEb00000NkvXXu0mjfe1pzM delta 3337 zcmV+k4fgVm5Q`d+BYzCiNkldz4jG9mhX&=OXe@o`af-CLp?y06{=e<6)$N zWlktyg-|O6%aF3je1-YQ#J5nCk}dL8sRbwq3K=>of@4Ci8nTIplB8lVz@RYw@!gxV z&*9Fw=bU@)9dP+w>#RBVoPEyz?cdpZ|9<=T*i%+nSxFP30)OZWdbO2hJ z1E9_v?*eZFwZPwjzXB_OO(mq+hir-KYXJ-g&IE=6$3}e4GP4tKe2)A70GNwUMmjGLVxxoF1sk@6%-yRf`fvphJz5{d#DYp$+4ZMzq z<_2I3uo(?o`+u&sz(K&_XsGuDdH^j0?`sW=F~>iFI}tPMC<2PXz!tzn;0I{P1@R&9 z7c|_K0M)=p3G2!Ny@4TUS~v}8=G^ZB+yz_({1li;%EP-XWg#*OxE1J}R|3k-$7en9ID~z<*=Nri4o4V2H;^dPgMddQ>Z5{R+_p`Ftju{_eLO^M;BU2Aq+eK zxEFW`P4E_fLvzv?bKcZ=1JN=B2`h`Xi1ryk^Q13N%D@i5Gr%P0T0QVXBpjYXU%UaB znv}SdFn`t1u@pE439x$S{zPCgYEx_^k-|p-i-2yZX&=_JIZgx=11 z3nZz>A<1mpa4JxRl>FK_FOSQ>Zs=>df?^($dYgf<=GuIu*G&cbo1>|5GopJeQk(iC zt-#LR-GDy>XP^!d32_*B6w>UEaIW2p6y;qZ&wnid9*{nUqn*-Qgf{{ zYU61{?1@nsSb=(;%e?D>Ya%>b4a|yIPchJ*+zbSL_-_I4qah7y<09Y`A{Z&62$2I& z59;b%yP0Ur%ZD+DP|!Sdu5)h$8cvpmOYoM2mCkc#Aq9RExmP|>a5ZX^MOWaDrruCQ z>3@N@0fU_14**xjp{@}e1^gEHH_{g$Lp?nU9Dz)j{}HEQ@4v0={N`pA6iNH@tHqUk|(>@Pc{3*YPW*NpS&Mm(~H_L|=Oo8djGhso36> z9gD0iWx$WjGyg%%UvHj22nnvFXh6n~`G3x}Nruiw5yrqH(O0*q0lq@Gz=(tMftTuG4KS$xOKo=XfA4vEYtvl4V^21&!J)8#+2P^Xd8#-$TaW)YU@t(yMHbI zj^smQ3><}jZF>!xbJD_4Gz?!eH2ehVVe1fcW&)E<*nqYFZ4W*|LZk`_ucHxfe&!YmGO#r=I9faiypo{uW~e7){S8+@vi2wi-1-Xjfz+UpXmJ@1-&_U`!@pd+Jwat_kWMxWPijv? z3b8$kf#>j6Bn0Z4X0F*a`7Gjhj60n3u83EFe+Z9v&R+yxjadmu-FVrY--O>5S4@mT zQ43q}=DZ*lAcJobyo%<-0e|NA1dQ;rJ+LLx@Gb67SW#1<9_ffX^A#)r_c`b1VEoaR zfy41420la!`%mDYA3Zw3W7TC67hb$@Ru&=yVXjj1qc z;Ui#`^SgHj|L|SS{)y+1t`>K#n*=V8x@M5K-r~&?5Ks&}ftH@7fXkyU85EOjvA#q^ zq>XFMu{B@86tKZLKQxO!CZrSuSgb)t(4lyyucWvT8C;7IJ{-gr=e$D}e~9cBN`sey z)6o*_6yW&+-*->J6n{mB+sRsG@KOnaH;aj<@FJvMptwPoX~XSgEz^onjf=DKV)6!( zJffh3%P>G56^Ke3EWOrmqk{FiX1l!K|j1Wyrp@FS$~{TonaVk=(&qzPBIs6 zCwni8T!qJ(3rFl-J~qmc=c*jJ1*YUEQvvisZo(fU*I~Ypkt~X$Iv)9l=b-T1VZd_a zZafzSj;}|-Le__S8wwwpiRRow!c*Ly{B{Oq^H>~1;kX#}zzs;b4dN0cd0#+|>O)cD zV7|12j)uN=Xn+0Q426ZXL4Jx>D08VTin2P?dG=aEPd`InA@Hr-viJjOdKCEbLx3C1 z`4n>NmB*n5KZz1wh9Ks&$L~}RVk3$S8-(IlK19Kh1Mr05^@zD0@q&{ubWA}xA~yhk z2;7eYmq#@j6rbYWEF}HwR@4I)(s(w|mS|jCMOgGQ10KS02+NzMH z_zI+)zlJghei3-~QRG-^OY%^aEb8?Z)n%2Hl@<6E*^@{%(GEt9t4F;ca-en$l%b(s zkJp0^L-Va&$9F`-c^!LaYIa32gw4_184MlChkj_jwKyb;0(xrjLjDJnjDa&y0}mwq zK%Zh@27kG8kHaw7Ij;fUu`7{hoEv8+ByL@l4b4K zUe_1(#C`R!&i>k%?dyQjA1oGt$H1rY5|W#t;O)40!TdcXv{ch$p!xe!%;(O-%SEn3 zJli92w;`R(W-pEhei^fZ=go72D9pUnAE_&i;eS57@R202A2^tjmJbu0^SK!3lB=@J z#$({gD26#sd`y-3J1DeNe)L7^iN&vhi=5xpq{G0f&{BT%!Rxu;gub}uti|}Fmg2_K zy#c(3)QnV;nGMG0FA^CQNR`=6Jol~3i#0ex*Ja>twAi*7i$B~g9~wxn7ZwY)7cD1x zAb(O<{MMwqaP-TdL3K7>epr_H5vo>@?CT7SGyh$OH`V|y(Dw-Bh(P0+ zO25OObT^IY;kx$grZtS4c(ND5ymAv!RyQc-$&$Bu}6KIk^6tv1ePGvY-~gfVa({sg{m$c$c|hXC6H2Sg|v1!=inEq?>U z=D%{(Mt4JviG&z>^AYz5{!GP@z_0Ko)?C8y};hKJYsjF`Fci+$zx9XxwmH zhL(vVooh4Erag@!%GaHY|EpaD+?eN?LiEAe`13r1N0JNz+xuRj@%YCZQ4*s?6%kfr zQ5d)r?QY>N^QPh@u;fA^mYD|pnSVyXBT2S=J^^w){tbfGpf>02?NR5KO(@yf4S%~D z=}EcfIXhABD=QL9N05Q#s0~*+*Vd!9MpB>ROwhH+8MM~9b}0&O3`*zMf&ZZt(P1<# zdLRXQH{Qqq(fkDdJt5YjHr7Ucd0Yus1AG?0!)PR0fw+3&F1)>B7US)s)qfPnD&(hm z9M2Ke$I$Ewj9hKYizF&SEt=bwIoGaN0DhTH?IfZyY7+)zrKh}N&G3@xtm z|0Ht$hbqZYkk&G3E!u@+G=3?aLHk^-KuYXniW`mE3GF8LimCI<_}jSF&^UtdIGo5x zdlz3&w$LQB4RS?}`=#6l*_*&^2@jh~dn0ZaZ-1h6{i1EeT}%dA zWRNm#w}NjKUc6w`A;0Zxq=W9aTftlGM*9maLc{wEr0owu6M2|rCkh(Smc~m^yvkxe zX8(-9#dg#?=9=FfQ8-;Mq}U#VB1=0U^Lq>DxvfYk-iU@~4KhtFN8Yj~!T$k1$l1>L TL$0s@0000C0D};1B?vaE5rnan)(wHr?NfTVr9z_ za0ys3wQa9pSAU0KyKfuFmf_A5aAOU)2N$YTU^>Pckkp^Yg91=?l+x(Qbm*|B?ZfFk>PubGxnQ#Q65bcQg_&bvI;ixiD}Cc{Z5?$ zh)yh+#~YcnD~^EVnnS8Qs5AMk8aF1;UZDmlZXAgt6n}(23pSR^s&=u}0KD3>c7Q6a zw5c+Ptp?y-7TJyK>+3!|U*H%M>f3ZapU*0c&BNF#gV?GtOFt`s7otP^lz{|s*#N|D z8SQFSyzox&0N@1K2z6kD4!MvaiwY76;J-B@i%Mhdl(_B_o0UOHcdyj;86YkUR$lU| zF$3A&5r3W#5I$*w1hKS(qp?X42hg?vV;>a#rd`6-s~N59Fvga_6S)3FD^@5*RuYU+ zfz}5G)d6JbnTqr3hAN(8+ZV72t95UTb%c)-U{P6x6?l<_AbE-ENL~3Z+l|dxpfO9} zREdnRxGW7IXdA-r-CF41dllQ1;iQCZ03o-qhkqeql0~F;jwc%9%p+idpKeoRo{m?3)=W;_OB0jAvHAlbTQMLS2DpbH1l}9oe;B^@l%;qcXP^Qv{+r{zl5t_oF;f8c z@cMEB<0NKWSiFA3F>A9hga7fEC2zfqDS6?TwNY*MSry_GB(bQ*3M2Byew%ryQvuI~ zD6E1G12A^jfh$y0YX5%E0LD<^6@bd%{(p9Cr))i~OC4lA3ag6_yIFi9>J_s%(B?f> zcCannm)uWDytNat=z-Hc4lpsC%ITgsXge6hg98swK#dAi%`;Sy*^-WJ^yc&V>H#&q z#~>6N{2XK7(*XF$V6*~;9-gmbJ}f8sbZ_SE0~-_Baj8#oK8Ok!v88ZE1+D6&7eB% zXg1<#3JUPJLlEHBF`L!oCmo*GSybCeh9RHGzok&+QN?SLS6ygd4;%uxt{-$*Ol3=@ zJds`C3~I1VAYk@v*|&-ej5&befq$y1+K-|@BIb2jd{?#*Vp7F7P6Q8163x4qj>8_% z688NJ-#zd6y&eSnuy+I^t)3d}Fab*4-VJ+TdVZd$OoW`rjrdcjH0nr@YTbiPJ;s{n zGE3Z$j>SxE9$8j1E71ktFd?oOX6r!u&5;_b<+o84m6Bj}kxyS%bvPCzgzL2Sgsj}mG^4d!cd%uXeBHYPDEj|K9_;#!s>Zv|Ag}2 zfZI|7*XwIoZ2-jTqtyc$zWV40SmqZLOT!9b&Mx)6fkR69>NUL{NQ-C2XtM(a>;_@Y z7fd*@ERo-5EsE-yvVVfD8-LfUFm|;3G1UD+ZkM z=6Q$pgeGD@&OQ}JZK*JGCQ}V@+cIUL%?!ad4|gJ_f-30uV247nc@CWB#A`w{U-QU! zEu=*Z)LD3Md!;@xOP^H+Tvj?30K73WnIQlob^XXN_>Jn0IAmqZEi+5{*pU-KRi0{Q96}f_qk~C3fVKdLL-e)B zfE%)YG_m8Vh>^S9t>~GE${NC5I~FrU8SOsmfhL6*NGs(BVBi3t-Qs&yd`MAfNNck1 zjya*+3@R5uY~Ps7ALwMz6`%*&Oi9 z9Xi2oQ0dr{63kSK!7mt~f!IE4FlFyQRA6oLDV+6VPYOUhAG}lJhUcT7O2&aj;Y}9| zTv5M9oOlS}-D%p?t#h8>`S`ni9DkQFljj2%8+Pn`1gJr~az2FCKumQ$2H6sjpE3vs z2XWJ6J&R*Hh%385mCi@O8)D`8pAi_gS4aKtF#Z={00>{1>+0)r=Kufz07*qoM6N<$ Eg4S!6oB#j- delta 2925 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 X>kN7ORIN`r00000NkvXXu0mjfPgHLr diff --git a/skin/default/Menu/GameShell/20_Retro Games/NESTOPIA.png b/skin/default/Menu/GameShell/20_Retro Games/NESTOPIA.png index 57dbd7d50997d4170316b7195ac2fe12842b169d..57ca065954b17f9babfc9da62cf77a776ed8464a 100644 GIT binary patch delta 2015 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 Date: Mon, 24 Jun 2019 16:47:44 +0800 Subject: [PATCH 42/63] Remove all emulators to ~/apps/Menu/20_Retro\ Games --- Menu/GameShell/20_Retro Games/MAME/action.config | 7 ------- Menu/GameShell/20_Retro Games/MGBA/action.config | 6 ------ Menu/GameShell/20_Retro Games/NESTOPIA/action.config | 7 ------- Menu/GameShell/20_Retro Games/Pcsx/action.config | 6 ------ Menu/GameShell/50_PICO-8/Post-Up.sh | 4 ++++ 5 files changed, 4 insertions(+), 26 deletions(-) delete mode 100644 Menu/GameShell/20_Retro Games/MAME/action.config delete mode 100644 Menu/GameShell/20_Retro Games/MGBA/action.config delete mode 100644 Menu/GameShell/20_Retro Games/NESTOPIA/action.config delete mode 100644 Menu/GameShell/20_Retro Games/Pcsx/action.config diff --git a/Menu/GameShell/20_Retro Games/MAME/action.config b/Menu/GameShell/20_Retro Games/MAME/action.config deleted file mode 100644 index 699f2f9..0000000 --- a/Menu/GameShell/20_Retro Games/MAME/action.config +++ /dev/null @@ -1,7 +0,0 @@ -ROM=/home/cpi/games/MAME -ROM_SO=/home/cpi/apps/emulators/mame2003_plus_libretro.so -EXT=zip -LAUNCHER=retroarch -L -TITLE=MAME Roms -EXCLUDE=neogeo.zip -SO_URL=https://raw.githubusercontent.com/cuu/emulators/master/mame2003_plus_libretro.so.zip diff --git a/Menu/GameShell/20_Retro Games/MGBA/action.config b/Menu/GameShell/20_Retro Games/MGBA/action.config deleted file mode 100644 index 94177c0..0000000 --- a/Menu/GameShell/20_Retro Games/MGBA/action.config +++ /dev/null @@ -1,6 +0,0 @@ -ROM=/home/cpi/games/MGBA -ROM_SO=/home/cpi/apps/emulators/mgba_libretro.so -EXT=gb,gbc,gba,gbx -LAUNCHER=retroarch -L -TITLE=MGBA Roms -SO_URL=https://raw.githubusercontent.com/cuu/emulators/master/mgba_libretro.so.zip diff --git a/Menu/GameShell/20_Retro Games/NESTOPIA/action.config b/Menu/GameShell/20_Retro Games/NESTOPIA/action.config deleted file mode 100644 index 78dd876..0000000 --- a/Menu/GameShell/20_Retro Games/NESTOPIA/action.config +++ /dev/null @@ -1,7 +0,0 @@ -ROM=/home/cpi/games/NESTOPIA -ROM_SO=/home/cpi/apps/emulators/nestopia_libretro.so -EXT=zip,nes -LAUNCHER=retroarch -L -TITLE=NESTOPIA Roms -SO_URL=https://raw.githubusercontent.com/cuu/emulators/master/nestopia_libretro.so.zip - diff --git a/Menu/GameShell/20_Retro Games/Pcsx/action.config b/Menu/GameShell/20_Retro Games/Pcsx/action.config deleted file mode 100644 index 87d8fa6..0000000 --- a/Menu/GameShell/20_Retro Games/Pcsx/action.config +++ /dev/null @@ -1,6 +0,0 @@ -ROM=/home/cpi/games/PCSX -ROM_SO=/home/cpi/apps/emulators/pcsx -EXT=bin,cue,img,mdf,pbp,toc,cbn,m3u,ccd -LAUNCHER= -TITLE=PS Roms -SO_URL=https://github.com/cuu/Pcsx/raw/master/pcsx.zip diff --git a/Menu/GameShell/50_PICO-8/Post-Up.sh b/Menu/GameShell/50_PICO-8/Post-Up.sh index f2062a3..e8c38e0 100755 --- a/Menu/GameShell/50_PICO-8/Post-Up.sh +++ b/Menu/GameShell/50_PICO-8/Post-Up.sh @@ -4,5 +4,9 @@ mkdir ~/.lexaloffle cp -rf pico-8 ~/.lexaloffle +mkdir ~/.lexaloffle/pico-8/carts + +ln -s ~/.lexaloffle/pico-8/carts/ ~/games/PICO-8/carts + touch .done From 70a4c48c67fc523e69f998fbcae9a278f4ce2520 Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 24 Jun 2019 16:48:37 +0800 Subject: [PATCH 43/63] launcher forks now --- sys.py/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys.py/config.py b/sys.py/config.py index 825c45c..f83ab63 100644 --- a/sys.py/config.py +++ b/sys.py/config.py @@ -13,9 +13,9 @@ Battery = "/sys/class/power_supply/axp20x-battery/uevent" MPD_socket = "/tmp/mpd.socket" -UPDATE_URL="https://raw.githubusercontent.com/clockworkpi/CPI/master/launcher_ver.json" +UPDATE_URL="https://raw.githubusercontent.com/clockworkpi/CPI/master/launcher_ver0.4.json" -VERSION="stable 1.24" +VERSION="stable 1.25" SKIN=None From dd6aa87ee67256ceb886f09c8e008f2c12931524 Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 24 Jun 2019 17:49:43 +0800 Subject: [PATCH 44/63] RUNEVT RUNSYS dirname split space --- sys.py/run.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys.py/run.py b/sys.py/run.py index a16525a..f6067a2 100644 --- a/sys.py/run.py +++ b/sys.py/run.py @@ -343,7 +343,7 @@ def event_process(event,main_screen): pygame.quit() gobject_main_loop.quit() os.chdir( GetExePath()) - exec_app_cmd = "cd "+os.path.dirname(event.message)+";" + exec_app_cmd = "cd "+os.path.dirname(event.message.split(" ")[0])+";" exec_app_cmd += event.message exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) @@ -362,7 +362,7 @@ def event_process(event,main_screen): pygame.quit() gobject_main_loop.quit() os.chdir( GetExePath()) - exec_app_cmd = "cd "+os.path.dirname(event.message)+";" + exec_app_cmd = "cd "+os.path.dirname(event.message.split(" ")[0])+";" exec_app_cmd += event.message exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) From 8e943d2751c23d5cfe9215fb0b76170b2fbe400c Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 24 Jun 2019 19:46:14 +0800 Subject: [PATCH 45/63] RUNEVT,RUNSYS bug fix --- sys.py/run.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sys.py/run.py b/sys.py/run.py index f6067a2..e75f84a 100644 --- a/sys.py/run.py +++ b/sys.py/run.py @@ -343,7 +343,8 @@ def event_process(event,main_screen): pygame.quit() gobject_main_loop.quit() os.chdir( GetExePath()) - exec_app_cmd = "cd "+os.path.dirname(event.message.split(" ")[0])+";" + + exec_app_cmd = "cd "+os.path.dirname(event.message.strip().split(" ")[0])+";" exec_app_cmd += event.message exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) @@ -362,7 +363,7 @@ def event_process(event,main_screen): pygame.quit() gobject_main_loop.quit() os.chdir( GetExePath()) - exec_app_cmd = "cd "+os.path.dirname(event.message.split(" ")[0])+";" + exec_app_cmd = "cd "+os.path.dirname(event.message.strip().split(" ")[0])+";" exec_app_cmd += event.message exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) From fb0c45229c2136bd6f758791ec6ef3a7c64f5f47 Mon Sep 17 00:00:00 2001 From: cuu Date: Tue, 25 Jun 2019 17:30:15 +0800 Subject: [PATCH 46/63] update icons --- .../Menu/GameShell/20_Retro Games/GGEAR.png | Bin 0 -> 2403 bytes .../Menu/GameShell/21_Indie Games/2048.png | Bin 0 -> 2455 bytes .../GameShell/21_Indie Games/Hurrican.png | Bin 0 -> 3289 bytes .../Menu/GameShell/21_Indie Games/NyanCat.png | Bin 0 -> 2207 bytes .../21_Indie Games/Planet-Busters.png | Bin 0 -> 4007 bytes skin/default/Menu/GameShell/ChocoDM.png | Bin 0 -> 2092 bytes skin/default/Menu/GameShell/Indie Games.png | Bin 0 -> 3968 bytes skin/default/Menu/GameShell/Love2D.png | Bin 0 -> 2022 bytes skin/default/Menu/GameShell/PICO-8.png | Bin 1987 -> 1299 bytes skin/default/Menu/GameShell/PowerOFF.png | Bin 3287 -> 1694 bytes skin/default/Menu/GameShell/TIC-80.png | Bin 0 -> 1527 bytes 11 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 skin/default/Menu/GameShell/20_Retro Games/GGEAR.png create mode 100644 skin/default/Menu/GameShell/21_Indie Games/2048.png create mode 100644 skin/default/Menu/GameShell/21_Indie Games/Hurrican.png create mode 100644 skin/default/Menu/GameShell/21_Indie Games/NyanCat.png create mode 100644 skin/default/Menu/GameShell/21_Indie Games/Planet-Busters.png create mode 100644 skin/default/Menu/GameShell/ChocoDM.png create mode 100644 skin/default/Menu/GameShell/Indie Games.png create mode 100644 skin/default/Menu/GameShell/Love2D.png create mode 100644 skin/default/Menu/GameShell/TIC-80.png diff --git a/skin/default/Menu/GameShell/20_Retro Games/GGEAR.png b/skin/default/Menu/GameShell/20_Retro Games/GGEAR.png new file mode 100644 index 0000000000000000000000000000000000000000..3579dd7ca00721ffe2653575045c6b6c2b5eb986 GIT binary patch literal 2403 zcmV-p37qzcP)OYl-fW?y>GmdjIENALq|ChuW3_3jx>} zUdwC*;*4H3pwZ3%s6lJ!m#*#?4(^K47lOOe8Z83dvzfxNbiW(jCmPJ;RRXAiqlpaw zo+*M;07l#rmoQEXfOY_`Y!ltDHyvkd0Hy#(6Pf9WOe^O24pc;U8$i}d7F7c7(%?1{ zrBT(Qwtaq&ft}AtgE0&OrX{~KQ5OLcb ztYWFFx&_};N()*2^P;-3R*(n+?OuokDd_%7k7uIU6fdJr|R}Wkn z>dzxFC=GaK;nb1ZygEUGKQMqL&YH=zl%|E;ku&{WThKccAzN0oH3NVFVMbwJP28An zl;|(t<>0=xRRci-LEudBpr=XcI8?hV1 zH(q!U+)NSm7z4B%dPZKSN-{nTk82WxI~NwwlyggK3yIkg#7+sF=F5RGOnXy376d(j zSkf~+{rAK%!FbEg@D$wM!{>>GtA=S-+lCQgR~Ifo>>>XW>w7VeO0CiH#|g+X$eIHk~lax zj~)!92q!sKn^x-<;a&s+dq{oJeg1_WOdNXk!7yG`wFn}2#@i9(%3#4+yywu3c{nhU z05$|DS+Op2>#gp0&>ssB!1`nrjo>%4E$P6>A-)a4@fSkPkUpcDm^O^cDvoz$pDkkr z^#Zyk!pcRKK%N75u0ZW<(U2q#1JV&9*RYAc04xs|TGLrR0LBnaiZ&)tz(Ww*hEWRe zxoKFfN{oq_qZ4#S&}ma#Bgefp5-AfSjxHU*_jp}$qLF+(h`=eLfdI)zR@Q;Tohf^J zG)Qq@0?-nIwqvBDCc`iM$$?2)J`gcx!*C&PpFsyMF!oH)PkTHJ7Sr4k zZrDa5-0)oG$N}Eal7uBNI}oMBB6ekoa$+P%6M)hYUclNlT(N4HB{M$dpIx%QX;06MjLFw-hds%+QKw;VG`)VL}aP&DhlCR9HPOs zO0c+jJ%ELWC2mR%d?=FKgd%Q8yP#hDlin0pKm`{0hNtXx|Opiz#mi+Yy0iqiwYXk`JEv}bGVI$=(X+ASjWoxxDT%Dkl zs6Mi+!j*b@hHTNXDp zRCRkJw#BiQy?LmiO9Lyl#(@?+cf5@XRflf!&H-+TMq1=ASnM_ZXl7$LW70_D!ZMp9 z<^R&!rI4bv6jsd&+%e+L*;SY z?Tzc#B(_47L;e0ie;4fu_jQE_LZbVJ>)Nc1^=sjXjuA8OI(VTF-AH8|cRL*Ue+pi% zBmbGD9k@YTJ*MsNcaakv51q*LKD=sUz;S)yAMO;0mdBp-eWmR1;GGR0yz?f{U}S~K z8mq_p=wDy6bp}KHt^0Rih~FxG^i#^JP1NDxW4VbS>wI|pT?s3BcmQJst9p0@Xh|!4 zcnEDl-FSEma)m%19>iThl)CEhDEQL6{+2rYGlEimG6MBP`TskNSoCNAcNqT*FaSf? V=S`L2B#?g)XwUK`Ch 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 literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/21_Indie Games/Hurrican.png b/skin/default/Menu/GameShell/21_Indie Games/Hurrican.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4a15da233a0a0ffa608ed4fd46fe9d52f798f6 GIT binary patch literal 3289 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 Xj-}X7ZIO4500000NkvXXu0mjf2@*|# literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/21_Indie Games/NyanCat.png b/skin/default/Menu/GameShell/21_Indie Games/NyanCat.png new file mode 100644 index 0000000000000000000000000000000000000000..f33d593cf32b23f7159e6525a9e9b29a45a7ff78 GIT binary patch literal 2207 zcmV;Q2w?Y#P)<0k8tdsO=~)>JYPnkaJ$g&)I?B4ywz$3O9-*%d%`pg3i(5 z@r?EJ>ASy{oPZs${Qldo9sU9J6R#1erjqlz8l zz9*Fyu=-c7x-oDZ1c0_CA^{3|cx@s8W?xi#eWPOI!~~30Uoe!!QNoOxy%WO z!?JS;Dt6dy((A7=I$FCDBKXMQ`2aC+=-^#}S9OkoMZ;jN9^Nx}1`yAStaD&tt=7a< zIe!b_p{vp+3fK#hNS_-Ra^@{k2liS{BG_eNx<8=M>irX!Ln;b1|~)3e8Yd!($)YCAl@qGCH%y$ zjvy_A=*~%mF*K|^baLl`NTSbfflBFNNEVUtiA;};6fDUCj1bHb|NcoL$q=tWKXZQl zTqVk(rV~2AzUoE^WFG|v+rdS7)fcb8kgwQh8{=4*)XyMdWmO3Lp4ToRM}nd&uEU%K zpb=ui3IRl`J0S9}8`y-sPF_}tt7*IR+5mwYq27W?3D7DVG~UK8p+Jc90%Tk$CQFNEFdy@H+tuk&qn`-M9yk zJUuI7pGukb`2D+d7K%VD>BrsEHjO@2sea^fxJ1-x-KZ5CdKr`nzaCWIV;fjKssK2k$C9DD>y<_aTWQK00`E7-=d3tFw?O(@num`3C_oDhdb)RuL89 zA``xqEYTQi>M+QR+`l-&#fdD*6t#%ow6&!!2lGmDT03}uY|(KW|LKeb6VNj;cV2_!EM-QiMr&M+A_yM6?_LOlY8wpW@+EUz6@yisuaoqNtqFdDV{D{PN zR_4c4gl$7LFd%F6+Cl78J3KRDP@W2ycYj1tPU#JzEf@X3C*DWa3{WR7(J*9aNvRIJ z=GUJOzhJx>V=&%3BIY^mb8NZvglU}&bzujy6S7E8*?tGW14&ICqf63veMH(KtclAw z#n@rju*IT{tc+`%_*PO8XSis#>PS3XcZr#Is)_>Gc4TA9_KzP$+6yM3I&9;^KN~ai zV~2JLr@Zetj_2bNA#sGgr0Zc~nAN_j0l3}sVUtxa;gshUvQHP3flrq4Us)hC)RR#~ z;6Sm@YDl$JX-~}QF(i7=CJRxvq!sQRvi%;IvXiwj2(e3+9WfF(Z9~cL>39b4t^$Ld zkBOlQv2jUU9QY2^|DnW`3(sPlR%Bt7zWWwNqK6wPUG!f{LphNhsl%~d9WW^XEIcm= zQxjcSsso+QOJ-nOwZYMYzb1e07U-$mBZ#6uQ?W_o%R4jn48%@^qQ0!z+KH{WR~3yw zE$OL(BCvVhwDDs1nkt<|Co`yVJ`~V#L+bEG za>!+MVY7L2pu#GYJa}>8riq;h$ilkcp)eq^>rA1d3Xka`7RudgayDj+G!@6>Z#{-$ zx&_(zw*GkLq=#&$$NYgHU#U1-rmzO2ofixa6^!u0LO7OywJ1BX^=U*f-`FD|7oGS> z5$&*&?8~$ON(i@^X7{LN8DU*ZOtb;#TSd0379^FjLrcr-^GL@&C4h)9JsaT~-l>$e z*hdX<=sg~uQTbrbdXbDjC&`GeM26gweI54l%*?BpJTTB!_v&n%D+VpiD(3jyV~q_=m_zarJ4{PN8aZ=Ma;nNiks!$|-IfU} zIPRv?fiw{?b&MBnQdP1pTwwYtWA&BX(rrlyV@=214twBQ>v&M0#WhW6YHb2rx)*3eDTf? zWjg!v<-hGOpFcmb{ln`&;5+>P8wC#t@h`7GA|d{)_0>;?Ra>yr%g0I&0<81t^>-dt z^7I168dml63Q$ige0mA3qi#IC2DwHcPcPzj5T%5jUIp*X>+i7BA0zPUlL4q_%>K_| hWTYPa&td#8zyM$*c!p^kT!8=p002ovPDHLkV1gt%5bFQ{ literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/21_Indie Games/Planet-Busters.png b/skin/default/Menu/GameShell/21_Indie Games/Planet-Busters.png new file mode 100644 index 0000000000000000000000000000000000000000..08231ba252389acfdcee06a6b0a3955fb8167826 GIT binary patch literal 4007 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 NElurAN{zi@{s%CZ7Rvwt literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/ChocoDM.png b/skin/default/Menu/GameShell/ChocoDM.png new file mode 100644 index 0000000000000000000000000000000000000000..55f79292e0f152f453e99583495de3824dc64323 GIT binary patch literal 2092 zcmV+{2-Ek8P)cCs?1og_^iML$90bJ{t~)-8I27T5hyT_gMfDFBpH z;v5|RQM|y1@BRX$1JPjn@y!pB{6hUi_K@|Wwv&A;dn)?_egE#)-;$>05O@Zx55Ugx z)n+3Q*Ys5ay8U7Rl%VzGmss}e9CoGX_l#XdjTV9Kc~-z!y5Ftr3kl}#Spq15qlrxb zp00u`07h&{Ey#%g=n&xYwvc^#s2pzq763;RS<8v695a3h6A}9WGO(!OV zwJPO|X9Uy1Svd!gyQ2XR-t>;yqsD+U1d>>IWy5<14p?V(g&k|i!D9^$7!a{-39o2% zRXxO>TwBQNU(~gYLCrxBXd9*yWT3~##<~(V&X}X2aS!Umk3kLLF@!7dh;<9`3>)Th z$3Prcol9__z=6-G-(hyNsY{5!HF&U<;eqqqxm>72Kn!XKr~=*+*@4YQ@=t9C#C7Kw z7&7R64e&;=l~W}8MePy>eNb{8#d1R_Kk&drqlM}kc&jC&b`_gPpGoEQH-@2wC<}q) zbrXZdsNHC8QpSK0W=TI6MHiitdrnxKcU8j0fSCX zX(%Uj=UCQ`sdAX7%AFjqt5kP>gt@I6Ph6y0mOxBUa8RlonlNy}4E9vCZ3-+z77K$6 z_I*$vGzmcpoX|~~2eZ&fL!8@ZZ7wf)Y}hSe-`s+167<&KI@-^O3>kldpgV;czx9xh z&&9qVJ7KnQ&p>#YPd3=cR_#pQXJER*CK(3o-UgGHF*SSKfm7bnw&T-S_>H^G`R)h!myw1kILUBUKsT^+zt*^LxvmQWlDuRgiJn~y!BSO)Id|cND#W1FUU%7w z-+K_;H&|g6lH35GYmt3yZG;L*3UV7rd+Ty1aG_5U(>9 zA!J~xvxlya(W$XM0;pEj$Ld9JT9=v=xR$@aWn+l&eG1i9S-=8LCldQ(!rW#mClmwB z#DN#)ScP5Bwj)F#AnW(D94DYEI&%ccie)SOeF#=&+1H`#3Hb)FF6a}ml*fo)1Gp$7 z%pi~-RLSfA4xp}{CYg^H_UYA_ooL%Z0QOoq4g;`lUkHHYD5zXd2YUjP`A_k?)v*n> z3r`ioqa_UkH_pn(S$48O06z2OBuX->lmpnL4KzN`2!JoN1D{Pq1djlASbBBV&|n62 z4ldy{gNDX@#u@mL1+2c?n3trq!<<>^(-uX81Ry5JlV_gCt+0CNFuNDJJ~pOj3=)8> z?bAh0Oxi~vz2OIoa1U>`TRZc;?Px{G$RmKaS@sP_HFN+^wPHt%jqcogxh#mV@g^OX zKl-$Txx0TEr}|TP;S253Yc`RU$4u&sW2OLH`^+CpRBo6N-YD#if zpNBa8oY2PC*mybZHY*qA!R*NKcus1l@3kK8X!|H9j>kO8!m7hO*^|>pj#(HPI*^31 zFV<|~)bO6R*q3>FO|QmGS+3`jg`uvJ8R5$oo7n2{D?N8kHT4c1v#+ON^f`bSlrI)e zG~2h#0C}UOcC_*r88PI-Tde>-#91S7}s z>m-kTnE*m<=3>8Dy>|Gl$PyKmK|$3eDPTuG2Yg%Xi^S7sX3|ms8PY?sKk0eu=xL=M z>|5n0-!mSPcA>ibaktDT2s$~du0Q7FvRu?dg=JJ>awC`Eq0NNB<8CkVKK;iZf2QBQ zdPM{LjxqrG{YUvbW0uJ4qY9zLSF(REKNHIy$o`j((Y^}aTGStj_MZ`0jmZeq*TVeYVWg}#{_imU5nur9 WKO>BnI1nxX0000 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 Z0P(3mbeBfGoB#j-00>D%PDHLkV1nzrBkKSF delta 3284 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 literal 0 HcmV?d00001 From d17a89e80ceb3b9229ea3fe1001383f0d5ebbb8a Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 26 Jun 2019 11:30:31 +0800 Subject: [PATCH 47/63] update .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 0eda52c..cb23c9e 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ screenshots/* .pcsx .pcsx/* *.log +.DS_Store +sys.py/.* From 24abd55f8628c2e3845f7ae634b3dca1b05575a3 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 26 Jun 2019 17:11:06 +0800 Subject: [PATCH 48/63] wifilist --- Menu/GameShell/10_Settings/Wifi/wifi_list.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Menu/GameShell/10_Settings/Wifi/wifi_list.py b/Menu/GameShell/10_Settings/Wifi/wifi_list.py index c1d1037..5313231 100644 --- a/Menu/GameShell/10_Settings/Wifi/wifi_list.py +++ b/Menu/GameShell/10_Settings/Wifi/wifi_list.py @@ -569,7 +569,10 @@ class WifiList(Page): if is_wifi_connected_now() == False: self.ConfigWireless(password_inputed) else: - self.ShowBox(MyLangManager.Tr("Disconnect first")) + self._Daemon.SetForcedDisconnect(True) + self._Connecting = False + self.ConfigWireless(password_inputed) + #self.ShowBox(MyLangManager.Tr("Disconnect first")) def OnReturnBackCb(self): pass From 0b733435f64ead9ce76fbf272f2b00a3aff73929 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 26 Jun 2019 17:18:53 +0800 Subject: [PATCH 49/63] 10 times to force wifi disconnect when try to connect a new one --- Menu/GameShell/10_Settings/Wifi/wifi_list.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Menu/GameShell/10_Settings/Wifi/wifi_list.py b/Menu/GameShell/10_Settings/Wifi/wifi_list.py index 5313231..8fa7ce0 100644 --- a/Menu/GameShell/10_Settings/Wifi/wifi_list.py +++ b/Menu/GameShell/10_Settings/Wifi/wifi_list.py @@ -569,10 +569,19 @@ class WifiList(Page): if is_wifi_connected_now() == False: self.ConfigWireless(password_inputed) else: - self._Daemon.SetForcedDisconnect(True) - self._Connecting = False - self.ConfigWireless(password_inputed) - #self.ShowBox(MyLangManager.Tr("Disconnect first")) + for i=0 to 10: + if is_wifi_connected_now() == True: + self._Daemon.SetForcedDisconnect(True) + self._Connecting = False + else: + break + + pygame.time.delay(100) + + if is_wifi_connected_now() == False: + self.ConfigWireless(password_inputed) + else: + self.ShowBox(MyLangManager.Tr("Disconnect first")) def OnReturnBackCb(self): pass From 8c0c6ac86a119a3abc84e131f16ef3858959f3de Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 26 Jun 2019 17:23:18 +0800 Subject: [PATCH 50/63] ... --- Menu/GameShell/10_Settings/Wifi/wifi_list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Menu/GameShell/10_Settings/Wifi/wifi_list.py b/Menu/GameShell/10_Settings/Wifi/wifi_list.py index 8fa7ce0..f9c218f 100644 --- a/Menu/GameShell/10_Settings/Wifi/wifi_list.py +++ b/Menu/GameShell/10_Settings/Wifi/wifi_list.py @@ -569,7 +569,7 @@ class WifiList(Page): if is_wifi_connected_now() == False: self.ConfigWireless(password_inputed) else: - for i=0 to 10: + for i in range(0,10): if is_wifi_connected_now() == True: self._Daemon.SetForcedDisconnect(True) self._Connecting = False From 0f2cf846eb94accd14740b073551604704f4722e Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 26 Jun 2019 17:29:25 +0800 Subject: [PATCH 51/63] wifilist --- Menu/GameShell/10_Settings/Wifi/wifi_list.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Menu/GameShell/10_Settings/Wifi/wifi_list.py b/Menu/GameShell/10_Settings/Wifi/wifi_list.py index f9c218f..c5882d7 100644 --- a/Menu/GameShell/10_Settings/Wifi/wifi_list.py +++ b/Menu/GameShell/10_Settings/Wifi/wifi_list.py @@ -571,6 +571,8 @@ class WifiList(Page): else: for i in range(0,10): if is_wifi_connected_now() == True: + self.ShowBox(MyLangManager.Tr("Launching")) + self._Daemon.Disconnect() self._Daemon.SetForcedDisconnect(True) self._Connecting = False else: From badeb13268fa58ba4489384c1e9f66370d8fc852 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 26 Jun 2019 21:12:20 +0800 Subject: [PATCH 52/63] FootMsg changes for the buttons layout --- sys.py/UI/foot_bar.py | 7 ++++++- sys.py/UI/keys_def.py | 6 +++--- sys.py/config.py | 15 +++++++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/sys.py/UI/foot_bar.py b/sys.py/UI/foot_bar.py index b2cc8e2..4b25afc 100644 --- a/sys.py/UI/foot_bar.py +++ b/sys.py/UI/foot_bar.py @@ -15,6 +15,8 @@ from lang_manager import MyLangManager from widget import Widget from skin_manager import MySkinManager +import config + icon_base_path = MySkinManager.GiveIcon("gameshell/footbar_icons/") class FootBarIcon(MultiIconItem): @@ -134,7 +136,10 @@ class FootBar(Widget): self.Draw() def SetLabelTexts(self,texts): - barr = ["nav","y","x","b","a","select"] + if config.ButtonsLayout == "xbox": + barr = ["nav","y","x","b","a","select"] + else: + barr = ["nav","x","y","a","b","select"] texts2 = texts + [""] if len(texts) == 5 else texts for idx,x in enumerate(barr): diff --git a/sys.py/UI/keys_def.py b/sys.py/UI/keys_def.py index dc59b53..176adc5 100644 --- a/sys.py/UI/keys_def.py +++ b/sys.py/UI/keys_def.py @@ -6,9 +6,8 @@ from sys import exit import os import sys - -from config import CurKeySet - +import config +from config import CurKeySet ## read only def GetButtonsLayoutMode(): lm = "xbox" @@ -25,6 +24,7 @@ def SetButtonsLayoutMode(mode): SetXYABButtons(mode) with open(".buttonslayout", "w") as f: f.write(mode) + config.ButtonsLayout = mode def SetXYABButtons(mode): if mode == "snes": diff --git a/sys.py/config.py b/sys.py/config.py index f83ab63..5b12eb1 100644 --- a/sys.py/config.py +++ b/sys.py/config.py @@ -19,6 +19,8 @@ VERSION="stable 1.25" SKIN=None +ButtonsLayout="xbox" + ## three timer values in seconds: dim screen, close screen,PowerOff ## zero means no action PowerLevels = {} @@ -30,7 +32,7 @@ PowerLevels["balance_saving"] = [40,0,0] PowerLevel = "balance_saving" def PreparationInAdv(): - global SKIN + global SKIN,ButtonsLayout global PowerLevel if SKIN != None: @@ -44,7 +46,16 @@ def PreparationInAdv(): gameshell_skin = gameshell_skin.strip() SKIN= gameshell_skin - + + if FileExists(".buttonslayout") == True: + with open(".buttonslayout") as f: + btnlayout = f.read() + + btnlayout = btnlayout.strip() + ButtonsLayout = btnlayout + if ButtonsLayout != "xbox" and ButtonsLayout != "snes": + ButtonsLayout = "xbox" + if FileExists(".powerlevel") == False: os.system("touch .powerlevel") From 3673da1bf46fd6af70b45d78cb0ec05dba4871e7 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 26 Jun 2019 22:15:41 +0800 Subject: [PATCH 53/63] bug fix --- sys.py/run.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/sys.py/run.py b/sys.py/run.py index e75f84a..33e5995 100644 --- a/sys.py/run.py +++ b/sys.py/run.py @@ -344,7 +344,14 @@ def event_process(event,main_screen): gobject_main_loop.quit() os.chdir( GetExePath()) - exec_app_cmd = "cd "+os.path.dirname(event.message.strip().split(" ")[0])+";" + endpos = len(event.message) + space_break_pos = endpos + for i in range(0,endpos): + if event.message[i] == "/" and event.message[i-1] == " " and i > 6: + space_break_pos = i-1 + break + + exec_app_cmd = "cd "+os.path.dirname(event.message[:space_break_pos])+";" exec_app_cmd += event.message exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) @@ -363,7 +370,14 @@ def event_process(event,main_screen): pygame.quit() gobject_main_loop.quit() os.chdir( GetExePath()) - exec_app_cmd = "cd "+os.path.dirname(event.message.strip().split(" ")[0])+";" + endpos = len(event.message) + space_break_pos = endpos + for i in range(0,endpos): + if event.message[i] == "/" and event.message[i-1] == " " and i > 6: + space_break_pos = i-1 + break + + exec_app_cmd = "cd "+os.path.dirname(event.message[:space_break_pos])+";" exec_app_cmd += event.message exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname print(exec_app_cmd) From 273db99c78f9fd87a489f2487d48fda86a3dbd1a Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 27 Jun 2019 19:41:44 +0800 Subject: [PATCH 54/63] text revision --- Menu/GameShell/10_Settings/Lima/__init__.py | 8 ++++---- Menu/GameShell/10_Settings/Sound/pages.py | 2 +- Menu/GameShell/10_Settings/Update/__init__.py | 2 +- Menu/GameShell/10_Settings/list_page.py | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Menu/GameShell/10_Settings/Lima/__init__.py b/Menu/GameShell/10_Settings/Lima/__init__.py index 96d3ed0..ea509f1 100644 --- a/Menu/GameShell/10_Settings/Lima/__init__.py +++ b/Menu/GameShell/10_Settings/Lima/__init__.py @@ -76,7 +76,7 @@ class PageListItem(InfoPageListItem): class GPUDriverPage(Page): _FootMsg = ["Nav","","","Back","Select"] _MyList = [] - _ListFont = MyLangManager.TrFont("notosanscjk15") + _ListFont = MyLangManager.TrFont("notosanscjk12") _AList = {} @@ -101,8 +101,8 @@ class GPUDriverPage(Page): start_y = 0 last_height = 0 - drivers = [["fbturbo","Fbturbo"], - ["modesetting","Lima"]] + drivers = [["fbturbo","FBTURBO driver (Software Rendering)"], + ["modesetting","LIMA driver (Experimental Hardware Rendering)"]] for i,u in enumerate( drivers ): @@ -284,7 +284,7 @@ class APIOBJ(object): def Init(self,main_screen): self._Page = GPUDriverPage() self._Page._Screen = main_screen - self._Page._Name ="GPU driver switch" + self._Page._Name ="GPU Driver Switch" self._Page.Init() def API(self,main_screen): diff --git a/Menu/GameShell/10_Settings/Sound/pages.py b/Menu/GameShell/10_Settings/Sound/pages.py index 76122bd..a87b581 100644 --- a/Menu/GameShell/10_Settings/Sound/pages.py +++ b/Menu/GameShell/10_Settings/Sound/pages.py @@ -9,5 +9,5 @@ def InitSoundPage(main_screen): myvars.SoundPage = SoundPage() myvars.SoundPage._Screen = main_screen - myvars.SoundPage._Name = "Sound volume" + myvars.SoundPage._Name = "Sound Volume" myvars.SoundPage.Init() diff --git a/Menu/GameShell/10_Settings/Update/__init__.py b/Menu/GameShell/10_Settings/Update/__init__.py index 9058dba..8588cd2 100644 --- a/Menu/GameShell/10_Settings/Update/__init__.py +++ b/Menu/GameShell/10_Settings/Update/__init__.py @@ -314,7 +314,7 @@ class APIOBJ(object): self._UpdatePage = UpdatePage() self._UpdatePage._Screen = main_screen - self._UpdatePage._Name = "Update" + self._UpdatePage._Name = "Update Launcher" self._UpdatePage.Init() def API(self,main_screen): diff --git a/Menu/GameShell/10_Settings/list_page.py b/Menu/GameShell/10_Settings/list_page.py index 99f3585..0ed0b03 100644 --- a/Menu/GameShell/10_Settings/list_page.py +++ b/Menu/GameShell/10_Settings/list_page.py @@ -55,19 +55,19 @@ class ListPage(Page): ["","PowerOptions","Power Options"], ["","Wifi","Wi-Fi"], ["","Bluetooth","Bluetooth"], - ["","Sound","Sound Volume"], + ["","Sound","Sound Volume"], ["","Brightness","BackLight Brightness"], ["","Storage",""], ["","Time","Timezone"], ["","Languages","Languages"], ["","Notification","Notification"], - ["","Update", ""], + ["","Update", "Update Launcher"], ["","About", "About"], ["","PowerOFF","Power OFF"], ["","ButtonsLayout","Buttons Layout"], - ["","Skins","Skins"], + ["","Skins","Theme Manager"], ["","LauncherGo","Switch to LauncherGo"], - ["","Lima","GPU driver switch"], + ["","Lima","GPU Driver Switch"], ["","GateWay","Network gateway switch"]] start_x = 0 From 4e9d7a42f0c6b375872f500955db32e979729759 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 28 Jun 2019 20:36:06 +0800 Subject: [PATCH 55/63] update icons --- .../Menu/GameShell/20_Retro Games/Coleco.png | Bin 0 -> 4258 bytes .../Menu/GameShell/20_Retro Games/Fuse.png | Bin 0 -> 3894 bytes .../Menu/GameShell/20_Retro Games/LYNX.png | Bin 0 -> 4228 bytes .../20_Retro Games/{Pcsx.png => Pcsx+.png} | Bin .../GameShell/20_Retro Games/PocketSNES+.png | Bin 0 -> 4334 bytes .../Menu/GameShell/20_Retro Games/SFC9x.png | Bin 0 -> 4236 bytes .../Menu/GameShell/20_Retro Games/UAE+.png | Bin 0 -> 3570 bytes .../Menu/GameShell/20_Retro Games/gpSP+.png | Bin 0 -> 4199 bytes .../Menu/GameShell/20_Retro Games/mupen64+.png | Bin 0 -> 4665 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 skin/default/Menu/GameShell/20_Retro Games/Coleco.png create mode 100644 skin/default/Menu/GameShell/20_Retro Games/Fuse.png create mode 100644 skin/default/Menu/GameShell/20_Retro Games/LYNX.png rename skin/default/Menu/GameShell/20_Retro Games/{Pcsx.png => Pcsx+.png} (100%) create mode 100644 skin/default/Menu/GameShell/20_Retro Games/PocketSNES+.png create mode 100644 skin/default/Menu/GameShell/20_Retro Games/SFC9x.png create mode 100644 skin/default/Menu/GameShell/20_Retro Games/UAE+.png create mode 100644 skin/default/Menu/GameShell/20_Retro Games/gpSP+.png create mode 100644 skin/default/Menu/GameShell/20_Retro Games/mupen64+.png diff --git a/skin/default/Menu/GameShell/20_Retro Games/Coleco.png b/skin/default/Menu/GameShell/20_Retro Games/Coleco.png new file mode 100644 index 0000000000000000000000000000000000000000..066c8186cc4896bcf59a620eeddcd50ad1961d91 GIT binary patch literal 4258 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 a+qy>N=%%Zo&j!~1BA6T7;7SaSMg9vbHBKP_ literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/20_Retro Games/Fuse.png b/skin/default/Menu/GameShell/20_Retro Games/Fuse.png new file mode 100644 index 0000000000000000000000000000000000000000..112c7d74e8b4fbde899a7be34530cec6b98c3fcb GIT binary patch literal 3894 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 literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/20_Retro Games/Pcsx.png b/skin/default/Menu/GameShell/20_Retro Games/Pcsx+.png similarity index 100% rename from skin/default/Menu/GameShell/20_Retro Games/Pcsx.png rename to skin/default/Menu/GameShell/20_Retro Games/Pcsx+.png diff --git a/skin/default/Menu/GameShell/20_Retro Games/PocketSNES+.png b/skin/default/Menu/GameShell/20_Retro Games/PocketSNES+.png new file mode 100644 index 0000000000000000000000000000000000000000..0a43e69bc1a31fe671e6d956cee2126e5d852f9c GIT binary patch literal 4334 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 AFaQ7m literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/20_Retro Games/SFC9x.png b/skin/default/Menu/GameShell/20_Retro Games/SFC9x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c38fdce51dcfe029a8a3b22c39fdbae799e77d2 GIT binary patch literal 4236 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 bz-^02NYv15u#3!{UjY^-$BnCu+#~)4TK6ri literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/20_Retro Games/mupen64+.png b/skin/default/Menu/GameShell/20_Retro Games/mupen64+.png new file mode 100644 index 0000000000000000000000000000000000000000..8eec6f17fd805a1ff972caeaae6bd1f57bdcfe74 GIT binary patch literal 4665 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 LTA7p>xrhA=C4U3i literal 0 HcmV?d00001 From 7d9146c6cfd763a58cf7983612da7578809c19dd Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 28 Jun 2019 20:40:11 +0800 Subject: [PATCH 56/63] update icons --- .../Menu/GameShell/20_Retro Games/GPSP.png | Bin 0 -> 2449 bytes .../Menu/GameShell/20_Retro Games/PicoDrive+.png | Bin 0 -> 4448 bytes .../20_Retro Games/{SFC9x.png => SFC9X.png} | Bin 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 skin/default/Menu/GameShell/20_Retro Games/GPSP.png create mode 100644 skin/default/Menu/GameShell/20_Retro Games/PicoDrive+.png rename skin/default/Menu/GameShell/20_Retro Games/{SFC9x.png => SFC9X.png} (100%) diff --git a/skin/default/Menu/GameShell/20_Retro Games/GPSP.png b/skin/default/Menu/GameShell/20_Retro Games/GPSP.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6161de41c833837aa9d639d7a6e814fda95bf6 GIT binary patch literal 2449 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 Vm|myu+5Qg%ZDws+V(fALKLN6nqrw0H literal 0 HcmV?d00001 diff --git a/skin/default/Menu/GameShell/20_Retro Games/SFC9x.png b/skin/default/Menu/GameShell/20_Retro Games/SFC9X.png similarity index 100% rename from skin/default/Menu/GameShell/20_Retro Games/SFC9x.png rename to skin/default/Menu/GameShell/20_Retro Games/SFC9X.png From 528e79648b1b0abddac952c68e9d53a7f772b606 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 28 Jun 2019 20:59:40 +0800 Subject: [PATCH 57/63] update icons --- skin/default/Menu/GameShell/Utils.png | Bin 0 -> 2291 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 skin/default/Menu/GameShell/Utils.png diff --git a/skin/default/Menu/GameShell/Utils.png b/skin/default/Menu/GameShell/Utils.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a7f7dc87d46eac84912c27036dee5c887db67e GIT binary patch literal 2291 zcmVeXK0M8tt z!3STyd>Qe`8!ukGcxOL&>(;Fcxc>w0e-G7d<2x;s+j8=w#6nem6H>Vksr01)l&VmFYbE%^er(Z!OX{iv#NmJGf32wy(3k=&&b~7*_Ja1*v1F8N>hs<2-nj{;>-lbkVhN0HV<#VNZh`C zoBks`h@cZpOX5rf#*qh+zy9>;(*s!o+`W6Z4bs@Y)FjSi1KDB7l9ETTEo_sVXccW@ z3+KD+xu<=1DuEF3eq?yGwoK$1Xq(o|xppiMrhRW^(oJdk4?M?Vhf60>K?c29U ztE;OYP`tr&wEd?`mo9z4^;b#XNhFYV4|ag6`yJ2K;rvaO9BK4mcrB8iGjx9ZL2xD@FTWxVE zz>tKfEd-hj)0%s>3g5KKL&*S*k7SDfmWf2Qg?5h|s&PP|8pfWvn1j>oNe(CziA*E0 zPCe6^1U69fQvz^$yG(u`NrZWsI;fukLwt5zO%we>)MF@WmS797;kaj1I5+hzF+6;B zFv{8xM=%+{ltG}!W5as6c_{S^vz0V-MM@5O8mRA%i+@WsMjOp3JKg&=ZTx$46(XK0 zPNMFLJ>hy5&~sH~s4=+;>>qmP9~wa0Vs$7fU`_S&g+p7!7l>w_sdF*l#H+^w?O+4a z!^E864m%J@0nI@nc?0~ST`39h!*0h!4|9QLl6fpcrCW8)3Jrj=FX<3Wc`?sKN(9D! zaVV-zVR96+YS|07%mqke+E__JCL2na{+xjMGF3RGA! z05;P&-EAo$in4tS)-G({sl3Tk1gaE< z53)xtqhD7vbj8Bdobkj=EcD1G$Jyxq)v7Fc(7xaw`IfbjnER7BrH`p=E_JdOnN&uV zbvKfho{lEv{v@u}eEs_MXmxeDl)F-t#hT)uqykn3t? z3870p{xs*h#P^R$-P2HW7eV+S#FU_FjRe0IyUBr7eraT*Rx zkar@FNR^RKBYo5Vvuf3wcCp0*R!}$6P8fZ|Hum>?~U5T9(bnoCq|)OvOW8 z{`u{Nwc6J4@o~S5+us$jU0)^w37zfElUl7iySQuh>wpNNQKy4)LS!y=QR#ow(K+vaSY$t9P;nHqG8-?!6*OQo)LOQA$ zVsc`SOGqUL=yY4KL%PJTRUWCW+s@lI7eXMRJ+)Vh-$mDejWHW>Q#uYAdW1O`MJ3gQ zNuic)&C$D}UcjV1844rLpfCb$bi3V~kT}}Mo)nKD#tqW?^VpJfE(98AjNzJ+=}CTz z0U7HZ=nm=oOZT4ZrrAKRjA;M> N002ovPDHLkV1mhXGlu{G literal 0 HcmV?d00001 From 4f354f28c215ee852cace14f53f31c049821382b Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 1 Jul 2019 20:30:07 +0800 Subject: [PATCH 58/63] add GiveWallpaper to allow the custom wallpaper from any Theme/skin --- Menu/GameShell/10_Settings/PowerOFF/__init__.py | 6 ++++-- Menu/GameShell/99_PowerOFF/__init__.py | 7 ++++--- sys.py/UI/skin_manager.py | 17 ++++++++++++++++- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Menu/GameShell/10_Settings/PowerOFF/__init__.py b/Menu/GameShell/10_Settings/PowerOFF/__init__.py index 79147d8..d55fdbd 100644 --- a/Menu/GameShell/10_Settings/PowerOFF/__init__.py +++ b/Menu/GameShell/10_Settings/PowerOFF/__init__.py @@ -7,6 +7,8 @@ from UI.constants import RUNSYS from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.confirm_page import ConfirmPage from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager + import config class PowerOffConfirmPage(ConfirmPage): @@ -48,9 +50,9 @@ class PowerOffConfirmPage(ConfirmPage): if IsKeyStartOrA(event.key): if self.CheckBattery() < 20: - cmdpath = "feh --bg-center gameshell/wallpaper/gameover.png;" + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("gameover.png") else: - cmdpath = "feh --bg-center gameshell/wallpaper/seeyou.png;" + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("seeyou.png") cmdpath += "sleep 3;" diff --git a/Menu/GameShell/99_PowerOFF/__init__.py b/Menu/GameShell/99_PowerOFF/__init__.py index f5b72c6..740d0aa 100644 --- a/Menu/GameShell/99_PowerOFF/__init__.py +++ b/Menu/GameShell/99_PowerOFF/__init__.py @@ -7,6 +7,7 @@ from UI.constants import RUNSYS from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.confirm_page import ConfirmPage from UI.lang_manager import MyLangManager +from UI.skin_manager import MySkinManager import config @@ -49,9 +50,9 @@ class PowerOffConfirmPage(ConfirmPage): if IsKeyStartOrA(event.key): if self.CheckBattery() < 20: - cmdpath = "feh --bg-center gameshell/wallpaper/gameover.png;" + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("gameover.png") else: - cmdpath = "feh --bg-center gameshell/wallpaper/seeyou.png;" + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("seeyou.png") cmdpath += "sleep 3;" @@ -61,7 +62,7 @@ class PowerOffConfirmPage(ConfirmPage): pygame.event.post( pygame.event.Event(RUNSYS, message=cmdpath)) if event.key == CurKeys["X"]: - cmdpath = "feh --bg-center gameshell/wallpaper/seeyou.png;" + cmdpath = "feh --bg-center %s;" % MySkinManager.GiveWallpaper("seeyou.png") cmdpath += "sleep 3;" cmdpath += "sudo reboot" pygame.event.post( pygame.event.Event(RUNSYS, message=cmdpath)) diff --git a/sys.py/UI/skin_manager.py b/sys.py/UI/skin_manager.py index 53c3571..7064d4e 100644 --- a/sys.py/UI/skin_manager.py +++ b/sys.py/UI/skin_manager.py @@ -135,7 +135,22 @@ class SkinManager(object): return ret else: ## if not existed both in default or custom skin ,return where it is return orig_file_or_dir - + + def GiveWallpaper(self,png_name): + #first SKIN/wallpapers/xxxx.png + #second ../skin/default/wallpapers/xxxx.png + #finnal gameshell/wallpaper/xxxx.png + #loading.png,seeyou.png,updating.png,gameover.png,desktopbg.png + wlp = "/wallpaper/" + if FileExists(config.SKIN+wlp+png_name): + return config.SKIN+wlp+png_name + elif FileExists(self.DefaultSkin+wlp+png_name): + return self.DefaultSkin+wlp+png_name + else: + return "gameshell/wallpaper/"+png_name + + + ##global MySkinManager Handler MySkinManager = None From d4a6c417bbdd1b367d82fced53236f8812618145 Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 1 Jul 2019 22:30:33 +0800 Subject: [PATCH 59/63] Update icons,fix border width --- .../Menu/GameShell/20_Retro Games/GGEAR.png | Bin 2403 -> 4151 bytes .../Menu/GameShell/20_Retro Games/GPSP.png | Bin 2449 -> 4199 bytes .../Menu/GameShell/20_Retro Games/MAME.png | Bin 2062 -> 3786 bytes .../Menu/GameShell/20_Retro Games/MGBA.png | Bin 1983 -> 3499 bytes .../GameShell/20_Retro Games/NESTOPIA.png | Bin 2028 -> 3615 bytes .../Menu/GameShell/20_Retro Games/Pcsx+.png | Bin 2351 -> 4133 bytes .../Menu/GameShell/21_Indie Games/2048.png | Bin 2455 -> 4310 bytes .../GameShell/21_Indie Games/Hurrican.png | Bin 3289 -> 5303 bytes .../Menu/GameShell/21_Indie Games/NyanCat.png | Bin 2207 -> 4396 bytes .../21_Indie Games/Planet-Busters.png | Bin 4007 -> 5570 bytes skin/default/Menu/GameShell/ChocoDM.png | Bin 2092 -> 2335 bytes skin/default/Menu/GameShell/Indie Games.png | Bin 3968 -> 4389 bytes skin/default/Menu/GameShell/Love2D.png | Bin 2022 -> 4408 bytes skin/default/Menu/GameShell/PICO-8.png | Bin 1299 -> 2983 bytes skin/default/Menu/GameShell/PowerOFF.png | Bin 1694 -> 2043 bytes skin/default/Menu/GameShell/TIC-80.png | Bin 1527 -> 3763 bytes 16 files changed, 0 insertions(+), 0 deletions(-) diff --git a/skin/default/Menu/GameShell/20_Retro Games/GGEAR.png b/skin/default/Menu/GameShell/20_Retro Games/GGEAR.png index 3579dd7ca00721ffe2653575045c6b6c2b5eb986..23b92f0a1fe81526c0def45f053180b0e21e09de 100644 GIT binary patch literal 4151 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 WHJ)V4(m`+hwa3`H*i={tANf1&vIC|7 delta 2392 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 bz-^02NYv15u#3!{UjY^-$BnCu+#~)4TK6ri delta 2438 zcmV;133>MCAdwT0B!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o000Ry zNkl@46m7iZqscb2CZ8?iY%_~5Fw_K78yUX9<_j=iU>t5_9BoZ7Wyp3T zi!ZQTHI9ePHe2QkcKf-XA5&pe z&L!mzFW^)b+3PG2Q}8aU}#7vOP|4h;dAuw_!heIfwb0Jz)+`sgispOpca z0i1MXq&qTPGJoS6FcGa)09h$nRnGt(v+YtJ{bj3ChCHVhD|=p7^mc$ITmff(ATc-G4y6!lwJuLSGDs?V?daWx*TP zR~hv$F*~}Qmk^bL%)8kp@G?Mb`ZBRH#|^d$yhZz1@wl*ftGjImF9XEGJny{caoroD z_SS+Y4SlQQ&wxypv;E`|Bsa*o{;9USeS3KL=a-Kk|3<%m*6#!T*&t2$0Tqg1C|B*Xah=~IYvg~9tO zzeK<6CLoAP3WJibU%z_wMf$8kYeNe|U~-61blt%*vaVnafyH6h7pEnvpwX$GC74^#bJ z1b_KO#-o(J_tjHD_8AK+mgoJ~#Xf*=3+fLb>@k2aPxjIV&N^?^&g0OwZCaKZffWGE z5y&Ch6YF#8DYlSV_}(~HW?;)gJgc>E;~12WGgPRxCg&2u+_Xs!3C)^XUiqvItvDhg zWVJp4*fJO~fF~3*yIlRO z43NpZg^1Es81YqFJJwHiRiK?_}6`H4YN09Sy@%)z3C6x<$vcT+7r;f3w9-7 zagyeNO&*H4%2Yax(<(F2jup+s${DLR4()&fYcuI6&(Y0@AlOyu<|aBHWY`fy-#$PK zagIA+qEalFa-%irz)OhB#Aw9H^ z0E;1`g14j3oBntE*cPksq=x!s|v+C zVC0E<8VXEH-G5pHXly0#?2V5+z48%d5hnedl4=^6t~|n=Yj$)w?aabTJ!7CnQ4!|D z9Fxl%nyh%*5H%7@iO8WMM`c z*T-SPlViG`G5SLQHYE^F!HBNs?Go~wWBeVY6f9zx5Px5mWw9?Hj8rNE7iD2ilz-}A zhRIDuEqo`V?^8$>I)eRP88aiY*ypMT+OyIZniL6DIoCk;(dlCfhd8o7o8$8Kj4^o_ z*Co$G?7G;O%0QrgPU=)&#y$wvIuoUeEy_v2)>#Ns#HJNsU!uVm2njzWdQ z*Rmf%iGSdEVURi|f*-ai)VNS@uU#mQ`*sW8^SaviTSZAwlMD`@0eZ+HJtNgr~aO0(1dEcbm{ID0rxL+aNC$$lXTV zbEuMlxZ4W8q^Lhq%l&5r!)38;?EpHw_pAPQ82<|}0K62HBUct`hyVZp07*qoM6N<$ Ef_5d9D*ylh diff --git a/skin/default/Menu/GameShell/20_Retro Games/MAME.png b/skin/default/Menu/GameShell/20_Retro Games/MAME.png index 401ea39595cac0d37c6d788be53b7700f5cf0d12..0f800d731be96b96e43c608a93656661f5edd3e1 100644 GIT binary patch literal 3786 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 z zpE|kyUV8D%^8>HOHahE-n!4^ZcpxSI^qW7!_x+j~(hXtEz9nI$vL`=TMBW@P8L6EB zKp*qmUNw@_U^V07Y{sGU3?K8t|M%S^6f%WbYi%XWifI@9?&nb9or9VG?oc zL}@A4`}sgtK;hzhYsY$$4aTX{yxNC(F7wJX*&SB2_p;N$j%6J`Oj1w1Z&FNbxHyHp zgYlfv;BcswXzi05$+u+oXZg!hS-XEdm+&Bi717$@G?>$rzkH>CCoRO~@U8wS&yfD9 z%9Mk|#1mH{-xM`vWiXz*Dja(1vI{R(=C)+UL^|$brSVs81)St(L0#J68)Mmo$(O!Wo0VJ7@ zk?dc*cL2e<30D=_v3qfVBKvx;nU+ygHntjchC1=YJS)xW?LK3&3O4eIY0DD*PMraW zPAr(m8=15#j)3HvL#jNeGx@C=Hzv?tp#~{#9El?ognvH^HkQk(cCpm}yxOyNfGVxD zsWOPI2H;&5*^TS#>pnbR;20C?+jKsk&nk?~!`Lc=*s3r~KP!M2qC@+Xfdp~c0K{$? z?P^uL@J{dm-~`zSbzp=JxsV}?3K9w6zcnI@N@MMmxb731l|e~&uhjM#ATA76Uh=9j z1KHjYo_`P!K52pkv9yDuu}KgI(6#_$9~AwjUBcC?8LjIu#+Jboxc)>dRwzbR5{yxS z)&~aF0c7c!iu3A*DxPE87qAJdb#IJygpU(oQCWo*c#(x5d5P*sUHLBCjm=r0F-zc7 ziHxwgEDa!N8^Z40TIk<<72A~Iq=an%A-AxHA%9_#MWl9)CmQ49^wXf3kz)V9K?coA06O+QR`U4u}BxYP#yne(nYqKze|M8e5Z@r8udEuC~QEm2F72*^mv8cuhBl5<6n|Y{H0nddf ztbz^$Fm~91D^yf!|9;N^#!%rEfXd+hc7JTAY(1?@9b`QUtBVf1S$rbu6|*?d<~>$+ zur1t|+)qiowG*-Efzv$>Ffp9U>7F=fI~c@+0}oF?jS5uFGgOh;l8$Zk=JWaL0X4nH zAQT(?9An?p0QksYv;u}6p08s*EGPMNZ|3a-8xz@asZVl1=^onYOqZpVD@a;w~7pmIe_7Ts(-55kD@>#=5<+oSGEvhQpGn;1P@9Q&AXV6!yeEQ z_WcasJ@5Fv9t8WacLXA>o*L{h0ZQH84SQgEex9gIgq+8X_*1Af>PV1k-Gfa%#+v6c zOWcr-#Y}A;SynSE(FNZyA+8u^>p=R=ks7Pzw^0?9l3;a_PhVDbI2I)2n13k-E@5XV zp!RJ&8*VcA1`9Gn&X|Vk>oZMQt{I4x_iEX~P@ITpB`gz8L}9Z&mx1TP>Un4Xg!12j z+foD9>uXqT0L1E})dLy6`sfH)<`)!8!wO-}F7>^ELrVGTHN754i)Y4YvjYX}24T$? zOgOPDk>6)6it3rNe}b(W*MF-qTppq4D;By~CnyL0OA9r+VzaeC$w;c;BQlaJ2AuNd zd586cCSpL&J{3l7sW5XUQw?$3GG(F748b-JcOs^OD(LrMheEM=4xHx1YeF<%^T>BC zq(uzWS$J=Ir9LrBpH&82Ryq~{yfHGFApjzE{m3x*jp~j#XCae)TYn5>Eaa=w{R1+A zDZm>djhleMq1b--w9a@M#(nE`<5?RmGfVo|krP2xo@!d90{2{^>gAqRoa@?1+MN`tsFX$1ExB7v43xByG>DZGJ%v6iPFBqVK*gk78W$!;!U~Td#ob_W*3P3y`yi?g#gn00000NkvXXu0mjf D*l(6u diff --git a/skin/default/Menu/GameShell/20_Retro Games/NESTOPIA.png b/skin/default/Menu/GameShell/20_Retro Games/NESTOPIA.png index 57ca065954b17f9babfc9da62cf77a776ed8464a..086e69427674307c4387b68d4e4d2423d856f7fd 100644 GIT binary patch literal 3615 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 delta 2014 zcmV<42O;>M9PAH}B!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o000M$ zNkl6k3N99(MPGIQ-)>hdR9?K^X z-E9|oCLWijyX{t6ZnpsUL4KwI5`Tn#qBnz)WlQA4hwuI15r2RKvPSvz@nc9|B4};e z*!vc|7fDLnlD3StXLz4}{q`+eS04h;fH81-v~_5U0WcTB08D7Rqis$BUG5Zs6u3Tp z=>m8~Nq|Y5QG^1JNUjsZkDRd)3`9}pwB6F{%(fOlVA~hkF2F3Y879!d#L>NC7@)Xd z{)~xJ+9q|eGJo&{Tn4O|*6pvruU-J#!@7YC94pU&8y0{Y`!J;v*D)*r$@H0Q6o6Dw zW;U0|AFUNQ1t6L07*PGvwF3yOyTqnK6&sNa6sqf};93T@Yz!=vVM<(~$jV0be4RO& zhL5~L)-ngZm)-ybC2ml}8@TiP`$+Q#4u&Naas!41O=A{Eo+5_Hp%bHE^$nQ|bBx=#>^#yW)osv!O@ zo1Khn0wh8fB4ZpL_#q<10cE0cAcO+Mkbk!rM1Msl`~?8W45}&-s&t&{D5}ZwO2*N9 zC+PDmHTj#oJg`bMOnF2>{0uB+*o>qm4D7prw_`(Q9d%Nh8GN5Vu8^9r4g2uu-h05PiiJfBxQCoJGQ8gy z5`XK@*o+&nR)=Q1^1J+;v>|wpra`ZL%`~d33uUjZfG*0K-sz(Sk^KL zfJI$(WM07Pe*n>n0VY$6T#GwxA3iXuU|_cpNHUSGnleRGycT942hV1mNv!CbT*<8_ z1F>$VW}G1=_izyDAf-&@gXaj`ssMtqY=0n$#2+kOM+BJ7nhx2+&EnbP{8m@rXG;_2 zB;!+E(tv7n2oy~$eUeWTwn=?VQyGjAi^gHYMaOAWi#$hQ&cL!D5(|>)RHC!-Ks536 z%K`hAbxz>~iLzEQ&2*!{Ezz9Vw9hFFQVw9-f$s`Evri?6@JN|TI&b3#IackaqkqnK zd;`b|3Y1NWf|<+M)3LZc?`PN~uNObsGVq@G6_tE$CYTf3M&gwftbCwl1P<3!g-H~d zB4VX6fD9`dfpg#Aupq4+VuUBGVV?ZYoVjb5bGusDgb`@3Rq8_mhEMTGi>g z0Bo0-%Y|S%RAM5Gw8aUlS=OMic{<|y2&U|DR??^Wi}#Pd4K%E+Anz<=AC8Q50v zV@rWI&!EPHH%TfKX%yf=<8+4wFd&z*G=O4y1H@wEC5^uP7GjN6HB6! zYhOWm$vL>5=HO|QJt(13CC|)RbaB09fr4;Cc1TbJX3x*FCYqG@A+vV|puuu7Q(xp$ zy10>0NJ8J`o}rU4|NIv>^sAngHYX~vy_GBw5xL&@LZVZY(0$tkrKbpL0n6!8R>fk ztX@{>|9E&v-ya>Z0^~dT`pn*|T=DSm@ZSp16G&#?k(VVGxN-SY@_#oKKblCcRrUSf z9v>f5Mf2@LoLEx!ed50_mb0c{lB~@XSvZ4axg|?uAmLqzQW}WVosz!|HJp1=a3@Jg zvdl_tGY$3)5k^D?-~{YEUjwJHPH-ygD1gu|No(>MLCN1#iwX%0A`UFA3Z01t`$D+S ztF02ERr-9?S)zELQGeEY+A{xlpt=l?V)6t4zS*@PDyU8X=@7tFG2@IFF3en4 zai1#N?iQ4w&ob`sd|I|`he|jo8sI}Ij%7R8rMorR?!>~5#eX}ti}5D`kEKCh5qYHk zJy5vV4J69S+u*kxypX&cZ@{K(r)8g4d8~O(G`GQTF?hw}4Jvo4?hl=K4W9c$Cm+8={l6Oe@XJ&2nP*6(DS w4&p8`rTtOxj##<>X9SM@)mHyIjQ<1}08k9B>nh2`2mk;807*qoM6N<$f@AEsPyhe` diff --git a/skin/default/Menu/GameShell/20_Retro Games/Pcsx+.png b/skin/default/Menu/GameShell/20_Retro Games/Pcsx+.png index 52fb779db5ba626324c8b86993c73d13abbfa60c..d05300d7ecd0c39f13565e4296ff06f5aeb36097 100644 GIT binary patch literal 4133 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 delta 2340 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 TZIO4500000NkvXXu0mjf*M?T} diff --git a/skin/default/Menu/GameShell/21_Indie Games/NyanCat.png b/skin/default/Menu/GameShell/21_Indie Games/NyanCat.png index f33d593cf32b23f7159e6525a9e9b29a45a7ff78..028a75227bb494bc063612b7f23f6148a181b53f 100644 GIT binary patch literal 4396 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 EpEcHsCjbBd delta 2195 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∋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 delta 3234 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 delta 2080 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 KMNUMnLSTYRMeefz diff --git a/skin/default/Menu/GameShell/Indie Games.png b/skin/default/Menu/GameShell/Indie Games.png index aaef551571f44a1fba02960be7ebd439a7c9382c..deecb6ba7aa84ad96e828fe7c233635448991a03 100644 GIT binary patch literal 4389 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 literal 3968 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 delta 2008 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 diff --git a/skin/default/Menu/GameShell/PowerOFF.png b/skin/default/Menu/GameShell/PowerOFF.png index 8a21c823094c54cda04d60862779a43cd38090cf..3b05b4eeca99eb856779b47ede01378337be189a 100644 GIT binary patch delta 2030 zcmVv5y-?6vlrxCj}~8P=HdzC{d(Ka|abg2+m({ z$!1nb7oSLzhU7{l(CMTU2npRCO&ZWS5&|NRHaS5-(%&+g8?`TX9@o0&J`3S)$DoCeSUj(-4k?b8qYz%I}M9ss-2 z^ZY^t%z;XoFB6WlNI=+WgD&cNCakRU5hagXCi~hk+pGX0+nF52r6&Zx5PZ*?73O_w$MQ z`5%CHfY(*>%fN*b^Yc$0?(Gdk;y@ax$lEfKTLdP%576y)2g$NfR4VDkQ}y>c@w#z& z5KkdDfhpu|NY7i*6Q+g05W;cRi8q3|Nz6rHN}ZSZl4&Cl5|tx&otXIs)!N=C2YE1^ z1VSo_Z+~UA&ee=eYXq)}PTq!2Ubowgd?pE|Z2ja^Wzs!}8gNT-kczns8CHqWpbZh-+wl>Qq>7mns+z61UyYENy&JXURmFj zZFw)l#W5Sr4nchw>++?U@G8-Pfwi1odT6#?;7!?^XTnR`1-}%Dazbg>q`=qC zm!L;rL%UFh`3{1jO>+?F+%y2HYScxCUy?A>2w(pq9H&twI&8B)?uqb8hT=xA2Y(l< zz=D?W!gkvRfX>lEm8ko&Q?4vi37w;Q%!Er8W*VV$RId_`FqkwM{(jmY2XSW`2DrNPv|tcZ7;crZx)77~**Id06l zeGa^BNybc!vkp9-=O*Eblfo7M5r51#-xaR-N4Vm=evg`U3tPuUMQAA)CxLI|G`H{6 z@dEG(a0vJ+fus-Au>yQ-N5pJY31;0xnDNdC3ik$hNEkD}S;rD>?kfAJy@wWtS%MUg>#$=t%q8#U-NgAZ1`qxZ)8x zf|7(Q@ulKYkhVE*>uDv-$DYn=@HmqJg5V&S<35>rF={@wDWD~5$J0dYQk}v zW0)JZInn+IIHtaSW+l%cieIn)d{8|R6~@)kE*9yCrs4Xi83q4lg0zh$kg?O zd$Mpi`Rdoc1+FCFK^ zIdiGkW5&N`V}<=(}Dn_foHs7aQv6cDqxv*btHlw12YLP|M6*4&RcVm)a_a z3lFDdxoZl6TSOa<*tQ0dJo>#c<=05faMBiBXTc;eL18kj&gzo?X(q6cCI4{HDxW4A zwXmgLICZF0DhHnseKwuwWaXD@URbrhrrB;Om7i*;GMGdExwo#ey7A65m~g0hrEk0w zLXo&mJTP;4T4$EVDnDL?^(w*B2Ww!hPasxjMuadgbK0JVVG zCbX6?+XmSZW*c!^!fY#ei{6X>F5t^fc4 M07*qoM6N<$g1R-{fB*mh delta 1679 zcmV;A25|ZN51tK>BYyxHbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU& zKuJVFRCwC#olS1zHWbGx*NZOI6GYulVdn&vPY@5LK--75C@p9M{@)92IVszoi`jwrX*676%ruq3^Ee=)Bk<&OMmg0#q!I~KZX1Q>J_g6 zsYNB_^}uVw>oa`+Qv?Yr zoau<(o&nWqeZqzRxPvOE4t)99JuK?opx#;XEM5`T1Rj#`VPlEVFQk-#7cF{j`y(NJ+Q-$~L z$9F--Sk!ij-~avoY_11=QCfkRaPGv-`GseS@My4UTbXf)v7!<;LL>v_zoS8i z3S;)N#{B{i$A6*$4-NU1-?_QnX>tp9hE>f78vqypGZ^;uh*=$jhv{|O3y;WK5==rG zg@12E0^GJnqq^Euwv?Hyz{eIo_+`u5^Z11Van{9j1nW}SlhiNlF|w{}Y6DKk{2oZpXG!B&jA1sMrWhn}=~D72))<+<@N zuirrc;h&yD{iXk$>K^mm{OG1%Tl6H%wtul45YUBI<@{t#hNmh%h^i zL>>?zn9|IW3PYxER@`JpF(J$tRp9Z)aNgF^+OW=r_6^C^wDkqgBKwqC4{iBCp8ky` z1#UHf^AVm%vLlu4yd{cYlZXxXeaZ1258%<=M-7z}9e&**7(Ekw&^Z|^?|)v)nvIDO zph#}-48clre3s6XBQh|PJ(pO02~ggB#J?LkZ4P-FSDMMh9rkByUEe|VW$s>+XQU$p z=$llb>RF8zl{s+@kvtp2hzb)T&s!w_s!N9Yl3aii;W~cls)a17wrQECzD$5fn4XQO zGQ68KIV-G^-mnUjtk`#YW`E|Z0GPKb7vT-T(Qo*Lt`!4HOr97_zi*lSGa~~W<@j<0 zRWRKR$s95l_}yW{{Qg%zY)CG0Pb92-4E~ajyJEko2*7m9A9p1(b_cEt+?PA@|24c) zNB++)YvKjQc)_D0@kU*TH&)rPtF$hRid&HUuu~8-UVE}owKDhOoqw7y-ub4?%|3qo z_wd7;H=jvf^(*`g|9+wHKoI}%`Yj6LH>0n9DtKx!b1xq&-3W-z?)7&Xo}_yLqk*UD zUID7<3A>ljR`iYTHOK}*x)*U*Fr_JTuY%W>^@q&;F#@eQ89*H{^*@J^kZS$UVf-(^ Z0P(3mbeBfGoB#j-00>D%PDHLkV1kxfBn1Ef diff --git a/skin/default/Menu/GameShell/TIC-80.png b/skin/default/Menu/GameShell/TIC-80.png index 8acb23b947902fe2d6a95548603a1696f1541065..ef1aab47d1f9d85fbae1bc2d7e74d9c4f8f9b1bb 100644 GIT binary patch literal 3763 zcmbVP2UHVT7mit$Dk89gi>$;@R@8J#hz6uefGAZ^q=aNbA|w-&&_RFDr6>Z4Qbe!< z!YZ;03QLfHf>K0Oz{LUr5*tEX0Trb94;Ie;|JlFJIWzO-z3+YBz4zUF&zUs$ty|Pp z^;BUnm^#JT!4rDBFWkzC&@)4Gyc~L|@SJxDU@$f9g?kAszhET{_N_kK+fV36btBP1 z4w}XQLjZI%hXP?RgqgyeMHr9wu(Ikj~0|;q|Xihj+K#C?KKk<^F@xn9)iTDH&hLMrB3xWtgsyo6S z7#snGvmlvaNq9Ws%Y}s0_zWh=)4}PB z7W73%vV=k&34@7>ib6*b&>%k)gR`=-!eH?jJRSuhP=Xk)kQR;N3Jkw8H~<1VpUo4p zK`vr}kro0*2+2su($6k%c#E`L!Iv;W0mDSoco-ZSyWr9%AcMY$<3;epKZ!Hw7$6+r z09>H}!r~UOJQgSf1uXDiP%ke3g8&p-Ds@rgFKyv)79|8i$4JPHF9G>Ww7@%t2Vgt_ z0T{uj1CEi9nT8AA@JRN2fF=a_-XIwM^`P9pnvAfwUpN>m#9CiAmjOlzO#ie8aG(hR zGIC)Zg|$H8iQZT&35O?{nXShXNm%S>C>3O|nK6F}wIX3H{s9VQ4TC16{YNl^PGW+5 z4h`~|&7p+?7#=qiiCByz$sP;``H(PV9pTUO6nlGjKFDN;Lkj}WEp`ZsqrC;r$^tST zjr(LSl}e&;1wtB^4p1D(NGLvNHk(1hnGxs&I+2bd(CG{mjcx`#tY~x;o?vNdhBdPc zp##LP`yD`f#6lK)-Ou<>|KB_dwYiW!Bxkk&I@p*m)#C;1`7#P;BR*ve ziAG-hk@+JER^kM zS1|wV<)^hjmH1aU)HfD}iwz6xhw>_nl0;IJE()=Xcz<%jn**E=gb6 z)K0Y}GWd{V$eO`xN!PENn8LR=4kBZpKMIk@NhY4%>WCwNPI@~Gma-nly?;Dm-QOUP zTZKlCJv7%}p;cv0afQuq7~D`qfHM`p({3A3nN=M8QEXEre?`}=Rw7d1+Eptk=iwJ! z@;Q}U@r=UitUkB?n*0lO2H}0`M$8E(uJ)8+#DI`p#vX@l?z-UWS~g>nXp`Qzwd2`w z?zvRkCV*wcJS3Kv$jg^xGVRB0U?+~uo_^ibwE`x9qg`UZfz_Q@!ZbqJ?!@ymWrus_ z-uwY}uR5&lmq--NX3J_6q;CBNu1Vu{BOV)CVtwNpw}>C-PMWA5kn|)?vUWLGI0c7T zVAvZY8oVP<%B3W~$( zGxsuNH=9Q#t~Z;Mag^UK732l{IE|Nd^vs<&#_1`q&`D%g56LYxMWM12qUV|PidR4N zB;0JB_^DPT-&=)F%T`Hm-FU@Go?LrTgt}@ZlGq4d7KrNJypJG;_Q6I15w)?uADjM^vF&}?rJF`iAyDGEj zrhWSW(I_ATIA1AAPI%HA^8;t*N#uj700qS#ELTfre9V?os-{EJlOIZyF(+>-4sP>l zuf3%Is*|=hs=Pfw!A0`u4Q!giDch!e@O7X}aqaSzu|Zsl1s}}!zEq-_%)cnF?OFHk zTE^+^j6B(4Rg-t<cRaMG%pp3*m*ln#x?$kcK# zF7v5gk`M$ZuHk7Je0u@@eWIw6 zI^IiBvqYuVwh?c}4u((O@k^-?ZH(|a@6rCYygS_Rq9Dtd^vq;9+yv+E+OJ^%m+Jfc zvUm9(+f#aBJ1Cd+s&{>Kxi|7+)8-(X6OGip7esmG$4Fz5q=1AtL!S2S{k}^Ze;S3i z4P@H=!nR91t7bA7zPD;DB=Vqjs+AV+_oU2#43}2?7?ru6&As99#S!rPj zk-7s%GQ8khnoSc8&#;8EK%ctS6sEOiq}nRH7HKqhuhkf~ocC)}Xjb3(u+3;K;s^O& z*g>TUwqs%n%GYz7TA|(+Y3j1!ngr5;Pb4A9jkZiT_1HHbO0!*J_sc|_cC~g}rE8{- zK32XC6x_d2{S91+fCzF>!V2CxjHzT87Mxefnr%tFnwFw3!fbFL!&wzBhTgL-h-ayd zU~=ik_pd&jW1VfhyX{8xqkW1QS_F@8uLfn_J*RbTFAC$EKAookxBQ{{oAsSaaO?bE zc6sebT9(a7mQ3%fnai4-XI#%;-Q340xCMhHD#3HE*@GEA%7bS_8fRRysjT#N3aR^) zU-oi=Hc?GMe4Oy!(cCk9N4s!hZaP?Olo zbsu7C2iSteI6Tj7b_p%zshjkOV2kC z-WGX0v8>HGRzJRa<(2N4Si1D!i=oTMx2zZX(OqT-CGkl?=0{`4oL(TX6E`}fDS^aF zjdqVSrPDn)BO~T|j!C$nU^wUK-VrlY6i6_K_lB4t!roF?<6-vzQi36 zZG7|dD!cfZ8!GP#&s}rhi^*P%6tZ*C>UfKl(-a?#uAlW3+Zv1+_ts85JQNsxj+mB} z9uK;wg2f8yG*9xcG1@M8@mgG6pz+pUx@vhNQh*uM+}k(zjIy%RNiHlF;AYP3&H|q9 ze=F|L85?r5E_5hqEz#6EM@BuH|9NBO?idpXqt(exuH{*cVY|Jhr_PYmbeF>Pm^*(S zdpIPo(W-j&V(VZ8sAr~QSmX6R?s_vj?ZI2xv&qx(bkFzY&7*}Oa7=DazG@O%FYSS9 z+w;fOF*@4k>Ivb&(|0-@Z9}btI>^Rsi->`xf??4kZS5*Y!;>ZQGn7!_iYkfZ(H*Z^uDy;T28py$Z`X7C$AQ1jVsLbTN?G=D7?6P z6fLE(Flx~#oWJ?_JaN-`XZfla8=U`&Kk{7<8$Xh#q?NE#x2mO0O3-Zi885royGv>fP;oyiiTX& ztnmlvBBCZhx__2U6~GM@Z39y}t=p7V+|LkQ2i3|`1i4rnfY_T(i9c!$oF+)n!hwz6 z+pR(CtUlqIEu`|jx)p8+wCyMMidLU$1F@zz0L4)Anq0Q&aOspH7B9Uo(?>O9;^wM)Febfh}R^<>E}fkor3y~ z3A}-U=0$k!I>bICt z%$?P*P5WiWEJdATqF`^Nb$UwhONp~AYvB?r3h*llnitF~(-+PZR{sHF{wICLCF5Et zl1+fj9yL(_?xlgd}B zG?k-s;CyDaqN&VLnLV^cJqZJVKee-I#O-?K0;Ydnx@;V~=U0|S3m z%(?^+=YG(&5id5qQERlJ8@ua$@zC!|M{$O^RGhr@*`xqQXPxY03XweAZd=KXUB9XPz1Ov!nt%>9)Y< z9~Sw3-gKg38@1jGV?`qpAI`VQoHMpP(VoE08}C%yc;}VL#cpqZC+~N5?wqHE%b(#h z{QCy?w!cJqjSBIl)~%m%o?hC_;mya4Zvrw6-u}+QljIE;Yj~=>1*oMb%$v}b^o_g? za*ZH)BkmHW6gj*VytSx5boj>ztj1&jb=T4VIgFH))_)G;p8x{@q-)B|l`XYr00000 LNkvXXu0mjfF*@D> From e94897c5ec85692dbc4661040f29380fa26af00c Mon Sep 17 00:00:00 2001 From: cuu Date: Mon, 1 Jul 2019 23:46:53 +0800 Subject: [PATCH 60/63] add No.909.png --- .../Menu/GameShell/21_Indie Games/No.909.png | Bin 0 -> 2723 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 skin/default/Menu/GameShell/21_Indie Games/No.909.png diff --git a/skin/default/Menu/GameShell/21_Indie Games/No.909.png b/skin/default/Menu/GameShell/21_Indie Games/No.909.png new file mode 100644 index 0000000000000000000000000000000000000000..673244d97c848ff96f13fe220f29bca0816817ce GIT binary patch literal 2723 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 dXX*bA Date: Tue, 2 Jul 2019 15:09:57 +0800 Subject: [PATCH 61/63] main_screen ReadTheDirIntoPages ,ignore hidden files/folders --- sys.py/UI/main_screen.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys.py/UI/main_screen.py b/sys.py/UI/main_screen.py index 8f7715e..3348c63 100644 --- a/sys.py/UI/main_screen.py +++ b/sys.py/UI/main_screen.py @@ -454,7 +454,7 @@ class MainScreen(Widget): files = os.listdir(_dir) for i in sorted(files): - if os.path.isdir(_dir+"/"+i): # TOPLEVEL only is dir + if os.path.isdir(_dir+"/"+i) and i.startswith(".") == False: # TOPLEVEL only is dir if pglevel == 0: page = Page() page._Name = self.ExtraName(i) @@ -567,7 +567,7 @@ class MainScreen(Widget): cur_page._Icons.append(iconitem) self.ReadTheDirIntoPages(_dir+"/"+i,pglevel+1,iconitem._LinkPage) - elif os.path.isfile(_dir+"/"+i) and pglevel > 0: + elif os.path.isfile(_dir+"/"+i) and i.startswith(".") == False and pglevel > 0: if i.lower().endswith(icon_ext): i2 = self.ExtraName(i) From 467a5623f6ecf4f2558e4396f05f2879cae83118 Mon Sep 17 00:00:00 2001 From: cuu Date: Wed, 3 Jul 2019 15:22:20 +0800 Subject: [PATCH 62/63] add bluetooth_firmware.sh --- bluetooth_firmware.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100755 bluetooth_firmware.sh diff --git a/bluetooth_firmware.sh b/bluetooth_firmware.sh new file mode 100755 index 0000000..dc9ef66 --- /dev/null +++ b/bluetooth_firmware.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +FIRM=`cat /proc/driver/brcmf_fw` + +if [[ $FIRM =~ .*a0.* ]] +then + brcm_patchram_plus --patchram /lib/firmware/brcm/bcm43438a0.hcd --enable_hci --bd_addr B0:F1:EC:2D:07:5B --no2bytes --tosleep 5000 /dev/ttyS1 & +else + brcm_patchram_plus --patchram /lib/firmware/brcm/bcm43438a1.hcd --enable_hci --bd_addr B0:F1:EC:2D:07:5B --no2bytes --tosleep 5000 /dev/ttyS1 & +fi From be3f53850b414fddab77c1cf985c6848411a04ec Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 4 Jul 2019 09:20:35 +0800 Subject: [PATCH 63/63] make a confirmation when switch to launchergo --- .../10_Settings/LauncherGo/__init__.py | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/Menu/GameShell/10_Settings/LauncherGo/__init__.py b/Menu/GameShell/10_Settings/LauncherGo/__init__.py index 80708ab..7480ac0 100644 --- a/Menu/GameShell/10_Settings/LauncherGo/__init__.py +++ b/Menu/GameShell/10_Settings/LauncherGo/__init__.py @@ -7,9 +7,29 @@ import pygame from libs.roundrects import aa_round_rect ## local UI import +from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB from UI.util_funcs import ArmSystem from UI.lang_manager import MyLangManager +from UI.confirm_page import ConfirmPage +class SwitchToLauncherGoConfirmPage(ConfirmPage): + + def KeyDown(self,event): + + if IsKeyMenuOrB(event.key): + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if IsKeyStartOrA(event.key): + self._Screen._MsgBox.SetText("Rebooting to LauncherGo") + self._Screen._MsgBox.Draw() + self._Screen.SwapAndShow() + pygame.time.delay(300) + ArmSystem("sed -i s/launcher/launchergo/g ~/.bashrc" ) + ArmSystem("sudo reboot") + + class APIOBJ(object): _Page = None @@ -17,15 +37,16 @@ class APIOBJ(object): def __init__(self): pass def Init(self,main_screen): - pass + self._Page = SwitchToLauncherGoConfirmPage() + self._Page._Screen = main_screen + self._Page._Name ="Switch To LauncherGo" + self._Page.Init() + def API(self,main_screen): if main_screen !=None: - main_screen._MsgBox.SetText("Rebooting to LauncherGo") - main_screen._MsgBox.Draw() - main_screen.SwapAndShow() - pygame.time.delay(300) - ArmSystem("sed -i s/launcher/launchergo/g ~/.bashrc" ) - ArmSystem("sudo reboot") + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() OBJ = APIOBJ() def Init(main_screen):