[Sugar-devel] [SoaS] sugar coating

Luke Faraone luke at faraone.cc
Tue Jul 27 15:15:46 EDT 2010


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

This is probably something that would be of interest to sugar-devel as well.

On 07/27/2010 03:11 PM, tom-ipp wrote:
> Hi,
> I wrote a small script in python which lets me "sugarcoat" linux
> application for sugar.
> In fact, you call the script with the name of an installed program (need
> the .desktop file) and it returns an activity directory -> an icon
> appears in the home view to launch that program.
> The -l option will return you the programs installed
> in /usr/share/applications
> It looks for an svg icon, if not found the icon of the journal activity
> is used.
> It is based around the famous library libsugarize.so and the script
> found here :
> http://wiki.sugarlabs.org/go/Running_Linux_Applications_Under_Sugar
> Tested with fedora 13, for the application cheese, fedora-abe and
> fedora-supertux.
> You put the script simpleSugarCoater.py in your home directory, with the
> libsugarize.so.
> 
> Morally, the sugar coating is not the best thing to promote the sugar
> platform. BUT we can't wait for the supertux developer to sugarize their
> application and we all need supertux. So...

It's definitely a start, and better than having to leave Sugar entirely
for such programs.

> Comments welcomed.
> Sincerely.
> Thomas
> 
> The script:
> 
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
> #
> # build activity directory for launching linux application from sugar
> # GNU General Public License v.3
> # Author : Thomas Jacoviac
> # Contact : develop at tom-ipp.info
> #
> 
> import os
> import shutil
> import sys
> import getopt
> import xdg.DesktopEntry
> import xdg.IconTheme
> import xdg.BaseDirectory
> import mimetypes
> 
> # == Declarations ==
> activityPath = os.path.join(os.path.expanduser("~"), "Activities") #By
> default, the directory will be created in the user's Activities
> directory
> defaultIcon =
> "/usr/share/icons/sugar/scalable/apps/activity-journal.svg" # By
> default, this icon will be used for the application
> 
> # == Internal functions ==
> def sugarCoat(binary):
>     global activityPath
>     global defaultIcon
>     
>     iconName, execString = parseDesktopFile(binary) #Retrieve icon and
> exec from desktop file
>     iconPath = locateIcon(iconName)    
>     createActivityDir(os.path.join(activityPath, binary + ".activity"))
> # Create activity directory tree
>     createInfoFile(activityPath, binary) # Create info file
>     shutil.copy(iconPath, os.path.join(activityPath, binary +
> ".activity", "activity", "icon.svg")) # Copy icon to activity directory
>     if createLauncherFile(activityPath, binary, execString):
> sys.exit("Error with launcher creation") #Create launcher
>     # Copy libsugarize.so in activity directory
>     #TODO: More versatile location for distributing libsugarize.so
>     shutil.copy("libsugarize.so", os.path.join(activityPath, binary +
> ".activity", "lib", "libsugarize.so"))
> 
> def parseDesktopFile(binary):
>     dirs = xdg.BaseDirectory.xdg_data_dirs
>     for dir in dirs:
>         if os.path.isfile(os.path.join(dir + "/applications/" + binary +
> ".desktop")):
>             desktopFileContent = xdg.DesktopEntry.DesktopEntry(filename
> = os.path.join(dir + "/applications/" + binary + ".desktop"))
>             execString = desktopFileContent.getExec()
>             iconName = desktopFileContent.getIcon()
>             return iconName, execString
>     sys.exit("No .desktop file for this application")
>     
> def locateIcon(iconName):
>     global defaultIcon
>     iconPath = xdg.IconTheme.getIconPath(iconName, None, None, ["svg"])
> #Get iconPath with xdg
>     #TODO: Use xdg to magically find type, mimetypes is based on
> filename suffix
>     if mimetypes.guess_type(iconPath)[0] != "image/svg+xml": # Check if
> icon is svg file
>         #From
> http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
>         #apps should look in $HOME/.icons, /usr/share/icons
> and /usr/share/pixmaps (in that order)
>         dirs = [os.path.expanduser("~/.icons"), "/usr/share/icons",
> "/usr/share/pixmaps"]
>         for dir in dirs:
>             for root, ds, files in os.walk(dir):
>                 for file in files:
>                     if mimetypes.guess_type(file)[0] == "image/svg+xml":
>                         if os.path.splitext(file)[0] == iconName:
>                             iconPath = os.path.join(root, file)
>                             return iconPath
>         return defaultIcon # If no svg icon found, use default icon
>     
> def createLauncherFile(activityPath, binary, execString):
>     launcherFile = open(os.path.join(activityPath, binary + ".activity",
> "bin", "launcher.sh"), "w")
>     launcherFile.write("#!/bin/sh\n")
>     launcherFile.write("# from
> http://wiki.sugarlabs.org/go/Running_Linux_Applications_Under_Sugar\n")
>     launcherFile.write("\n")
>     launcherFile.write("while [ -n \"$2\" ] ; do\n")
>     launcherFile.write("    case \"$1\" in\n")
>     launcherFile.write("        -b | --bundle-id)     export
> SUGAR_BUNDLE_ID=\"$2\" ;;\n")
>     launcherFile.write("        -a | --activity-id)   export
> SUGAR_ACTIVITY_ID=\"$2\" ;;\n")
>     launcherFile.write("        -o | --object-id)     export
> SUGAR_OBJECT_ID=\"$2\" ;;\n")
>     launcherFile.write("        -u | --uri)           export SUGAR_URI=
> \"$2\" ;;\n")
>     launcherFile.write("        *) echo unknown argument $1 $2  ;;\n")
>     launcherFile.write("    esac\n")
>     launcherFile.write("    shift;shift\n")
>     launcherFile.write("done\n")
>     launcherFile.write("export LD_PRELOAD=
> \"$SUGAR_BUNDLE_PATH/lib/libsugarize.so\"\n")
>     launcherFile.write("export NET_WM_NAME=\"" + binary + "\"\n")
>     launcherFile.write("exec " + execString + "\n")
>     launcherFile.close
>     launcherFile.flush() #For xo creation we need to ensure that file is
> written on disk
>     os.fsync(launcherFile.fileno()) #idem
>     os.chmod(os.path.join(activityPath, binary + ".activity", "bin",
> "launcher.sh"), 0755)
>    
> def createActivityDir(directory):
>     if not os.path.isdir(directory) : os.makedirs(directory)
>     if not os.path.isdir(os.path.join(directory, "activity")):
> os.mkdir(os.path.join(directory, "activity"))
>     if not os.path.isdir(os.path.join(directory, "bin")):
> os.mkdir(os.path.join(directory, "bin"))
>     if not os.path.isdir(os.path.join(directory, "lib")):
> os.mkdir(os.path.join(directory, "lib"))
>     return
> 
> def createInfoFile(activityPath, appName):
>     infoFile = open(os.path.join(activityPath, appName + ".activity",
> "activity", "activity.info"), "w")
>     infoFile.write("[Activity]\n")
>     infoFile.write("name = " + appName + "\n")
>     infoFile.write("activity_version = 1\n")
>     infoFile.write("service_name = info.tom-ipp.sugar." + appName +
> "\n")
>     infoFile.write("license = GPLv3\n")
>     infoFile.write("icon = icon\n")
>     infoFile.write("exec = launcher.sh\n")
>     infoFile.write("show_launcher = yes\n")
>     infoFile.close()
>     return
> 
> # == Man page for the script ==
> def usage():
>     print "----------------- Usage
> ----------------------------------------"
>     print "sugarCoater.py create an activity directory, including
> launcher,"
>     print "for a standard linux application"
>     print "Usage: sugarCoater [options] application"
>     print "-h --help          Prints this"
>     print "-l --list          Lists applications installed"
>     
> # == Main function ==
> def main(argv):
>     try:                                
>         opts, command = getopt.getopt(argv, "hl", ["help", "list"])
>     except getopt.GetoptError:
>         usage()
>         sys.exit(2)
>         
>     for opt, arg in opts:
>         if opt in ("-h", "--help"):
>             usage()
>             sys.exit()
>         if opt in ("-l", "--list"):
>             listApps = []
>             for app in sorted(os.listdir("/usr/share/applications/")): 
>                 if os.path.splitext(app)[1] == ".desktop":
>                     listApps.append(os.path.splitext(app)[0])
>                     print os.path.splitext(app)[0]
>             sys.exit()
>             
>     if not command:
>         print "You need to provide the application you want to
> sugarcoat."
>         print "Use -l or --list option to look in your's
> $XDG_DATA_DIRS :"
>         print xdg.BaseDirectory.xdg_data_dirs
>         sys.exit(2)
>     
>     sugarCoat(command[0])
> 
> if __name__ == "__main__":
>     main(sys.argv[1:])
> 
> _______________________________________________
> SoaS mailing list
> SoaS at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/soas
	

- -- 
Luke Faraone
http://luke.faraone.cc
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEARECAAYFAkxPMGEACgkQtrC51grHAgYbWACfQDUo6LsvdHauTUxUJRe8A16L
vVAAnitB+KJ0fTTGtu1n8oiwRLHdGQ3r
=TqhE
-----END PGP SIGNATURE-----


More information about the Sugar-devel mailing list