Index: engines/scumm/input.cpp
===================================================================
--- engines/scumm/input.cpp	(revision 27050)
+++ engines/scumm/input.cpp	(working copy)
@@ -416,25 +416,20 @@
 	if (lastKeyHit == 20) {
 		// FIXME: What key is '20' supposed to indicate? I can't trigger
 		// it with my keyboard, it seems...
-		char buf[256];
 
-		_voiceMode++;
-		if (_voiceMode == 3)
-			_voiceMode = 0;
+		SubtitleSettingsDialog dialog(this, _voiceMode);
+		_voiceMode = runDialog(dialog);
 
 		switch (_voiceMode) {
 		case 0:
-			sprintf(buf, "Speech Only");
 			ConfMan.setBool("speech_mute", false);
 			ConfMan.setBool("subtitles", false);
 			break;
 		case 1:
-			sprintf(buf, "Speech and Subtitles");
 			ConfMan.setBool("speech_mute", false);
 			ConfMan.setBool("subtitles", true);
 			break;
 		case 2:
-			sprintf(buf, "Subtitles Only");
 			ConfMan.setBool("speech_mute", true);
 			ConfMan.setBool("subtitles", true);
 			break;
@@ -443,8 +438,6 @@
 		if (VAR_VOICE_MODE != 0xFF)
 			VAR(VAR_VOICE_MODE) = _voiceMode;
 
-		GUI::TimedMessageDialog dialog(buf, 1500);
-		runDialog(dialog);
 		return;
 	}
 
Index: engines/scumm/dialogs.cpp
===================================================================
--- engines/scumm/dialogs.cpp	(revision 27050)
+++ engines/scumm/dialogs.cpp	(working copy)
@@ -27,6 +27,7 @@
 #include "common/config-manager.h"
 #include "common/savefile.h"
 #include "common/system.h"
+#include "common/events.h"
 
 #include "graphics/scaler.h"
 
@@ -920,6 +921,50 @@
 	_timer = getMillis() + kDisplayDelay;
 }
 
+SubtitleSettingsDialog::SubtitleSettingsDialog(ScummEngine *scumm, int value) 
+	: InfoDialog(scumm, "") {
+
+	_value = value + 1;
+	if (_value == 3)
+		_value = 0;
+
+	setInfoText(_subtitleDesc[_value]);
+}
+
+void SubtitleSettingsDialog::handleTickle() {
+	InfoDialog::handleTickle();
+	if (getMillis() > _timer)
+		close();
+}
+
+void SubtitleSettingsDialog::handleKeyDown(uint16 ascii, int keycode, int modifiers) {
+	if (keycode == 't' && modifiers == Common::KBD_CTRL) {
+		_value++;
+		if (_value == 3)
+			_value = 0;
+
+		setInfoText(_subtitleDesc[_value]);
+		reflowLayout();
+		setResult(_value);
+		_timer = getMillis() + 1500;
+		draw();
+	} else {
+		close();
+	}
+}
+
+void SubtitleSettingsDialog::open() {
+	InfoDialog::open();
+	setResult(_value);
+	_timer = getMillis() + 1500;
+}
+
+const char* SubtitleSettingsDialog::_subtitleDesc[] = {
+	"Speech Only",
+	"Speech and Subtitles",
+	"Subtitles Only"
+};
+
 Indy3IQPointsDialog::Indy3IQPointsDialog(ScummEngine *scumm, char* text)
 	: InfoDialog(scumm, text) {
 }
Index: engines/scumm/dialogs.h
===================================================================
--- engines/scumm/dialogs.h	(revision 27050)
+++ engines/scumm/dialogs.h	(working copy)
@@ -236,7 +236,27 @@
 	uint32 _timer;
 };
 
+/**
+ * A dialog used to display and cycle subtitle settings.
+ * Automatically closes after a brief time has passed.
+ */
+class SubtitleSettingsDialog : public InfoDialog {
+public:
+	SubtitleSettingsDialog(ScummEngine *scumm, int value);
 
+	virtual void open();
+	virtual void handleTickle();
+	virtual void handleMouseDown(int x, int y, int button, int clickCount) {
+		close();
+	}
+	virtual void handleKeyDown(uint16 ascii, int keycode, int modifiers);
+protected:
+	int _value;
+	uint32 _timer;
+
+	static const char* _subtitleDesc[];
+};
+
 //The Indy IQ dialog
 class Indy3IQPointsDialog : public InfoDialog {
 public:
