summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorhut <hut@lavabit.com>2010-04-27 00:02:11 +0200
committerhut <hut@lavabit.com>2010-04-27 00:02:11 +0200
commita3540c6c7e7e9af4ea9ec666f495fe853dcd822b (patch)
tree82eeb659f50385b5bd88754c0e5267dad5ab116d
parentf54d0ec7c8e9f3733e09ff392f1462622e5698ef (diff)
downloadranger-a3540c6c7e7e9af4ea9ec666f495fe853dcd822b.tar.gz
api.apps: added generic app handlers
-rw-r--r--ranger/api/apps.py25
-rw-r--r--ranger/defaults/apps.py82
2 files changed, 45 insertions, 62 deletions
diff --git a/ranger/api/apps.py b/ranger/api/apps.py
index 90162e0b..ad598879 100644
--- a/ranger/api/apps.py
+++ b/ranger/api/apps.py
@@ -134,3 +134,28 @@ def depends_on(*args):
 		fnc.dependencies = args
 		return fnc
 	return decorator
+
+
+def _generic_app_handler(name, detached=None):
+	assert isinstance(name, str)
+	@depends_on(name)
+	def handler(self, context):
+		if detached:
+			context.flags += "d"
+		elif not detached and detached is not None:
+			context.flags += "D"
+		return tup(name, *context)
+	return handler
+
+
+def generic(simple=(), detached=()):
+	simple = tuple(simple)
+	detached = tuple(detached)
+	def class_decorator(cls):
+		for name in simple:
+			setattr(cls, "app_" + name, _generic_app_handler(name))
+		for name in detached:
+			setattr(cls, "app_" + name,
+					_generic_app_handler(name, detached=True))
+		return cls
+	return class_decorator
diff --git a/ranger/defaults/apps.py b/ranger/defaults/apps.py
index 6c09298a..c9dfd51e 100644
--- a/ranger/defaults/apps.py
+++ b/ranger/defaults/apps.py
@@ -49,6 +49,26 @@ This example modifies the behaviour of "feh" and adds a custom media player:
 from ranger.api.apps import *
 from ranger.ext.get_executables import get_executables
 
+# Often a program is just started like this: `programname filename [...]`
+# For example: `vim test.py readme.txt`.  This can be implemented like:
+#    @depends_on("programname")
+#    def app_programname(self, c):
+#        return tup("programname", *c)
+# Instead of creating such a generic function for each program, just add
+# its name into this array:
+generic_apps = '''
+vim fceux elinks wine zsnes javac
+'''.split()
+
+# Sometimes you don't want the program to block ranger's terminal. You could
+# add this line before the return statement:
+#        c.flags += "d"   # "d" for "detached"
+# Write the name of those programs into this array:
+detached_apps = '''
+opera firefox apvlv evince zathura gimp mirage eog
+'''.split()
+
+@generic(simple=generic_apps, detached=detached_apps)
 class CustomApplications(Applications):
 	def app_default(self, c):
 		"""How to determine the default application?"""
@@ -95,10 +115,6 @@ class CustomApplications(Applications):
 	def app_pager(self, c):
 		return tup('less', *c)
 
-	@depends_on('vim')
-	def app_vim(self, c):
-		return tup('vim', *c)
-
 	def app_editor(self, c):
 		try:
 			default_editor = os.environ['EDITOR']
@@ -135,16 +151,6 @@ class CustomApplications(Applications):
 		else:
 			return tup('mplayer', *c)
 
-	@depends_on("eog")
-	def app_eye_of_gnome(self, c):
-		c.flags += 'd'
-		return tup('eog', *c)
-
-	@depends_on('mirage')
-	def app_mirage(self, c):
-		c.flags += 'd'
-		return tup('mirage', *c)
-
 	@depends_on('feh')
 	def app_feh(self, c):
 		arg = {1: '--bg-scale', 2: '--bg-tile', 3: '--bg-center'}
@@ -171,10 +177,6 @@ class CustomApplications(Applications):
 		except:
 			return tup('feh', *c)
 
-	@depends_on("gimp")
-	def app_gimp(self, c):
-		return tup('gimp', *c)
-
 	@depends_on('aunpack')
 	def app_aunpack(self, c):
 		if c.mode is 0:
@@ -182,15 +184,6 @@ class CustomApplications(Applications):
 			return tup('aunpack', '-l', c.file.path)
 		return tup('aunpack', c.file.path)
 
-	@depends_on('fceux')
-	def app_fceux(self, c):
-		return tup('fceux', *c)
-
-	@depends_on('apvlv')
-	def app_apvlv(self, c):
-		c.flags += 'd'
-		return tup('apvlv', *c)
-
 	@depends_on('make')
 	def app_make(self, c):
 		if c.mode is 0:
@@ -200,25 +193,6 @@ class CustomApplications(Applications):
 		if c.mode is 2:
 			return tup("make", "clear")
 
-	@depends_on('elinks')
-	def app_elinks(self, c):
-		c.flags += 'D'
-		return tup('elinks', *c)
-
-	@depends_on('opera')
-	def app_opera(self, c):
-		c.flags += 'd'
-		return tup('opera', *c)
-
-	@depends_on('firefox')
-	def app_firefox(self, c):
-		c.flags += 'd'
-		return tup("firefox", *c)
-
-	@depends_on('javac')
-	def app_javac(self, c):
-		return tup("javac", *c)
-
 	@depends_on('java')
 	def app_java(self, c):
 		def strip_extensions(file):
@@ -228,22 +202,6 @@ class CustomApplications(Applications):
 		files_without_extensions = map(strip_extensions, c.files)
 		return tup("java", files_without_extensions)
 
-	@depends_on('zsnes')
-	def app_zsnes(self, c):
-		return tup("zsnes", c.file.path)
-
-	@depends_on('evince')
-	def app_evince(self, c):
-		return tup("evince", *c)
-
-	@depends_on('zathura')
-	def app_zathura(self, c):
-		return tup("zathura", *c)
-
-	@depends_on('wine')
-	def app_wine(self, c):
-		return tup("wine", c.file.path)
-
 	@depends_on('totem')
 	def app_totem(self, c):
 		if c.mode is 0: