Patch Camera Using Volume Buttons to Take a Picture

From WebOS Internals
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


Note: If you are only looking for a hardware-based button to take a picture, the space bar will do that for you already.

Preamble

You will need write permissions to the filesystem on your Pre to apply this patch.

To get write persmissions execute:

rootfs_open -w

To remount the filesystem as read-only:

mount -o remount,ro /

Procedure

The patch is performed on /usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js. Please back up this file before proceeding.

--- a/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
+++ b/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
@@ -134,6 +134,7 @@
 				this._handleCaptureToggle();
 			}.bind(this));
 		}
+		this.volumeKeySubscription = null;
 		
 		
 		
@@ -136,7 +137,6 @@
 		}
 		
 		
-		
 		this.onKeyPressHandler = this.onKeyPress.bindAsEventListener(this);
 		Mojo.listen(this.controller.sceneElement, Mojo.Event.keydown, this.onKeyPressHandler);
 		Mojo.listen(this.controller.sceneElement, Mojo.Event.keyup, this.onKeyPressHandler);
@@ -164,7 +164,16 @@
 			AppAssistant.photoRollVideoLoader = AppAssistant.libraries["metascene.videos"];
 
 		}
-		
+		// listen to volume key events
+		this.volumeKeySubscription = new Mojo.Service.Request(
+			'palm://com.palm.keys/audio', 
+			{
+				method: 'status',
+				parameters: {'subscribe': true},
+				onFailure: function() { Mojo.Log.error("Could not subscribe to volume key events"); },
+				onSuccess: this.handleVolumeKeys.bind(this), 
+			});
+			
 		llog("CaptureAssistant::setup() finished");
 	}catch(e){llog("setup threw: "+Object.toJSON(e));}},
 	
@@ -332,6 +341,11 @@
 		}
 		
 		this.cameraControl.closeCamera();
+		
+		// clean up listener for volume keys
+		if(this.volumeKeySubscription) {
+			this.volumeKeySubscription.cancel();
+		}		
 	},
 	
 	handleCommand: function(event){
@@ -382,6 +396,14 @@
 			this.cameraControl.stillCapture();
 		}
 	},
+	
+	// capture on release of volume keys
+	handleVolumeKeys: function(payload) {
+		// capture when either volume up or down buttons are released
+		if(payload.state === 'up' && (payload.key === 'volume_up' || payload.key === 'volume_down')) {
+ 			this.cameraControl.stillCapture();
+ 		}
+	},
   
 	
 	/**

Notes

Volume Control

The keys will still alter the volume of the device. There is a way to lock the buttons so that they don't modify volume when pressed but still report events. Needs futher investigation.

~FXDemolisher