Openboxにgnomeのプログラムメニューを付ける
考え方は/usr/share/applicationsからすべてイニシエータに読み込むことです.次に、実行文を見つけます.最後にopenboxのmenuに分類して書きます
残念なことに、純粋なコマンドラインからイニシエータまで実行できません.例えば/usr/bin/python 2.7これは命令行には書かない.日を改めて話しましょう.
これはpyで書きます.したがって、chmod+xを直接実行することができます.使ってもいいです(*^^*)ふふ…
残念なことに、純粋なコマンドラインからイニシエータまで実行できません.例えば/usr/bin/python 2.7これは命令行には書かない.日を改めて話しましょう.
これはpyで書きます.したがって、chmod+xを直接実行することができます.使ってもいいです(*^^*)ふふ…
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# Filename: update_ob_menu.py
import os
#------------------------------------------------------
def xml_char(x):
x=x.replace('<','<')
x=x.replace('>','>')
x=x.replace('&','&')
x=x.replace('"','"')
x=x.replace("'",''')
return x
#------------------------------------------------------
def xml_cmd(s):
x=s.split(' ')
y=[]
for i in x:
if i[0]!='%':
y.append(i)
print s
print ' '.join(y)
return xml_char(' '.join(y))
#------------------------------------------------------
def get_item(x):
if x['type']=='Application':
return '<item label="%s"><action name="Execute"><execute>%s</execute></action></item>'%(xml_char(x['name']),xml_cmd(x['cmd']))
else:
return '<item label="%s"><action name="Execute"><execute>x-www-browser %s</execute></action></item>'%(xml_char(x['name']),xml_cmd(x['cmd']))
#------------------------------------------------------
def get_attr(name,f):
for line in f:
if line.lower().startswith(name+'='):
return line[len(name)+1:-1]
return ""
#-------------------------------------------------------
def load(f):
df={}
ft=open(f)
fo=[]
while True:
s = ft.readline()
if s=="":
break
else:
fo.append( s )
df['name']=get_attr('name[zh_cn]',fo)
if df['name']=='':
df['name']=get_attr('name',fo)
df['type']=get_attr('type',fo)
if df['type']=='Application':
df['cmd']=get_attr('exec',fo)
else:
df['cmd']=get_attr('url',fo)
df['cate']=get_attr('categories',fo)
df['terminal']=get_attr('terminal',fo).find('ure')>-1
ft.close
if len(df['cmd'])>0:
return df
else:
return False;
#------------------------------------------------------
dff=[]
p='/usr/share/applications/'
for f in os.listdir(p):
if f.find('.desktop')>-1:
x=load(p+f)
if x:
dff.append(x)
cate={\
'AudioVideo':[],\
'Development':[],\
'Education':[],\
'Game':[],\
'Graphics':[],\
'Network':[],\
'Office':[],\
'Settings':[],\
'System':[],\
'Utility':[]\
}
cate_other=[]
for i in dff:
is_lost=True
for k in cate.keys():
if i['cate'].find(k) != -1:
cate[k].append(i)
is_lost=False
if is_lost:
cate_other.append(i)
for k in cate.keys():
cate[k].sort()
cate_other.sort()
cate['Other']=cate_other
#------------------------------------
cate_name={\
'AudioVideo':' ',\
'Development':' ',\
'Education':' ',\
'Game':' ',\
'Graphics':' ',\
'Network':' ',\
'Office':' ',\
'Settings':' ',\
'System':' ',\
'Utility':' ',\
'Other':' '\
}
menu="<menu id='rmenu-jcy' label=' '>"
for i in cate.keys():
menu+="<menu id='rmenu-jck-%s' label='%s'>"%(xml_char(i),xml_char(cate_name[i]))
for d in cate[i]:
menu+=get_item(d)
menu+="</menu>"
menu+="</menu>"+os.linesep
#------------------------------------
ft=open(os.environ["HOME"]+'/.config/openbox/menu.xml')
fo=[]
while True:
s = ft.readline()
if s=="":
break
else:
fo.append( s )
ft.close()
l1=-1
l2=-1
i=0
for line in fo:
if line.find("<menu id='rmenu-jcy'")>-1:
l2=i
elif line.find('<menu id="root-menu"')>-1:
l1=i
i+=1
if l1==-1:
print 'menu.xml ; <menu id="root-menu"'
os.exit
if l2==-1:
fo[l1+1:l1+1]=[menu]
else:
fo[l2]=menu
ft=open(os.environ["HOME"]+'/.config/openbox/menu.xml','w')
for line in fo:
ft.write(line)
ft.close();