run.py 12 KB

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