Patch Camera Using Volume Buttons to Take a Picture

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; + 		} +	}, 	/**

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