歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 給Openbox 裝上 Gnome的程序菜單

給Openbox 裝上 Gnome的程序菜單

日期:2017/3/1 10:44:39   编辑:Linux編程

思路就是 從/usr/share/applications 裡讀取全部到啟動器。然後找到裡面到執行語句。最後再分類寫到openbox的menu裡

有個遺憾就是純名命令行到啟動器無法執行。比如 /usr/bin/python2.7 這個要在命令行裡我就不會寫了。改天再說吧。

這是用py寫到。所以可以直接 chmod +x 運行。用用還是可以的(*^__^*) 嘻嘻……

  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. # Filename: update_ob_menu.py
  4. import os
  5. #------------------------------------------------------
  6. def xml_char(x):
  7. x=x.replace('<','<')
  8. x=x.replace('>','>')
  9. x=x.replace('&','&')
  10. x=x.replace('"''"','"')
  11. x=x.replace("'",''')
  12. return x
  13. #------------------------------------------------------
  14. def xml_cmd(s):
  15. x=s.split(' ')
  16. y=[]
  17. for i in x:
  18. if i[0]!='%':
  19. y.append(i)
  20. print s
  21. print ' '.join(y)
  22. return xml_char(' '.join(y))
  23. #------------------------------------------------------
  24. def get_item(x):
  25. if x['type']=='Application':
  26. return '<item label="%s"><action name="Execute"><execute>%s</execute></action></item>'%(xml_char(x['name']),xml_cmd(x['cmd']))
  27. else:
  28. return '<item label="%s"><action name="Execute"><execute>x-www-browser %s</execute></action></item>'%(xml_char(x['name']),xml_cmd(x['cmd']))
  29. #------------------------------------------------------
  30. def get_attr(name,f):
  31. for line in f:
  32. if line.lower().startswith(name+'='):
  33. return line[len(name)+1:-1]
  34. return ""
  35. #-------------------------------------------------------
  36. def load(f):
  37. df={}
  38. ft=open(f)
  39. fo=[]
  40. while True:
  41. s = ft.readline()
  42. if s=="":
  43. break
  44. else:
  45. fo.append( s )
  46. df['name']=get_attr('name[zh_cn]',fo)
  47. if df['name']=='':
  48. df['name']=get_attr('name',fo)
  49. df['type']=get_attr('type',fo)
  50. if df['type']=='Application':
  51. df['cmd']=get_attr('exec',fo)
  52. else:
  53. df['cmd']=get_attr('url',fo)
  54. df['cate']=get_attr('categories',fo)
  55. df['terminal']=get_attr('terminal',fo).find('ure')>-1
  56. ft.close
  57. if len(df['cmd'])>0:
  58. return df
  59. else:
  60. return False;
  61. #------------------------------------------------------
  62. dff=[]
  63. p='/usr/share/applications/'
  64. for f in os.listdir(p):
  65. if f.find('.desktop')>-1:
  66. x=load(p+f)
  67. if x:
  68. dff.append(x)
  69. cate={\
  70. 'AudioVideo':[],\
  71. 'Development':[],\
  72. 'Education':[],\
  73. 'Game':[],\
  74. 'Graphics':[],\
  75. 'Network':[],\
  76. 'Office':[],\
  77. 'Settings':[],\
  78. 'System':[],\
  79. 'Utility':[]\
  80. }
  81. cate_other=[]
  82. for i in dff:
  83. is_lost=True
  84. for k in cate.keys():
  85. if i['cate'].find(k) != -1:
  86. cate[k].append(i)
  87. is_lost=False
  88. if is_lost:
  89. cate_other.append(i)
  90. for k in cate.keys():
  91. cate[k].sort()
  92. cate_other.sort()
  93. cate['Other']=cate_other
  94. #------------------------------------
  95. cate_name={\
  96. 'AudioVideo':'影音',\
  97. 'Development':'開發',\
  98. 'Education':'教育',\
  99. 'Game':'游戲',\
  100. 'Graphics':'圖形',\
  101. 'Network':'網絡',\
  102. 'Office':'辦公',\
  103. 'Settings':'設置',\
  104. 'System':'系統',\
  105. 'Utility':'實用工具',\
  106. 'Other':'其他'\
  107. }
  108. menu="<menu id='rmenu-jcy' label='全部程序'>"
  109. for i in cate.keys():
  110. menu+="<menu id='rmenu-jck-%s' label='%s'>"%(xml_char(i),xml_char(cate_name[i]))
  111. for d in cate[i]:
  112. menu+=get_item(d)
  113. menu+="</menu>"
  114. menu+="</menu>"+os.linesep
  115. #------------------------------------
  116. ft=open(os.environ["HOME"]+'/.config/openbox/menu.xml')
  117. fo=[]
  118. while True:
  119. s = ft.readline()
  120. if s=="":
  121. break
  122. else:
  123. fo.append( s )
  124. ft.close()
  125. l1=-1
  126. l2=-1
  127. i=0
  128. for line in fo:
  129. if line.find("<menu id='rmenu-jcy'")>-1:
  130. l2=i
  131. elif line.find('<menu id="root-menu"')>-1:
  132. l1=i
  133. i+=1
  134. if l1==-1:
  135. print 'menu.xml 文件格式不正確;找不到字符串<menu id="root-menu"'
  136. os.exit
  137. if l2==-1:
  138. fo[l1+1:l1+1]=[menu]
  139. else:
  140. fo[l2]=menu
  141. ft=open(os.environ["HOME"]+'/.config/openbox/menu.xml','w')
  142. for line in fo:
  143. ft.write(line)
  144. ft.close();
Copyright © Linux教程網 All Rights Reserved