diff --git a/src/Game.c b/src/Game.c index 90c49c4c7..13fad28cd 100644 --- a/src/Game.c +++ b/src/Game.c @@ -560,7 +560,7 @@ static void Game_Render3D(double delta, float t) { Entities_RenderHoveredNames(delta); left = InputHandler_IsMousePressed(MOUSE_LEFT); - middle = InputHandler_IsMousePressed(MOUSE_MIDDLE); + middle = KeyBind_IsPressed(KEYBIND_PICK_BLOCK); right = InputHandler_IsMousePressed(MOUSE_RIGHT); InputHandler_PickBlocks(true, left, middle, right); diff --git a/src/Input.c b/src/Input.c index 89bc0adef..c8359415d 100644 --- a/src/Input.c +++ b/src/Input.c @@ -42,7 +42,7 @@ const char* const Key_Names[KEY_COUNT] = { "KeypadAdd", "KeypadDecimal", "KeypadEnter", "Tilde", "Minus", "Plus", "BracketLeft", "BracketRight", "Slash", "Semicolon", "Quote", "Comma", "Period", "BackSlash", - "XButton1", "XButton2", + "XButton1", "XButton2", "MouseMid" }; /* TODO: Should this only be shown in GUI? not saved to disc? */ @@ -64,7 +64,7 @@ const char* const Key_Names[KEY_COUNT] = { "5", "6", "7", "8", "9", "GRAVE", "MINUS", "PLUS", "LBRACKET", "RBRACKET", "SEMICOLON", "APOSTROPHE", "COMMA", "PERIOD", "SLASH", "BACKSLASH", - "XBUTTON1", "XBUTTON2", + "XBUTTON1", "XBUTTON2", "MOUSEMID" };*/ void Key_SetPressed(Key key, bool pressed) { @@ -128,7 +128,7 @@ const cc_uint8 KeyBind_Defaults[KEYBIND_COUNT] = { KEY_LSHIFT, 'X', 'Z', 'Q', 'E', KEY_LALT, KEY_F3, KEY_F12, KEY_F11, KEY_F5, KEY_F1, KEY_F7, 'C', - KEY_LCTRL, 0, 0, 0, + KEY_LCTRL, 0, KEY_MOUSEMID, 0, KEY_F6, KEY_LALT, KEY_F8, 'G', KEY_F10, 0 }; @@ -139,7 +139,7 @@ static const char* const keybindNames[KEYBIND_COUNT] = { "Speed", "NoClip", "Fly", "FlyUp", "FlyDown", "ExtInput", "HideFPS", "Screenshot", "Fullscreen", "ThirdPerson", "HideGUI", "AxisLines", "ZoomScrolling", - "HalfSpeed", "MouseLeft", "MouseMiddle", "MouseRight", + "HalfSpeed", "MouseLeft", "PickBlock", "MouseRight", "AutoRotate", "HotbarSwitching", "SmoothCamera", "DropBlock", "IDOverlay", "BreakableLiquids" }; diff --git a/src/Input.h b/src/Input.h index 7124b25da..4bc8e468a 100644 --- a/src/Input.h +++ b/src/Input.h @@ -39,7 +39,7 @@ enum Key_ { KEY_TILDE, KEY_MINUS, KEY_EQUALS, KEY_LBRACKET, KEY_RBRACKET, KEY_SLASH, KEY_SEMICOLON, KEY_QUOTE, KEY_COMMA, KEY_PERIOD, KEY_BACKSLASH, - KEY_XBUTTON1, KEY_XBUTTON2, /* so these can be used for hotkeys */ + KEY_XBUTTON1, KEY_XBUTTON2, KEY_MOUSEMID, /* so these can be used for hotkeys */ KEY_COUNT }; typedef int Key; @@ -100,7 +100,7 @@ enum KeyBind_ { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN, KEYBIND_EXT_INPUT, KEYBIND_HIDE_FPS, KEYBIND_SCREENSHOT, KEYBIND_FULLSCREEN, KEYBIND_THIRD_PERSON, KEYBIND_HIDE_GUI, KEYBIND_AXIS_LINES, KEYBIND_ZOOM_SCROLL, - KEYBIND_HALF_SPEED, KEYBIND_MOUSE_LEFT, KEYBIND_MOUSE_MIDDLE, KEYBIND_MOUSE_RIGHT, + KEYBIND_HALF_SPEED, KEYBIND_MOUSE_LEFT, KEYBIND_PICK_BLOCK, KEYBIND_MOUSE_RIGHT, KEYBIND_AUTOROTATE, KEYBIND_HOTBAR_SWITCH, KEYBIND_SMOOTH_CAMERA, KEYBIND_DROP_BLOCK, KEYBIND_IDOVERLAY, KEYBIND_BREAK_LIQUIDS, KEYBIND_COUNT diff --git a/src/InputHandler.c b/src/InputHandler.c index ef2425b26..9f17b4cc7 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -35,7 +35,6 @@ bool InputHandler_IsMousePressed(MouseButton button) { /* Key --> mouse mappings */ if (button == MOUSE_LEFT && KeyBind_IsPressed(KEYBIND_MOUSE_LEFT)) return true; - if (button == MOUSE_MIDDLE && KeyBind_IsPressed(KEYBIND_MOUSE_MIDDLE)) return true; if (button == MOUSE_RIGHT && KeyBind_IsPressed(KEYBIND_MOUSE_RIGHT)) return true; return false; } @@ -201,6 +200,8 @@ static bool InputHandler_HandleCoreKey(Key key) { } else { InputHandler_CycleDistanceForwards(viewDists, count); } + } else if (key == KeyBinds[KEYBIND_PICK_BLOCK]) { + InputHandler_PickBlocks(false, false, true, false); } else if (key == KEY_F5 && Game_ClassicMode) { int weather = Env.Weather == WEATHER_SUNNY ? WEATHER_RAINY : WEATHER_SUNNY; Env_SetWeather(weather); @@ -408,8 +409,7 @@ static void InputHandler_MouseDown(void* obj, int btn) { } } - InputHandler_PickBlocks(false, btn == MOUSE_LEFT, - btn == MOUSE_MIDDLE, btn == MOUSE_RIGHT); + InputHandler_PickBlocks(false, btn == MOUSE_LEFT, false, btn == MOUSE_RIGHT); } static void InputHandler_MouseUp(void* obj, int btn) { @@ -429,12 +429,11 @@ static void InputHandler_MouseUp(void* obj, int btn) { static bool InputHandler_SimulateMouse(Key key, bool pressed) { Key left = KeyBinds[KEYBIND_MOUSE_LEFT]; - Key middle = KeyBinds[KEYBIND_MOUSE_MIDDLE]; Key right = KeyBinds[KEYBIND_MOUSE_RIGHT]; MouseButton btn; - if (!(key == left || key == middle || key == right)) return false; + if (!(key == left || key == right)) return false; - btn = key == left ? MOUSE_LEFT : key == middle ? MOUSE_MIDDLE : MOUSE_RIGHT; + btn = key == left ? MOUSE_LEFT : MOUSE_RIGHT; if (pressed) { InputHandler_MouseDown(NULL, btn); } else { InputHandler_MouseUp(NULL, btn); } return true; diff --git a/src/Menus.c b/src/Menus.c index d4589fd26..df4bf6828 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -1758,8 +1758,8 @@ static void MouseKeyBindingsScreen_Init(struct KeyBindingsScreen* s) { } void MouseKeyBindingsScreen_Show(void) { - static const cc_uint8 binds[3] = { KEYBIND_MOUSE_LEFT, KEYBIND_MOUSE_MIDDLE, KEYBIND_MOUSE_RIGHT }; - static const char* descs[3] = { "Left", "Middle", "Right" }; + static const cc_uint8 binds[3] = { KEYBIND_MOUSE_LEFT, KEYBIND_PICK_BLOCK, KEYBIND_MOUSE_RIGHT }; + static const char* descs[3] = { "Left", "Pick block", "Right" }; KeyBindingsScreen_Show(Array_Elems(binds), binds, descs, MouseKeyBindingsScreen_Init); } diff --git a/src/Window.c b/src/Window.c index 472def40c..4bcce4ac8 100644 --- a/src/Window.c +++ b/src/Window.c @@ -268,7 +268,7 @@ static LRESULT CALLBACK Window_Procedure(HWND handle, UINT message, WPARAM wPara /* Set before position change, in case mouse buttons changed when outside window */ Mouse_SetPressed(MOUSE_LEFT, (wParam & 0x01) != 0); Mouse_SetPressed(MOUSE_RIGHT, (wParam & 0x02) != 0); - Mouse_SetPressed(MOUSE_MIDDLE, (wParam & 0x10) != 0); + Key_SetPressed(KEY_MOUSEMID, (wParam & 0x10) != 0); /* TODO: do we need to set XBUTTON1/XBUTTON2 here */ Mouse_SetPosition(LOWORD(lParam), HIWORD(lParam)); break; @@ -279,21 +279,21 @@ static LRESULT CALLBACK Window_Procedure(HWND handle, UINT message, WPARAM wPara return 0; case WM_LBUTTONDOWN: - Mouse_SetPressed(MOUSE_LEFT, true); break; + Mouse_SetPressed(MOUSE_LEFT, true); break; case WM_MBUTTONDOWN: - Mouse_SetPressed(MOUSE_MIDDLE, true); break; + Key_SetPressed(KEY_MOUSEMID, true); break; case WM_RBUTTONDOWN: - Mouse_SetPressed(MOUSE_RIGHT, true); break; + Mouse_SetPressed(MOUSE_RIGHT, true); break; case WM_XBUTTONDOWN: Key_SetPressed(HIWORD(wParam) == 1 ? KEY_XBUTTON1 : KEY_XBUTTON2, true); break; case WM_LBUTTONUP: - Mouse_SetPressed(MOUSE_LEFT, false); break; + Mouse_SetPressed(MOUSE_LEFT, false); break; case WM_MBUTTONUP: - Mouse_SetPressed(MOUSE_MIDDLE, false); break; + Key_SetPressed(KEY_MOUSEMID, false); break; case WM_RBUTTONUP: - Mouse_SetPressed(MOUSE_RIGHT, false); break; + Mouse_SetPressed(MOUSE_RIGHT, false); break; case WM_XBUTTONUP: Key_SetPressed(HIWORD(wParam) == 1 ? KEY_XBUTTON1 : KEY_XBUTTON2, false); break; @@ -1096,21 +1096,21 @@ void Window_ProcessEvents(void) { break; case ButtonPress: - if (e.xbutton.button == 1) Mouse_SetPressed(MOUSE_LEFT, true); - else if (e.xbutton.button == 2) Mouse_SetPressed(MOUSE_MIDDLE, true); - else if (e.xbutton.button == 3) Mouse_SetPressed(MOUSE_RIGHT, true); + if (e.xbutton.button == 1) Mouse_SetPressed(MOUSE_LEFT, true); + else if (e.xbutton.button == 2) Key_SetPressed(KEY_MOUSEMID, true); + else if (e.xbutton.button == 3) Mouse_SetPressed(MOUSE_RIGHT, true); else if (e.xbutton.button == 4) Mouse_SetWheel(Mouse_Wheel + 1); else if (e.xbutton.button == 5) Mouse_SetWheel(Mouse_Wheel - 1); - else if (e.xbutton.button == 6) Key_SetPressed(KEY_XBUTTON1, true); - else if (e.xbutton.button == 7) Key_SetPressed(KEY_XBUTTON2, true); + else if (e.xbutton.button == 6) Key_SetPressed(KEY_XBUTTON1, true); + else if (e.xbutton.button == 7) Key_SetPressed(KEY_XBUTTON2, true); break; case ButtonRelease: - if (e.xbutton.button == 1) Mouse_SetPressed(MOUSE_LEFT, false); - else if (e.xbutton.button == 2) Mouse_SetPressed(MOUSE_MIDDLE, false); - else if (e.xbutton.button == 3) Mouse_SetPressed(MOUSE_RIGHT, false); - else if (e.xbutton.button == 6) Key_SetPressed(KEY_XBUTTON1, false); - else if (e.xbutton.button == 7) Key_SetPressed(KEY_XBUTTON2, false); + if (e.xbutton.button == 1) Mouse_SetPressed(MOUSE_LEFT, false); + else if (e.xbutton.button == 2) Key_SetPressed(KEY_MOUSEMID, false); + else if (e.xbutton.button == 3) Mouse_SetPressed(MOUSE_RIGHT, false); + else if (e.xbutton.button == 6) Key_SetPressed(KEY_XBUTTON1, false); + else if (e.xbutton.button == 7) Key_SetPressed(KEY_XBUTTON2, false); break; case MotionNotify: @@ -1657,11 +1657,11 @@ static OSStatus Window_ProcessMouseEvent(EventRef inEvent) { switch (button) { case kEventMouseButtonPrimary: - Mouse_SetPressed(MOUSE_LEFT, down); break; + Mouse_SetPressed(MOUSE_LEFT, down); break; case kEventMouseButtonSecondary: Mouse_SetPressed(MOUSE_RIGHT, down); break; case kEventMouseButtonTertiary: - Mouse_SetPressed(MOUSE_MIDDLE, down); break; + Key_SetPressed(KEY_MOUSEMID, down); break; } return eventNotHandledErr; @@ -2224,15 +2224,15 @@ static void Window_HandleMouseEvent(const SDL_Event* e) { bool pressed = e->button.state == SDL_PRESSED; switch (e->button.button) { case SDL_BUTTON_LEFT: - Mouse_SetPressed(MOUSE_LEFT, pressed); break; + Mouse_SetPressed(MOUSE_LEFT, pressed); break; case SDL_BUTTON_MIDDLE: - Mouse_SetPressed(MOUSE_MIDDLE, pressed); break; + Key_SetPressed(KEY_MOUSEMID, pressed); break; case SDL_BUTTON_RIGHT: - Mouse_SetPressed(MOUSE_RIGHT, pressed); break; + Mouse_SetPressed(MOUSE_RIGHT, pressed); break; case SDL_BUTTON_X1: - Key_SetPressed(KEY_XBUTTON1, pressed); break; + Key_SetPressed(KEY_XBUTTON1, pressed); break; case SDL_BUTTON_X2: - Key_SetPressed(KEY_XBUTTON2, pressed); break; + Key_SetPressed(KEY_XBUTTON2, pressed); break; } } @@ -2403,16 +2403,14 @@ static EM_BOOL Window_MouseWheel(int type, const EmscriptenWheelEvent* ev, void* } static EM_BOOL Window_MouseButton(int type, const EmscriptenMouseEvent* ev, void* data) { - MouseButton btn; + bool down = type == EMSCRIPTEN_EVENT_MOUSEDOWN; Window_CorrectFocus(); switch (ev->button) { - case 0: btn = MOUSE_LEFT; break; - case 1: btn = MOUSE_MIDDLE; break; - case 2: btn = MOUSE_RIGHT; break; - default: return false; + case 0: Mouse_SetPressed(MOUSE_LEFT, down); break; + case 1: Input_SetPressed(KEY_MOUSEMID, down); break; + case 2: Mouse_SetPressed(MOUSE_RIGHT, down); break; } - Mouse_SetPressed(btn, type == EMSCRIPTEN_EVENT_MOUSEDOWN); return true; } @@ -2420,7 +2418,7 @@ static EM_BOOL Window_MouseMove(int type, const EmscriptenMouseEvent* ev, void* /* Set before position change, in case mouse buttons changed when outside window */ Mouse_SetPressed(MOUSE_LEFT, (ev->buttons & 0x01) != 0); Mouse_SetPressed(MOUSE_RIGHT, (ev->buttons & 0x02) != 0); - Mouse_SetPressed(MOUSE_MIDDLE, (ev->buttons & 0x04) != 0); + Input_SetPressed(KEY_MOUSEMID, (ev->buttons & 0x04) != 0); Mouse_SetPosition(ev->canvasX, ev->canvasY); if (win_rawMouse) Event_RaiseMouseMove(&MouseEvents.RawMoved, ev->movementX, ev->movementY);