run.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. # -*- coding: utf-8 -*-
  2. import dbus
  3. import dbus.service
  4. import sys
  5. from wicd import misc
  6. ##misc.to_bool
  7. ##misc.misc.noneToString
  8. ##misc.to_unicode
  9. ##misc.Noneify
  10. from wicd.translations import _
  11. from wicd import wpath
  12. from wicd import dbusmanager
  13. import time
  14. import gobject
  15. import socket
  16. import pygame
  17. from sys import exit
  18. import os
  19. from beeprint import pp
  20. ########
  21. if getattr(dbus, 'version', (0, 0, 0)) < (0, 80, 0):
  22. import dbus.glib
  23. else:
  24. from dbus.mainloop.glib import DBusGMainLoop
  25. DBusGMainLoop(set_as_default=True)
  26. #local UI import
  27. from UI.constants import Width,Height,bg_color,icon_width,icon_height,DT,GMEVT,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT
  28. from UI.util_funcs import ReplaceSuffix,FileExists, ReadTheFileContent,midRect,color_surface,SwapAndShow,GetExePath,X_center_mouse
  29. from UI.page import PageStack,PageSelector,Page
  30. from UI.label import Label
  31. from UI.icon_item import IconItem
  32. #from UI.fonts import fonts
  33. from UI.title_bar import TitleBar
  34. from UI.foot_bar import FootBar
  35. from UI.main_screen import MainScreen
  36. from UI.above_all_patch import SoundPatch
  37. from UI.icon_pool import MyIconPool
  38. from libs.DBUS import setup_dbus
  39. import config
  40. if not pygame.display.get_init():
  41. pygame.display.init()
  42. if not pygame.font.get_init():
  43. pygame.font.init()
  44. gobject_main_loop = None
  45. sound_patch = None
  46. myscriptname = os.path.basename(os.path.realpath(__file__))
  47. everytime_keydown = time.time()
  48. passout_time_stage = 0
  49. last_brt = -1
  50. def gobject_loop():
  51. """
  52. here to receive dbus signal
  53. """
  54. try:
  55. gobject_main_loop.run()
  56. except KeyboardInterrupt:
  57. gobject_main_loop.quit()
  58. exit(-1)
  59. def RestoreLastBackLightBrightness(main_screen):
  60. global last_brt,passout_time_stage
  61. main_screen._CounterScreen.StopCounter()
  62. passout_time_stage = 0
  63. main_screen._TitleBar._InLowBackLight = -1
  64. if last_brt == -1:
  65. return
  66. try:
  67. f = open(config.BackLight,"r+")
  68. except IOError:
  69. print( "RestoreLastBackLightBrightness open %s failed, try to adjust brightness in Settings" % config.BackLight)
  70. pass
  71. else:
  72. with f:
  73. content = f.readlines()
  74. content = [x.strip() for x in content]
  75. brt=int(content[0])
  76. if brt < last_brt:
  77. f.seek(0)
  78. f.write(str( last_brt ))
  79. f.truncate()
  80. f.close()
  81. last_brt = -1
  82. else:
  83. f.close()
  84. return
  85. def InspectionTeam(main_screen):
  86. global everytime_keydown,last_brt,passout_time_stage
  87. cur_time = time.time()
  88. time_1 = config.PowerLevels[config.PowerLevel][0]
  89. time_2 = config.PowerLevels[config.PowerLevel][1]
  90. time_3 = config.PowerLevels[config.PowerLevel][2]
  91. if cur_time - everytime_keydown > time_1 and passout_time_stage == 0:
  92. print("timeout, dim screen %d" % int(cur_time - everytime_keydown))
  93. try:
  94. f = open(config.BackLight,"r+")
  95. except IOError:
  96. pass
  97. else:
  98. with f:
  99. content = f.readlines()
  100. content = [x.strip() for x in content]
  101. brt=int(content[0])
  102. if brt > 0:
  103. last_brt = brt ## remember brt for restore
  104. brt = 1
  105. f.seek(0)
  106. f.write(str(brt))
  107. f.truncate()
  108. f.close()
  109. main_screen._TitleBar._InLowBackLight = 0
  110. if time_2 != 0:
  111. passout_time_stage = 1 # next
  112. everytime_keydown = cur_time
  113. elif cur_time - everytime_keydown > time_2 and passout_time_stage == 1:
  114. print("timeout, close screen %d" % int(cur_time - everytime_keydown))
  115. try:
  116. f = open(config.BackLight,"r+")
  117. except IOError:
  118. pass
  119. else:
  120. with f:
  121. brt = 0
  122. f.seek(0)
  123. f.write(str(brt))
  124. f.truncate()
  125. f.close()
  126. main_screen._TitleBar._InLowBackLight = 0
  127. if time_3 != 0:
  128. passout_time_stage = 2 # next
  129. everytime_keydown = cur_time
  130. elif cur_time - everytime_keydown > time_3 and passout_time_stage == 2:
  131. print("Power Off counting down")
  132. main_screen._CounterScreen.Draw()
  133. main_screen._CounterScreen.SwapAndShow()
  134. main_screen._CounterScreen.StartCounter()
  135. if main_screen._CounterScreen._Counting == True:
  136. return True
  137. try:
  138. f = open(config.BackLight,"r+")
  139. except IOError:
  140. pass
  141. else:
  142. with f:
  143. brt = last_brt
  144. f.seek(0)
  145. f.write(str(brt))
  146. f.truncate()
  147. f.close()
  148. main_screen._TitleBar._InLowBackLight = 0
  149. return True
  150. def event_process(event,main_screen):
  151. global sound_patch
  152. global everytime_keydown
  153. if event != None:
  154. pygame.event.clear()
  155. if event.type == pygame.ACTIVEEVENT:
  156. print(" ACTIVEEVENT !")
  157. return
  158. if event.type == pygame.QUIT:
  159. exit()
  160. if event.type == GMEVT:
  161. main_screen.Draw()
  162. main_screen.SwapAndShow()
  163. pygame.event.clear(GMEVT)
  164. return
  165. if event.type == RUNEVT:
  166. if config.DontLeave==True:
  167. os.chdir(GetExePath())
  168. os.system( "/bin/sh -c "+event.message)
  169. else:
  170. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  171. if on_exit_cb != None:
  172. if callable( on_exit_cb ):
  173. main_screen.OnExitCb(event)
  174. pygame.quit()
  175. gobject_main_loop.quit()
  176. os.chdir( GetExePath())
  177. exec_app_cmd = event.message
  178. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  179. print(exec_app_cmd)
  180. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  181. os.chdir( GetExePath())
  182. os.exelp("python","python"," "+myscriptname)
  183. sys.exit(-1)
  184. return
  185. if event.type == RUNSYS:
  186. if config.DontLeave==True:
  187. os.chdir(GetExePath())
  188. os.system( "/bin/sh -c "+event.message)
  189. else:
  190. pygame.quit()
  191. gobject_main_loop.quit()
  192. os.chdir( GetExePath())
  193. exec_app_cmd = event.message
  194. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  195. print(exec_app_cmd)
  196. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  197. os.chdir( GetExePath())
  198. os.exelp("python","python"," "+myscriptname)
  199. return
  200. if event.type == POWEROPT:
  201. everytime_keydown = time.time()
  202. RestoreLastBackLightBrightness(main_screen)
  203. return
  204. if event.type == pygame.KEYUP:
  205. pygame.event.clear(pygame.KEYDOWN)
  206. return
  207. if event.type == pygame.KEYDOWN:
  208. everytime_keydown = time.time()
  209. RestoreLastBackLightBrightness(main_screen)
  210. ###########################################################
  211. if event.key == pygame.K_q:
  212. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  213. if on_exit_cb != None:
  214. if callable( on_exit_cb ):
  215. main_screen.OnExitCb(event)
  216. gobject_main_loop.quit()
  217. exit()
  218. if event.key == pygame.K_KP_PLUS:
  219. if main_screen._CurrentPage._Name != "Sound volume": ## name from Menu/GameShell/10_Settings/Sound/pages.py
  220. main_screen.Draw()
  221. sound_patch.VolumeUp()
  222. sound_patch.Draw()
  223. main_screen.SwapAndShow()
  224. #pygame.time.delay(200)
  225. #main_screen.Draw()
  226. #main_screen.SwapAndShow()
  227. if event.key == pygame.K_KP_MINUS:
  228. if main_screen._CurrentPage._Name != "Sound volume":
  229. main_screen.Draw()
  230. sound_patch.VolumeDown()
  231. sound_patch.Draw()
  232. main_screen.SwapAndShow()
  233. #pygame.time.delay(200)
  234. #main_screen.Draw()
  235. #main_screen.SwapAndShow()
  236. ###########################################################
  237. if event.key == pygame.K_ESCAPE:
  238. pygame.event.clear()
  239. key_down_cb = getattr(main_screen,"KeyDown",None)
  240. if key_down_cb != None:
  241. if callable( key_down_cb ):
  242. main_screen.KeyDown(event)
  243. return
  244. def gobject_pygame_event_poll_timer(main_screen):
  245. event = pygame.event.poll()
  246. event_process(event,main_screen)
  247. InspectionTeam(main_screen)
  248. return True
  249. def gobject_pygame_event_timer(main_screen):
  250. global sound_patch
  251. for event in pygame.event.get():
  252. event_process(event,main_screen)
  253. return True
  254. @misc.threaded
  255. def socket_thread(main_screen):
  256. socket_path = "/tmp/gameshell"
  257. if os.path.exists(socket_path):
  258. os.remove(socket_path)
  259. server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  260. server.bind(socket_path)
  261. while True:
  262. server.listen(1)
  263. conn, addr = server.accept()
  264. datagram = conn.recv(1024)
  265. if datagram:
  266. tokens = datagram.strip().split()
  267. if tokens[0].lower() == "esc":
  268. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  269. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  270. if current_page_key_down_cb != None:
  271. if callable( current_page_key_down_cb ):
  272. main_screen._CurrentPage.KeyDown(escevent)
  273. if tokens[0].lower() == "quit":
  274. conn.close()
  275. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  276. if on_exit_cb != None:
  277. if callable( on_exit_cb ):
  278. main_screen.OnExitCb(None)
  279. gobject_main_loop.quit()
  280. exit()
  281. if tokens[0].lower() == "poweroff":
  282. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  283. for i in range(0,5):
  284. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  285. if current_page_key_down_cb != None:
  286. if callable( current_page_key_down_cb ):
  287. main_screen._CurrentPage.KeyDown(escevent)
  288. if main_screen._MyPageStack.Length() == 0: ## on Top Level
  289. break
  290. if main_screen._CurrentPage._Name == "GameShell":
  291. for i in main_screen._CurrentPage._Icons:
  292. if i._MyType == ICON_TYPES["FUNC"]:
  293. if i._Label.GetText() == "PowerOFF":
  294. api_cb = getattr(i._CmdPath,"API",None)
  295. if api_cb != None:
  296. if callable(api_cb):
  297. i._CmdPath.API(main_screen)
  298. def big_loop():
  299. global sound_patch
  300. title_bar = TitleBar()
  301. title_bar.Init(screen)
  302. foot_bar = FootBar()
  303. foot_bar.Init(screen)
  304. main_screen = MainScreen()
  305. main_screen._HWND = screen
  306. main_screen._TitleBar = title_bar
  307. main_screen._FootBar = foot_bar
  308. main_screen.Init()
  309. main_screen.ReadTheDirIntoPages("../Menu",0,None)
  310. main_screen.FartherPages()
  311. title_bar._SkinManager = main_screen._SkinManager
  312. foot_bar._SkinManager = main_screen._SkinManager
  313. sound_patch = SoundPatch()
  314. sound_patch._Parent = main_screen
  315. sound_patch.Init()
  316. #pp(main_screen._Pages[0],True,6)
  317. screen.fill(bg_color)
  318. main_screen.Draw()
  319. main_screen.SwapAndShow()
  320. #gobject.timeout_add(DT,gobject_pygame_event_timer,main_screen)
  321. gobject.timeout_add(DT,gobject_pygame_event_poll_timer,main_screen)
  322. gobject.timeout_add(3000,title_bar.GObjectRoundRobin)
  323. socket_thread(main_screen)
  324. gobject_loop()
  325. ###MAIN()###
  326. if __name__ == '__main__':
  327. os.environ['SDL_VIDEO_CENTERED'] = '1'
  328. X_center_mouse()
  329. os.chdir( os.path.dirname(os.path.realpath(__file__)) )
  330. SCREEN_SIZE = (Width,Height)
  331. screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
  332. pygame.event.set_allowed(None)
  333. pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,GMEVT,RUNEVT,RUNSYS])
  334. pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2)
  335. MyIconPool.Init()
  336. setup_dbus()
  337. gobject.threads_init()
  338. gobject_main_loop = gobject.MainLoop()
  339. # if pygame.display.get_active() == True:
  340. # print("I am actived")
  341. if pygame.image.get_extended() == False:
  342. print("This pygame does not support PNG")
  343. exit()
  344. if FileExists(".powerlevel") == False:
  345. os.system("touch .powerlevel")
  346. with open(".powerlevel","r") as f:
  347. powerlevel = f.read()
  348. powerlevel = powerlevel.strip()
  349. if powerlevel != "":
  350. config.PowerLevel = powerlevel
  351. big_loop()