run.py 13 KB

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