Merge branch 'appicons'

This commit is contained in:
Marek Marczykowski-Górecki 2014-02-07 05:45:51 +01:00
commit 250aa9a3cc
2 changed files with 83 additions and 3 deletions

View File

@ -23,6 +23,7 @@
import subprocess import subprocess
import sys import sys
import os
import os.path import os.path
import shutil import shutil
@ -30,7 +31,11 @@ from qubes.qubes import QubesVm,QubesHVm
from qubes.qubes import QubesException,QubesHost,QubesVmLabels from qubes.qubes import QubesException,QubesHost,QubesVmLabels
from qubes.qubes import vm_files,system_path,dry_run from qubes.qubes import vm_files,system_path,dry_run
import qubes.imgconverter
vm_files['appmenus_templates_subdir'] = 'apps.templates' vm_files['appmenus_templates_subdir'] = 'apps.templates'
vm_files['appmenus_template_icons_subdir'] = 'apps.tempicons'
vm_files['appmenus_icons_subdir'] = 'apps.icons'
vm_files['appmenus_template_templates_subdir'] = 'apps-template.templates' vm_files['appmenus_template_templates_subdir'] = 'apps-template.templates'
vm_files['appmenus_whitelist'] = 'whitelisted-appmenus.list' vm_files['appmenus_whitelist'] = 'whitelisted-appmenus.list'
@ -43,6 +48,16 @@ def QubesVm_get_attrs_config(self, attrs):
attrs["appmenus_templates_dir"] = { "eval": \ attrs["appmenus_templates_dir"] = { "eval": \
'os.path.join(self.dir_path, vm_files["appmenus_templates_subdir"]) if self.updateable else ' + \ 'os.path.join(self.dir_path, vm_files["appmenus_templates_subdir"]) if self.updateable else ' + \
'self.template.appmenus_templates_dir if self.template is not None else None' } 'self.template.appmenus_templates_dir if self.template is not None else None' }
attrs["appmenus_template_icons_dir"] = { "eval": \
'os.path.join(self.dir_path, vm_files["appmenus_template_icons_subdir"]) if self.updateable else ' + \
'self.template.appmenus_template_icons_dir if self.template is not None else None' }
attrs["appmenus_icons_dir"] = { "eval": \
'os.path.join(self.dir_path, vm_files["appmenus_icons_subdir"])' }
return attrs
def QubesTemplateVm_get_attrs_config(self, attrs):
attrs['appmenus_templates_dir'] = { 'eval': 'os.path.join(self.dir_path, vm_files["appmenus_templates_subdir"])' }
attrs['appmenus_template_icons_dir'] = { 'eval': 'os.path.join(self.dir_path, vm_files["appmenus_template_icons_subdir"])' }
return attrs return attrs
def QubesVm_appmenus_create(self, verbose=False, source_template = None): def QubesVm_appmenus_create(self, verbose=False, source_template = None):
@ -81,6 +96,35 @@ def QubesVm_appmenus_remove(self):
vmtype = 'appvms' vmtype = 'appvms'
subprocess.check_call ([system_path["appmenu_remove_cmd"], self.name, vmtype]) subprocess.check_call ([system_path["appmenu_remove_cmd"], self.name, vmtype])
def QubesVm_appicons_create(self, srcdir=None):
if srcdir is None:
srcdir = self.appmenus_template_icons_dir
if srcdir is None:
return
whitelist = os.path.join(self.dir_path, vm_files['appmenus_whitelist'])
whitelist = [line.strip() for line in open(whitelist)]
if not os.path.exists(self.appmenus_icons_dir):
os.mkdir(self.appmenus_icons_dir)
elif not os.path.isdir(self.appmenus_icons_dir):
os.unlink(self.appmenus_icons_dir)
os.mkdir(self.appmenus_icons_dir)
for icon in os.listdir(srcdir):
desktop = os.path.splitext(icon)[0] + '.desktop'
if desktop not in whitelist:
continue
qubes.imgconverter.tint(os.path.join(srcdir, icon),
os.path.join(self.appmenus_icons_dir, icon),
self.label.color)
def QubesVm_appicons_remove(self):
if not os.path.exists(self.appmenus_icons_dir): return
for icon in os.listdir(self.appmenus_icons_dir):
os.unlink(os.path.join(self.appmenus_icons_dir, icon))
def QubesVm_pre_rename(self, new_name): def QubesVm_pre_rename(self, new_name):
self.appmenus_remove() self.appmenus_remove()
@ -92,7 +136,6 @@ def QubesVm_post_rename(self, old_name):
self.appmenus_create() self.appmenus_create()
def QubesVm_create_on_disk(self, verbose, source_template): def QubesVm_create_on_disk(self, verbose, source_template):
if isinstance(self, QubesHVm) and source_template is None: if isinstance(self, QubesHVm) and source_template is None:
if verbose: if verbose:
print >> sys.stderr, "--> Creating appmenus directory: {0}".format(self.appmenus_templates_dir) print >> sys.stderr, "--> Creating appmenus directory: {0}".format(self.appmenus_templates_dir)
@ -114,9 +157,11 @@ def QubesVm_create_on_disk(self, verbose, source_template):
print >> sys.stderr, "--> Copying the template's appmenus templates dir:\n{0} ==>\n{1}".\ print >> sys.stderr, "--> Copying the template's appmenus templates dir:\n{0} ==>\n{1}".\
format(source_template.appmenus_templates_dir, self.appmenus_templates_dir) format(source_template.appmenus_templates_dir, self.appmenus_templates_dir)
shutil.copytree (source_template.appmenus_templates_dir, self.appmenus_templates_dir) shutil.copytree (source_template.appmenus_templates_dir, self.appmenus_templates_dir)
shutil.copytree (source_template.appmenus_template_icons_dir, self.appmenus_template_icons_dir)
# Create appmenus # Create appmenus
self.appmenus_create(verbose=verbose) self.appmenus_create(verbose=verbose)
self.appicons_create()
def QubesVm_clone_disk_files(self, src_vm, verbose): def QubesVm_clone_disk_files(self, src_vm, verbose):
if src_vm.updateable and src_vm.appmenus_templates_dir is not None and self.appmenus_templates_dir is not None: if src_vm.updateable and src_vm.appmenus_templates_dir is not None and self.appmenus_templates_dir is not None:
@ -138,10 +183,14 @@ def QubesVm_clone_disk_files(self, src_vm, verbose):
# Create appmenus # Create appmenus
self.appmenus_create(verbose=verbose) self.appmenus_create(verbose=verbose)
self.appicons_create()
def QubesVm_remove_from_disk(self): def QubesVm_remove_from_disk(self):
self.appmenus_remove() self.appmenus_remove()
def QubesVm_label_setter(self, _):
self.appicons_create()
def QubesVm_appmenus_recreate(self): def QubesVm_appmenus_recreate(self):
self.appmenus_remove() self.appmenus_remove()
self.appmenus_create() self.appmenus_create()
@ -150,6 +199,8 @@ def QubesVm_appmenus_recreate(self):
QubesVm.appmenus_create = QubesVm_appmenus_create QubesVm.appmenus_create = QubesVm_appmenus_create
QubesVm.appmenus_remove = QubesVm_appmenus_remove QubesVm.appmenus_remove = QubesVm_appmenus_remove
QubesVm.appmenus_recreate = QubesVm_appmenus_recreate QubesVm.appmenus_recreate = QubesVm_appmenus_recreate
QubesVm.appicons_create = QubesVm_appicons_create
QubesVm.appicons_remove = QubesVm_appicons_remove
# hooks for existing methods # hooks for existing methods
QubesVm.hooks_get_attrs_config.append(QubesVm_get_attrs_config) QubesVm.hooks_get_attrs_config.append(QubesVm_get_attrs_config)
@ -158,3 +209,4 @@ QubesVm.hooks_post_rename.append(QubesVm_post_rename)
QubesVm.hooks_create_on_disk.append(QubesVm_create_on_disk) QubesVm.hooks_create_on_disk.append(QubesVm_create_on_disk)
QubesVm.hooks_clone_disk_files.append(QubesVm_clone_disk_files) QubesVm.hooks_clone_disk_files.append(QubesVm_clone_disk_files)
QubesVm.hooks_remove_from_disk.append(QubesVm_remove_from_disk) QubesVm.hooks_remove_from_disk.append(QubesVm_remove_from_disk)
QubesVm.hooks_label_setter.append(QubesVm_label_setter)

View File

@ -29,6 +29,8 @@ import shutil
from optparse import OptionParser from optparse import OptionParser
from qubes.qubes import QubesVmCollection,QubesException,system_path from qubes.qubes import QubesVmCollection,QubesException,system_path
from qubes.qubes import QubesHVm from qubes.qubes import QubesHVm
from qubes.qubes import vm_files
import qubes.imgconverter
# fields required to be present (and verified) in retrieved desktop file # fields required to be present (and verified) in retrieved desktop file
required_fields = [ "Name", "Exec" ] required_fields = [ "Name", "Exec" ]
@ -45,6 +47,7 @@ fields_regexp = {
"Comment": std_re, "Comment": std_re,
"Categories": re.compile(r"^[a-zA-Z0-9/.; -]*$"), "Categories": re.compile(r"^[a-zA-Z0-9/.; -]*$"),
"Exec": re.compile(r"^[a-zA-Z0-9()%>/\\:.= -]*$"), "Exec": re.compile(r"^[a-zA-Z0-9()%>/\\:.= -]*$"),
"Icon": re.compile(r"^[a-zA-Z0-9/_.-]*$"),
} }
def fallback_hvm_appmenulist(): def fallback_hvm_appmenulist():
@ -131,7 +134,14 @@ def create_template(path, values):
desktop_file.write("Type=Application\n") desktop_file.write("Type=Application\n")
desktop_file.write("Terminal=false\n") desktop_file.write("Terminal=false\n")
desktop_file.write("X-Qubes-VmName=%VMNAME%\n") desktop_file.write("X-Qubes-VmName=%VMNAME%\n")
desktop_file.write("Icon=%VMDIR%/icon.png\n")
if 'Icon' in values:
icon_file = os.path.splitext(os.path.split(path)[1])[0] + '.png'
desktop_file.write("Icon={0}\n".format(os.path.join(
'%VMDIR%', vm_files['appmenus_icons_subdir'], icon_file)))
else:
desktop_file.write("Icon=%VMDIR%/icon.png\n")
for key in ["Name", "GenericName" ]: for key in ["Name", "GenericName" ]:
if values.has_key(key): if values.has_key(key):
desktop_file.write("{0}=%VMNAME%: {1}\n".format(key, values[key])) desktop_file.write("{0}=%VMNAME%: {1}\n".format(key, values[key]))
@ -206,6 +216,9 @@ def main():
if not os.path.exists(vm.appmenus_templates_dir): if not os.path.exists(vm.appmenus_templates_dir):
os.mkdir(vm.appmenus_templates_dir) os.mkdir(vm.appmenus_templates_dir)
if not os.path.exists(vm.appmenus_template_icons_dir):
os.mkdir(vm.appmenus_template_icons_dir)
# Create new/update existing templates # Create new/update existing templates
if options.verbose: if options.verbose:
print >> sys.stderr, "--> Got {0} appmenus, storing to disk".format(str(len(new_appmenus))) print >> sys.stderr, "--> Got {0} appmenus, storing to disk".format(str(len(new_appmenus)))
@ -215,7 +228,22 @@ def main():
print >> sys.stderr, "---> Updating {0}".format(appmenu_file) print >> sys.stderr, "---> Updating {0}".format(appmenu_file)
else: else:
print >> sys.stderr, "---> Creating {0}".format(appmenu_file) print >> sys.stderr, "---> Creating {0}".format(appmenu_file)
create_template(vm.appmenus_templates_dir + '/' + appmenu_file, new_appmenus[appmenu_file])
if 'Icon' in new_appmenus[appmenu_file]:
# the following line is used for time comparison
# del new_appmenus[appmenu_file]['Icon']
try:
qubes.imgconverter.Image.get_xdg_icon_from_vm(vm,
new_appmenus[appmenu_file]['Icon']).save(
os.path.join(vm.appmenus_template_icons_dir,
os.path.splitext(appmenu_file)[0] + '.png'))
except Exception, e:
print >> sys.stderr, '----> Failed to get icon for {0}: {1!s}'.format(appmenu_file, e)
del new_appmenus[appmenu_file]['Icon']
create_template(os.path.join(vm.appmenus_templates_dir, appmenu_file),
new_appmenus[appmenu_file])
# Delete appmenus of removed applications # Delete appmenus of removed applications
if options.verbose: if options.verbose: