给Openbox 装上 Gnome的程序菜单


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

相关内容