Index: win/tkWinPointer.c ================================================================== --- win/tkWinPointer.c +++ win/tkWinPointer.c @@ -78,10 +78,16 @@ if (GetKeyState(VK_MBUTTON) & 0x8000) { state |= Button2Mask; } if (GetKeyState(VK_RBUTTON) & 0x8000) { state |= Button3Mask; + } + if (GetKeyState(VK_XBUTTON1) & 0x8000) { + state |= Button4Mask; + } + if (GetKeyState(VK_XBUTTON2) & 0x8000) { + state |= Button5Mask; } return state; } /* Index: win/tkWinX.c ================================================================== --- win/tkWinX.c +++ win/tkWinX.c @@ -928,13 +928,16 @@ case WM_LBUTTONDBLCLK: case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONDBLCLK: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: + case WM_XBUTTONUP: case WM_MOUSEMOVE: Tk_PointerEvent(hwnd, (short) LOWORD(lParam), (short) HIWORD(lParam)); return 1; case WM_SYSKEYDOWN: @@ -1781,10 +1784,18 @@ break; case Button3: msg = WM_RBUTTONDOWN; wparam = MK_RBUTTON; break; + case Button4: + msg = WM_XBUTTONDOWN; + wparam = MAKEWPARAM(MK_XBUTTON1, XBUTTON1); + break; + case Button5: + msg = WM_XBUTTONDOWN; + wparam = MAKEWPARAM(MK_XBUTTON2, XBUTTON2); + break; default: return 0; } if (eventPtr->xbutton.state & Button1Mask) { @@ -1793,10 +1804,16 @@ if (eventPtr->xbutton.state & Button2Mask) { wparam |= MK_MBUTTON; } if (eventPtr->xbutton.state & Button3Mask) { wparam |= MK_RBUTTON; + } + if (eventPtr->xbutton.state & Button4Mask) { + wparam |= MK_XBUTTON1; + } + if (eventPtr->xbutton.state & Button5Mask) { + wparam |= MK_XBUTTON2; } if (eventPtr->xbutton.state & ShiftMask) { wparam |= MK_SHIFT; } if (eventPtr->xbutton.state & ControlMask) {