17 Sep 20:31
Patches: various
From: Frank Richter <frank.richter <at> gmail.com>
Subject: Patches: various
Newsgroups: gmane.comp.file-systems.zero-install.devel
Date: 2008-09-17 18:33:24 GMT
Subject: Patches: various
Newsgroups: gmane.comp.file-systems.zero-install.devel
Date: 2008-09-17 18:33:24 GMT
- gpg.load_keys() used to return the last UID as the name for a key. I think it's more sensible to return the first. - Some feeds (*cough*mine*cough*) use pretty high resolution icons; to prevent the feed list getting ridiculously large cap the size of the icons to the "normal" icon size. - Add "--addmenu" option to 0launch to generate menu icons. Probably useful for 0export. - As suggested earlier, make 0publish-gui use gpg.load_keys() instead of running gpg once for each secret key found. hth, - f.r.
>From d971f9eb37d1fa37ee7ea27cbf2ca5ab3ec0c031 Mon Sep 17 00:00:00 2001
From: frank.richter <at> gmail.com <frank.richter <at> gmail.com>
Date: Wed, 17 Sep 2008 20:15:10 +0200
Subject: [PATCH] zeroinstall.injector.gpg.load_keys(): Use the primary UID for the name of a key
---
zeroinstall/injector/gpg.py | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/zeroinstall/injector/gpg.py b/zeroinstall/injector/gpg.py
index 0342a75..7bead09 100644
--- a/zeroinstall/injector/gpg.py
+++ b/zeroinstall/injector/gpg.py
@@ -146,6 +146,8 @@ def load_keys(fingerprints):
keys[current_fpr].name = current_uid
if line.startswith('uid:'):
assert current_fpr is not None
+ # Only take primary UID
+ if current_uid: continue
parts = line.split(':')
current_uid = parts[9]
if current_fpr in keys:
--
1.5.6.4
>From 3341d1d630cd1571d3a087979ce57207d3e6e935 Mon Sep 17 00:00:00 2001 From: frank.richter <at> gmail.com <frank.richter <at> gmail.com> Date: Wed, 17 Sep 2008 20:22:04 +0200 Subject: [PATCH] "Manage feeds" dialog: limit size of icons displayed in list --- zeroinstall/gtkui/applistbox.py | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletions(-) diff --git a/zeroinstall/gtkui/applistbox.py b/zeroinstall/gtkui/applistbox.py index 27dd074..98ad214 100644 --- a/zeroinstall/gtkui/applistbox.py +++ b/zeroinstall/gtkui/applistbox.py @@ -121,6 +121,8 @@ class AppListBox: model = self.model model.clear() + default_icon = self.window.render_icon(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_DIALOG) + for uri in self.app_list.get_apps(): itr = model.append() model[itr][AppListBox.URI] = uri @@ -133,10 +135,26 @@ class AppListBox: model[itr][AppListBox.NAME] = name pixbuf = icon.load_icon(self.iface_cache.get_icon_path(iface)) if not pixbuf: - pixbuf = self.window.render_icon(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_DIALOG) + pixbuf = default_icon + else: + # Cap icon size, some icons are really high resolution + pixbuf = self.cap_pixbuf_dimensions(pixbuf, default_icon.get_width()) model[itr][AppListBox.ICON] = pixbuf model[itr][AppListBox.MARKUP] = '<b>%s</b>\n<i>%s</i>' % (_pango_escape(name), _pango_escape(summary)) + + def cap_pixbuf_dimensions(self, pixbuf, iconsize): + pixbuf_w = pixbuf.get_width() + pixbuf_h = pixbuf.get_height() + if (pixbuf_w > iconsize) or (pixbuf_h > iconsize): + if (pixbuf_w > pixbuf_h): + newheight = (pixbuf_w/pixbuf_h) * iconsize + newwidth = iconsize + else: + newwidth = (pixbuf_h/pixbuf_w) * iconsize + newheight = iconsize + return pixbuf.scale_simple(newwidth, newheight, gtk.gdk.INTERP_BILINEAR) + return pixbuf def action_run(self, uri): subprocess.Popen(['0launch', '--', uri]) -- 1.5.6.4
>From 35a8481c5fbd31460bb434b933598e4e055f921b Mon Sep 17 00:00:00 2001
From: frank.richter <at> gmail.com <frank.richter <at> gmail.com>
Date: Wed, 17 Sep 2008 20:23:29 +0200
Subject: [PATCH] 0launch: Add "--addmenu" command line option to create menu icons for given feeds
---
zeroinstall/gtkui/xdgutils.py | 11 +++++++++++
zeroinstall/injector/cli.py | 40 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+), 0 deletions(-)
diff --git a/zeroinstall/gtkui/xdgutils.py b/zeroinstall/gtkui/xdgutils.py
index 564316e..da860f5 100644
--- a/zeroinstall/gtkui/xdgutils.py
+++ b/zeroinstall/gtkui/xdgutils.py
@@ -90,3 +90,14 @@ def discover_existing_apps():
except Exception, ex:
warn("Failed to load .desktop file %s: %s", full, ex)
return already_installed
+
+def get_known_category(feed_category):
+ if feed_category:
+ categories = ['AudioVideo','Audio','Video','Development','Education','Game',
+ 'Graphics','Network','Office','Settings','System','Utility']
+ feed_low = feed_category.lower()
+ for cat in categories:
+ if cat.lower() == feed_low:
+ return cat
+ return None
+
diff --git a/zeroinstall/injector/cli.py b/zeroinstall/injector/cli.py
index 57fecd1..c17988d 100644
--- a/zeroinstall/injector/cli.py
+++ b/zeroinstall/injector/cli.py
@@ -280,6 +280,43 @@ def _get_selections(policy):
doc.writexml(sys.stdout)
sys.stdout.write('\n')
+def _add_to_menu(options, sels):
+ if len(sels) < 1:
+ raise UsageError()
+
+ from zeroinstall.injector.namespaces import XMLNS_IFACE
+ from zeroinstall.gtkui import xdgutils
+
+ for uri in sels:
+ iface_uri = model.canonical_iface_uri(uri)
+ policy = autopolicy.AutoPolicy(iface_uri)
+ if options.offline:
+ policy.network_use = model.network_offline
+ iface = iface_cache.get_interface(iface_uri)
+
+ refreshed = policy.solve_with_downloads(options.refresh)
+ if refreshed:
+ policy.handler.wait_for_blocker(refreshed)
+
+ impl = policy.get_implementation(iface)
+ if impl.main is None:
+ # Only add menu items for implementations with a main
+ logging.info("Skipping %s, it has no main" % iface_uri)
+ continue
+
+ iconfetch = policy.download_icon(iface)
+ if iconfetch:
+ policy.handler.wait_for_blocker(iconfetch)
+
+ icon_path = iface_cache.get_icon_path(iface)
+ feed_category = None
+ for meta in iface.get_metadata(XMLNS_IFACE, 'category'):
+ feed_category = meta.content
+ break
+ feed_category = xdgutils.get_known_category(feed_category)
+
+ xdgutils.add_to_menu(iface, icon_path, feed_category)
+
class UsageError(Exception): pass
def main(command_args):
@@ -301,6 +338,7 @@ def main(command_args):
" %prog --list [search-term]\n"
" %prog --import [signed-interface-files]\n"
" %prog --feed [interface]")
+ parser.add_option("", "--addmenu", help="add menu items for given interfaces", action='store_true')
parser.add_option("", "--before", help="choose a version before this", metavar='VERSION')
parser.add_option("-c", "--console", help="never use GUI", action='store_false', dest='gui')
parser.add_option("", "--cpu", help="target CPU type", metavar='CPU')
@@ -355,6 +393,8 @@ def main(command_args):
_import_feed(args)
elif options.feed:
_manage_feeds(options, args)
+ elif options.addmenu:
+ _add_to_menu(options, args)
else:
_normal_mode(options, args)
except UsageError:
--
1.5.6.4
>From 2f15ab9047c5edf93b49fe1f120907330f934b15 Mon Sep 17 00:00:00 2001
From: Frank Richter frank.richter <at> gmail.com <frank.richter <at> gmail.com>
Date: Wed, 17 Sep 2008 20:30:21 +0200
Subject: [PATCH] Use gpg.load_keys() to get identities for secret keys
---
signing.py | 14 ++------------
1 files changed, 2 insertions(+), 12 deletions(-)
diff --git a/signing.py b/signing.py
index 74cd62e..a15f706 100644
--- a/signing.py
+++ b/signing.py
@@ -62,19 +62,9 @@ def get_secret_keys():
# When listing secret keys, the identity show may not be the primary identity as selected by
# the user or shown when verifying a signature. However, the primary identity can be obtained
# by listing the accompanying public key.
+ loaded_keys = gpg.load_keys([k[0] for k in keys])
for key in keys:
- child = subprocess.Popen(('gpg', '--list-keys', '--with-colons',
- '--fingerprint', key[0]),
- stdout = subprocess.PIPE)
- stdout, _ = child.communicate()
- status = child.wait()
- if status:
- raise Exception("GPG failed with exit code %d" % status)
- for line in stdout.split('\n'):
- line = line.split(':')
- if line[0] == 'pub':
- key[1] = line[9]
- break
+ key[1] = loaded_keys[key[0]].name
return keys
def check_signature(path):
--
--
1.5.6.4
------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________ Zero-install-devel mailing list Zero-install-devel <at> lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/zero-install-devel
RSS Feed