Index: trunk/include/propset4.h
===================================================================
--- trunk/include/propset4.h	(revision 1456)
+++ trunk/include/propset4.h	(revision 1457)
@@ -8,4 +8,5 @@
 */
 
+#define PROPCASE_AF_LOCK                         11		// 0 = AF not locked, 1 = AF locked
 #define PROPCASE_FLASH_SYNC_CURTAIN              64
 #define PROPCASE_SUBJECT_DIST2                   65
Index: trunk/include/camera.h
===================================================================
--- trunk/include/camera.h	(revision 1456)
+++ trunk/include/camera.h	(revision 1457)
@@ -38,4 +38,5 @@
 #undef  CAM_HAS_ND_FILTER                       // Camera has build-in ND filter
 #define CAM_CAN_SD_OVER_NOT_IN_MF   1           // Camera allows subject distance (focus) override when not in manual focus mode
+#undef  CAM_CAN_SD_OVER_IN_AF_LOCK              // Camera allows subject distance (focus) override when in AF Lock mode
 #define CAM_CAN_SD_OVERRIDE         1           // Camera allows to do subject distance override
 #define CAM_HAS_MANUAL_FOCUS        1           // Camera has manual focus mode
Index: trunk/platform/ixus220_elph300hs/platform_camera.h
===================================================================
--- trunk/platform/ixus220_elph300hs/platform_camera.h	(revision 1456)
+++ trunk/platform/ixus220_elph300hs/platform_camera.h	(revision 1457)
@@ -38,4 +38,5 @@
 	#define CAM_HAS_ND_FILTER		1
     #undef  CAM_CAN_SD_OVER_NOT_IN_MF
+    #define CAM_CAN_SD_OVER_IN_AF_LOCK 1
     #undef  CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
     #define CAM_HAS_VIDEO_BUTTON			1
Index: trunk/platform/generic/wrappers.c
===================================================================
--- trunk/platform/generic/wrappers.c	(revision 1456)
+++ trunk/platform/generic/wrappers.c	(revision 1457)
@@ -145,8 +145,4 @@
 void lens_set_zoom_point(long newpt)
 {
-#if defined (CAMERA_s95)
-	long startTime;
-#endif
-
     if (newpt < 0) {
         newpt = 0;
@@ -193,15 +189,7 @@
     _MoveZoomLensWithPoint((short*)&newpt);
 
-  #if defined (CAMERA_s95)
-	// this will hang sometimes on s95 when zoom_busy gets stuck as a 1
-	// we add a timeout as a work-around for this problem
-	startTime = get_tick_count();
-	while (get_tick_count() < (startTime + 2000)) {
-		if (!zoom_busy)
-			break;
-	}
-  #else	// !CAMERA_s95
-	while (zoom_busy) ;
-  #endif // !CAMERA_s95
+    // tight loop here hangs some cameras (the task that clears zoom_busy
+    // is starved; seen at least on S95 and IXUS 220), so stick in a sleep
+    while (zoom_busy) msleep(10);
 
     if (newpt==0) zoom_status=ZOOM_OPTICAL_MIN;
Index: trunk/platform/generic/shooting.c
===================================================================
--- trunk/platform/generic/shooting.c	(revision 1456)
+++ trunk/platform/generic/shooting.c	(revision 1457)
@@ -760,4 +760,8 @@
  int m=mode_get()&MODE_SHOOTING_MASK;
 #if !CAM_CAN_SD_OVER_NOT_IN_MF && CAM_CAN_SD_OVERRIDE
+ #if CAM_CAN_SD_OVER_IN_AF_LOCK
+  if (shooting_get_prop(PROPCASE_AF_LOCK))
+    return 1;
+ #endif
   return (shooting_get_focus_mode() || MODE_IS_VIDEO(m));
 #elif !CAM_CAN_SD_OVERRIDE
Index: trunk/core/kbd.c
===================================================================
--- trunk/core/kbd.c	(revision 1456)
+++ trunk/core/kbd.c	(revision 1457)
@@ -180,5 +180,5 @@
     }
     // deals with alt-mode switch and delay emulation
-    if (key_pressed) {
+    if (key_pressed && !nRmt) {
         if (kbd_is_key_pressed(conf.alt_mode_button)
                 || ((key_pressed >= CAM_EMUL_KEYPRESS_DELAY)
