diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 7b5cedca42c..36cbf11ca49 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -311,6 +311,33 @@
/atom/proc/CtrlAltClick(var/mob/user)
return
+/*
+ Rclick.
+*/
+
+/mob/proc/RightClickOn(atom/A)
+ A.RightClick(src)
+
+///Called when a owner mob Shift + Rightmouseclicks an atom
+/mob/proc/ShiftRightClickOn(atom/A)
+ A.ShiftRightClick(src)
+
+///Called when a owner mob Alt + Rightmouseclicks an atom, given that Altclick does not return TRUE
+/mob/proc/AltRightClickOn(atom/A)
+ A.AltRightClick(src)
+
+///Called when a mob Rightmouseclicks this atom
+/atom/proc/RightClick(mob/user)
+ return
+
+///Called when a mob Shift + Rightmouseclicks this atom
+/atom/proc/ShiftRightClick(mob/user)
+ return
+
+///Called when a mob Alt + Rightmouseclicks this atom, given that mobs Altclick() does not return TRUE
+/atom/proc/AltRightClick(mob/user)
+ return
+
/*
Misc helpers
diff --git a/code/game/machinery/bodyscanner.dm b/code/game/machinery/bodyscanner.dm
index 84cf5f04220..cd9d205f431 100644
--- a/code/game/machinery/bodyscanner.dm
+++ b/code/game/machinery/bodyscanner.dm
@@ -43,6 +43,10 @@
usr.client.perspective = EYE_PERSPECTIVE
usr.client.eye = src
+/obj/machinery/bodyscanner/RightClick(mob/user)
+ if(CanPhysicallyInteract(user))
+ eject()
+
/obj/machinery/bodyscanner/proc/drop_contents()
for(var/obj/O in (contents - component_parts))
O.dropInto(loc)
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index c1bb91e2a6c..22e69e737ae 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -46,6 +46,10 @@
var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
+ ///remembers what our context menu setting is currently set to
+ var/shift_to_open_context_menu = TRUE
+
+
/*
As of byond 512, due to how broken preloading is, preload_rsc MUST be set to 1 at compile time if resource URLs are *not* in use,
BUT you still want resource preloading enabled (from the server itself). If using resource URLs, it should be set to 0 and
diff --git a/code/modules/client/preferences_toggle.dm b/code/modules/client/preferences_toggle.dm
index 4c986c71e6a..e4b83a3cc35 100644
--- a/code/modules/client/preferences_toggle.dm
+++ b/code/modules/client/preferences_toggle.dm
@@ -62,3 +62,21 @@ var/list/client_preference_stats_
/stat_client_preference/proc/update_name(var/mob/user)
name = user.get_preference_value(client_preference)
+
+///Toggles whether or not you need to hold shift to access the right click menu
+/client/verb/toggle_right_click()
+ set name = "Toggle Right Click"
+ set category = "Preferences"
+
+ if(shift_to_open_context_menu)
+ winset(src, "mapwindow.map", "right-click=false")
+ winset(src, "default.Shift", "is-disabled=true")
+ winset(src, "default.ShiftUp", "is-disabled=true")
+ shift_to_open_context_menu = FALSE
+ to_chat(usr, "You will no longer need to hold the Shift key to access the right click menu")
+ else
+ winset(src, "mapwindow.map", "right-click=true")
+ winset(src, "ShiftUp", "is-disabled=false")
+ winset(src, "Shift", "is-disabled=false")
+ shift_to_open_context_menu = TRUE
+ to_chat(usr, "You will now need to hold the Shift key to access the right click menu")
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index b4304c9a796..70df75ade63 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -663,7 +663,7 @@
if(pin)
to_chat(user, SPAN_WARNING("There's already a pin installed."))
-/obj/item/weapon/gun/AltClick(var/mob/user)
+/obj/item/weapon/gun/RightClick(var/mob/user)
if(!pin)
to_chat(user, SPAN_WARNING("There's no firing pin installed in this weapon."))
return
diff --git a/interface/skin.dmf b/interface/skin.dmf
index eb4076abbe4..b22b9f03dc8 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -263,6 +263,16 @@ macro "borghotkeymode"
elem
name = "."
command = "move-down"
+ elem ".winset :map.right-click=false"
+ name = "SHIFT+Shift"
+ elem "Shift"
+ name = "SHIFT"
+ command = ".winset :map.right-click=false"
+ elem "ShiftUp"
+ name = "SHIFT+UP"
+ command = ".winset :map.right-click=true"
+
+
macro "macro"
elem
@@ -451,6 +461,16 @@ macro "macro"
elem
name = "CTRL+Subtract"
command = "move-down"
+ elem ".winset :map.right-click=false"
+ name = "SHIFT+Shift"
+ elem "Shift"
+ name = "SHIFT"
+ command = ".winset :map.right-click=false"
+ elem "ShiftUp"
+ name = "SHIFT+UP"
+ command = ".winset :map.right-click=true"
+
+
macro "hotkeymode"
elem
@@ -549,7 +569,7 @@ macro "hotkeymode"
elem
name = "Delete"
command = "delete-key-pressed"
- elem
+ elem
name = "1"
command = "a-intent help"
elem
@@ -735,6 +755,16 @@ macro "hotkeymode"
elem
name = "SHIFT+UP"
command = "setmovingslowly"
+ elem ".winset :map.right-click=false"
+ name = "SHIFT+Shift"
+ elem "Shift"
+ name = "SHIFT"
+ command = ".winset :map.right-click=false"
+ elem "ShiftUp"
+ name = "SHIFT+UP"
+ command = ".winset :map.right-click=true"
+
+
macro "borgmacro"
elem
@@ -911,6 +941,16 @@ macro "borgmacro"
elem
name = "CTRL+Subtract"
command = "move-down"
+ elem ".winset :map.right-click=false"
+ name = "SHIFT+Shift"
+ elem "Shift"
+ name = "SHIFT"
+ command = ".winset :map.right-click=false"
+ elem "ShiftUp"
+ name = "SHIFT+UP"
+ command = ".winset :map.right-click=true"
+
+
menu "menu"
@@ -1077,6 +1117,7 @@ window "mapwindow"
saved-params = "pos;size;is-minimized;is-maximized"
titlebar = false
statusbar = false
+ right-click = true
can-close = false
can-minimize = false
can-resize = false