# Service Groups demo # Written by Luke Kenneth Casson Leighton # This theme is demonstrates how to parse service groups. # it's done recursively to give a complete dump of your menu # that you will also be able to double-check against kmenuedit # and also the KDE Start button. # # for a real-live usage, see kroller.sez (try searching kde-look.org), # which fires off a sub-theme with the service-group menu options when # you click on a service group on the "main" bar. #this import statement allows access to the karamba functions import karamba # simple function to display def create_text(widget, line, depth, disp, name=None, command=None, icon=None): print(name) print(disp) x = depth*30 y = line*12 width = 400 height = 12 drop_txt = karamba.createText(widget, x, y, width, height, disp) karamba.changeTextSize(widget, drop_txt, 11) karamba.changeTextColor(widget, drop_txt, 252,252,252) # create a (very narrow! only an 12-pixel-high area!) # service click area to demonstrate that commands get # executed correctly. if name: karamba.createServiceClickArea( widget, x,y,width,height, str(name), str(command), str(icon)) # okay. you really should be looking up the KDE Developer documentation # on service groups. here is a _brief_ explanation of what they contain. # # getServiceGroups returns a list of menu options. # you can either have a subgroup, or you can have an executable program. # if a list item is a subgroup, then (0, dict) is returned, where # dict is a dictionary containing information describing the subgroup. # if a list item is an executable menu option, then (1, dict) is returned, # where dict is a dictionary containing information describing the menu option. # # the information (keys in the dictionary) returned about a subgroup comprises: # relpath - the fully qualified path of that subgroup, and # calling getServiceGroups (again) with that path will get # you all of the menu options in that subgroup, hurrah. # icon - the name of an icon (a png, usually) which you can, if you # so wish, use as the filename argument to createImage(). # caption - i get confused as to which is which, but # and you can always run this program in combination # comment with kmenuedit to find out! # # the information (keys in the dictionary) returned about an # executable option comprises: # exec - obviously the most important bit: the name of the command # to be executed. # icon - the filename of the icon (usually a png) which should be # displayed for this command. # name - not to be confused with genericname, neither of which i # am sure about, and if you really want to know, run # kmenuedit and experiment, or look at the KDE Developer source # code. # menuid - don't know what it is for. it's just... there. # # how to use the service group info: # # the simplest way to get commands actually executed is to hand # over the name, the command and the icon filename to a # ServiceClickArea (karamba.createServiceClickArea()). # # other than making sure that you put the service click area in # the right place, you don't have to worry about much else. # # or, you could always run it manually, yourself, by using # karamba.Run(name, command, icon). personally, i prefer # the service click areas. no, karamba.Run() is not like # karamba.execute() - if you use karamba.Run() you get to say which # bouncing icon is used, whereas if you use karamba.execute() you # always get a superkaramba bouncing icon... # # do look out for kroller.sez on http://kde-look.org or other locations # for a more complex and comprehensive usage of service groups. def display_svc_group(widget, rel_path, line, depth): grps = karamba.getServiceGroups(rel_path) for (type, d) in grps: if type == 0: # it's a sub_relpath = d[b'relpath'].decode('utf-8') icon = d.get(b'icon', 'unknown').decode('utf-8') caption = d.get(b'caption', b'').decode('utf-8') comment = d.get(b'comment', b'').decode('utf-8') cmt = '' # get at least something to display if comment: cmt = comment elif caption: cmt = caption msg = "SVCGRP: %s %s" % (icon, cmt) print("MSG="+msg) create_text(widget, line, depth, msg) line += 1 line = display_svc_group(widget, str(sub_relpath), line, depth+1) elif type == 1 and b'menuid' in d: relpath = d.get(b'relpath', b'').decode('utf-8') cmd = d[b'exec'].decode('utf-8') icon = d.get(b'icon', 'unknown').decode('utf-8') name = d.get(b'name', b'').decode('utf-8') genericname = d.get(b'genericname', b'') cmt = '' # get at least something to display if genericname: cmt = genericname.decode('utf-8') elif name: cmt = name msg = "%s %s %s" % (cmd, icon, cmt) create_text(widget, line, depth, msg, name, cmd, icon) line += 1 return line #this is called when you widget is initialized def initWidget(widget): display_svc_group(widget, "", 0, 0) karamba.redrawWidget(widget)