Index: dosbox-0.74/src/gui/sdlmain.cpp
===================================================================
--- dosbox-0.74.orig/src/gui/sdlmain.cpp	2010-05-10 13:43:54.000000000 -0400
+++ dosbox-0.74/src/gui/sdlmain.cpp	2012-04-12 06:31:47.213347469 -0400
@@ -148,6 +148,10 @@
 	PRIORITY_LEVEL_HIGHEST
 };
 
+enum MOUSE_KEYS {
+	MOUSE_CTRL,
+	MOUSE_SHIFT
+};
 
 struct SDL_Block {
 	bool inited;
@@ -210,7 +214,11 @@
 		bool autoenable;
 		bool requestlock;
 		bool locked;
-		Bitu sensitivity;
+		bool useright;
+		bool useroam;
+		MOUSE_KEYS keyright;
+		MOUSE_KEYS keyroam;
+	Bitu sensitivity;
 	} mouse;
 	SDL_Rect updateRects[1024];
 	Bitu num_joysticks;
@@ -1089,6 +1097,16 @@
 	if (!sdl.mouse.autoenable) SDL_ShowCursor(SDL_DISABLE);
 	sdl.mouse.autolock=false;
 	sdl.mouse.sensitivity=section->Get_int("sensitivity");
+	std::string mouserightkey = section->Get_string("togglemouseright");
+	if (mouserightkey == "ctrl") { sdl.mouse.useright = true; sdl.mouse.keyright = MOUSE_CTRL;}
+	else if (mouserightkey == "shift") { sdl.mouse.useright = true; sdl.mouse.keyright = MOUSE_SHIFT;}
+	else sdl.mouse.useright = false;
+
+	std::string mouseroamkey = section->Get_string("togglemouseroam");
+	if (mouseroamkey == "ctrl") { sdl.mouse.useroam = true; sdl.mouse.keyroam = MOUSE_CTRL;}
+	else if (mouseroamkey == "shift") { sdl.mouse.useroam = true; sdl.mouse.keyroam = MOUSE_SHIFT;}
+	else sdl.mouse.useright = false;
+
 	std::string output=section->Get_string("output");
 
 	/* Setup Mouse correctly if fullscreen */
@@ -1263,6 +1281,32 @@
 						  sdl.mouse.locked);
 }
 
+static bool ctrl_active() {
+	return (SDL_GetModState()&KMOD_CTRL) != 0;
+}
+
+static bool shift_active() {
+	return (SDL_GetModState()&KMOD_SHIFT) != 0;
+}
+
+static void HandleTouchScreenPress() {
+	if (sdl.mouse.keyroam == MOUSE_CTRL && ctrl_active()) return;
+	else if (sdl.mouse.keyroam == MOUSE_SHIFT && shift_active()) return;
+
+	if (sdl.mouse.keyright == MOUSE_CTRL && ctrl_active()) {Mouse_ButtonPressed(1); return;}
+	else if (sdl.mouse.keyright == MOUSE_SHIFT && shift_active()) {Mouse_ButtonPressed(1); return;}
+	Mouse_ButtonPressed(0);
+}
+
+static void HandleTouchScreenRelease() {
+	if (sdl.mouse.keyroam == MOUSE_CTRL && ctrl_active()) return;
+	else if (sdl.mouse.keyroam == MOUSE_SHIFT && shift_active()) return;
+
+	if (sdl.mouse.keyright == MOUSE_CTRL && ctrl_active()) {Mouse_ButtonReleased(1); return;}
+	else if (sdl.mouse.keyright == MOUSE_SHIFT && shift_active()) {Mouse_ButtonReleased(1); return;}
+	Mouse_ButtonReleased(0);
+}
+
 static void HandleMouseButton(SDL_MouseButtonEvent * button) {
 	switch (button->state) {
 	case SDL_PRESSED:
@@ -1277,7 +1321,8 @@
 		}
 		switch (button->button) {
 		case SDL_BUTTON_LEFT:
-			Mouse_ButtonPressed(0);
+			if (!sdl.mouse.useroam && !sdl.mouse.useright) Mouse_ButtonPressed(0);
+			else HandleTouchScreenPress();
 			break;
 		case SDL_BUTTON_RIGHT:
 			Mouse_ButtonPressed(1);
@@ -1290,7 +1335,8 @@
 	case SDL_RELEASED:
 		switch (button->button) {
 		case SDL_BUTTON_LEFT:
-			Mouse_ButtonReleased(0);
+			if (!sdl.mouse.useroam && !sdl.mouse.useright) Mouse_ButtonReleased(0);
+			else HandleTouchScreenRelease();
 			break;
 		case SDL_BUTTON_RIGHT:
 			Mouse_ButtonReleased(1);
@@ -1499,6 +1545,16 @@
 	Pint->SetMinMax(1,1000);
 	Pint->Set_help("Mouse sensitivity.");
 
+	const char* mright[] = { "ctrl", "shift", "none", 0 };
+	Pstring = sdl_sec->Add_string("togglemouseright", Property::Changeable::Always, "none");
+	Pstring->Set_help("Selects key to be used to toggle right click");
+	Pstring->Set_values(mright);
+
+	const char* mroam[] = { "ctrl", "shift", "none", 0 };
+	Pstring = sdl_sec->Add_string("togglemouseroam", Property::Changeable::Always, "none");
+	Pstring->Set_help("Selects key to be used to toggle free roam");
+	Pstring->Set_values(mroam);
+
 	Pbool = sdl_sec->Add_bool("waitonerror",Property::Changeable::Always, true);
 	Pbool->Set_help("Wait before closing the console if dosbox has an error.");
 
