Index: dosbox-0.74/src/gui/sdlmain.cpp
===================================================================
--- dosbox-0.74.orig/src/gui/sdlmain.cpp	2012-03-20 07:59:14.223115087 -0400
+++ dosbox-0.74/src/gui/sdlmain.cpp	2012-03-20 07:59:24.727887092 -0400
@@ -148,6 +148,11 @@
 	PRIORITY_LEVEL_HIGHEST
 };
 
+enum MOUSE_KEYS {
+	MOUSE_CTRL,
+	MOUSE_SHIFT,
+	MOUSE_PROX
+};
 
 struct SDL_Block {
 	bool inited;
@@ -210,6 +215,12 @@
 		bool autoenable;
 		bool requestlock;
 		bool locked;
+		bool useright;
+		bool useroam;
+		bool usealtmouse;
+		MOUSE_KEYS keyright;
+		MOUSE_KEYS keyroam;
+		MOUSE_KEYS keyaltmouse;
 		Bitu sensitivity;
 	} mouse;
 	SDL_Rect updateRects[1024];
@@ -1089,6 +1100,19 @@
 	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 if (mouserightkey == "prox") {sdl.mouse.useright = true; sdl.mouse.keyright = MOUSE_PROX;}
+	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 if (mouseroamkey == "prox") {sdl.mouse.useroam = true; sdl.mouse.keyroam = MOUSE_PROX;}
+	else {sdl.mouse.useroam = false;}
+
 	std::string output=section->Get_string("output");
 
 	/* Setup Mouse correctly if fullscreen */
@@ -1263,6 +1287,52 @@
 						  sdl.mouse.locked);
 }
 
+static bool ProximitySensorCovered() {
+	char c[7];
+	FILE *file;
+	file = fopen("/sys/devices/platform/gpio-switch/proximity/state","r");
+	if(file==NULL) {
+		return false;
+	}
+	else {
+		fgets(c, 7, file);
+		fclose(file);
+		return strcmp(c, "closed") == 0;
+	}
+}
+
+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;
+	else if (sdl.mouse.keyroam == MOUSE_PROX && ProximitySensorCovered()) 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;}
+	else if (sdl.mouse.keyright == MOUSE_PROX && ProximitySensorCovered()) {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;
+	else if (sdl.mouse.keyroam == MOUSE_PROX && ProximitySensorCovered()) 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;}
+	else if (sdl.mouse.keyright == MOUSE_PROX && ProximitySensorCovered()) {Mouse_ButtonReleased(1);return;}
+	Mouse_ButtonReleased(0);
+}
+
 static void HandleMouseButton(SDL_MouseButtonEvent * button) {
 	switch (button->state) {
 	case SDL_PRESSED:
@@ -1277,7 +1347,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 +1361,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 +1571,16 @@
 	Pint->SetMinMax(1,1000);
 	Pint->Set_help("Mouse sensitivity.");
 
+	const char* mright[] = { "ctrl", "shift", "prox", "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", "prox", "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.");
 
