winedos / Mouse driver cleanup
Jukka Heinonen
jhei at iki.fi
Sun Oct 26 04:30:31 CST 2003
This patch does not change how mouse driver works
but it does some minor cleanups that are probably better
to do in a separate patch instead of mixing these
things with patches that do change mouse driver logic.
After this patch, the following things will be fixed in separate patches:
- hide/show mouse
- pointer warping
- fix for virtual screen size and cursor ranges
Changelog:
Clean up mouse driver implementation.
Index: dlls/winedos/int33.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/int33.c,v
retrieving revision 1.14
diff -u -r1.14 int33.c
--- dlls/winedos/int33.c 5 Sep 2003 23:08:28 -0000 1.14
+++ dlls/winedos/int33.c 26 Oct 2003 10:22:46 -0000
@@ -35,100 +35,150 @@
static struct
{
- DWORD x, y, but;
- WORD lbcount, rbcount, rlastx, rlasty, llastx, llasty;
- FARPROC16 callback;
- WORD callmask;
- WORD VMPratio, HMPratio, oldx, oldy;
+ WORD x, y, but;
+ WORD lbcount, rbcount, rlastx, rlasty, llastx, llasty;
+ FARPROC16 callback;
+ WORD callmask;
+ WORD VMPratio, HMPratio, oldx, oldy;
} mouse_info;
+
/**********************************************************************
- * DOSVM_Int33Handler (WINEDOS16.151)
+ * INT33_ResetMouse
*
- * Handler for int 33h (MS MOUSE).
+ * Handler for:
+ * - subfunction 0x00 (reset mouse)
+ * - subfunction 0x21 (software reset)
*/
-void WINAPI DOSVM_Int33Handler( CONTEXT86 *context )
+static void INT33_ResetMouse( CONTEXT86 *context )
{
- switch (LOWORD(context->Eax)) {
- case 0x00:
- case 0x21:
- TRACE("Reset mouse driver and request status\n");
- SET_AX( context, 0xFFFF ); /* installed */
- SET_BX( context, 3 ); /* # of buttons */
memset( &mouse_info, 0, sizeof(mouse_info) );
+
/* Set the default mickey/pixel ratio */
mouse_info.HMPratio = 8;
mouse_info.VMPratio = 16;
- break;
- case 0x01:
- FIXME("Show mouse cursor\n");
- break;
- case 0x02:
- FIXME("Hide mouse cursor\n");
- break;
- case 0x03:
- TRACE("Return mouse position and button status: (%ld,%ld) and %ld\n",
- mouse_info.x, mouse_info.y, mouse_info.but);
- SET_BX( context, mouse_info.but );
- SET_CX( context, mouse_info.x );
- SET_DX( context, mouse_info.y );
- break;
- case 0x04:
- FIXME("Position mouse cursor\n");
- break;
- case 0x05:
- TRACE("Return Mouse button press Information for %s mouse button\n",
- BX_reg(context) ? "right" : "left");
- if (BX_reg(context)) {
- SET_BX( context, mouse_info.rbcount );
- mouse_info.rbcount = 0;
- SET_CX( context, mouse_info.rlastx );
- SET_DX( context, mouse_info.rlasty );
- } else {
- SET_BX( context, mouse_info.lbcount );
- mouse_info.lbcount = 0;
- SET_CX( context, mouse_info.llastx );
- SET_DX( context, mouse_info.llasty );
+
+ if (context)
+ {
+ SET_AX( context, 0xFFFF ); /* driver installed */
+ SET_BX( context, 3 ); /* number of buttons */
+ }
+}
+
+
+/**********************************************************************
+ * DOSVM_Int33Handler (WINEDOS16.151)
+ *
+ * Handler for int 33h (MS MOUSE).
+ */
+void WINAPI DOSVM_Int33Handler( CONTEXT86 *context )
+{
+ switch (AX_reg(context))
+ {
+ case 0x0000:
+ TRACE("Reset mouse driver and request status\n");
+ INT33_ResetMouse( context );
+ break;
+
+ case 0x0001:
+ FIXME("Show mouse cursor\n");
+ break;
+
+ case 0x0002:
+ FIXME("Hide mouse cursor\n");
+ break;
+
+ case 0x0003:
+ TRACE("Return mouse position and button status: (%d,%d) and %d\n",
+ mouse_info.x, mouse_info.y, mouse_info.but);
+ SET_BX( context, mouse_info.but );
+ SET_CX( context, mouse_info.x );
+ SET_DX( context, mouse_info.y );
+ break;
+
+ case 0x0004:
+ FIXME("Position mouse cursor\n");
+ break;
+
+ case 0x0005:
+ TRACE("Return Mouse button press Information for %s mouse button\n",
+ BX_reg(context) ? "right" : "left");
+ if (BX_reg(context))
+ {
+ SET_BX( context, mouse_info.rbcount );
+ mouse_info.rbcount = 0;
+ SET_CX( context, mouse_info.rlastx );
+ SET_DX( context, mouse_info.rlasty );
+ }
+ else
+ {
+ SET_BX( context, mouse_info.lbcount );
+ mouse_info.lbcount = 0;
+ SET_CX( context, mouse_info.llastx );
+ SET_DX( context, mouse_info.llasty );
+ }
+ SET_AX( context, mouse_info.but );
+ break;
+
+ case 0x0007:
+ FIXME("Define horizontal mouse cursor range %d..%d\n",
+ CX_reg(context), DX_reg(context));
+ break;
+
+ case 0x0008:
+ FIXME("Define vertical mouse cursor range %d..%d\n",
+ CX_reg(context), DX_reg(context));
+ break;
+
+ case 0x0009:
+ FIXME("Define graphics mouse cursor\n");
+ break;
+
+ case 0x000A:
+ FIXME("Define text mouse cursor\n");
+ break;
+
+ case 0x000B:
+ TRACE("Read Mouse motion counters\n");
+ {
+ int dx = ((int)mouse_info.x - (int)mouse_info.oldx)
+ * (mouse_info.HMPratio / 8);
+ int dy = ((int)mouse_info.y - (int)mouse_info.oldy)
+ * (mouse_info.VMPratio / 8);
+
+ SET_CX( context, (WORD)dx );
+ SET_DX( context, (WORD)dy );
+
+ mouse_info.oldx = mouse_info.x;
+ mouse_info.oldy = mouse_info.y;
+ }
+ break;
+
+ case 0x000C:
+ TRACE("Define mouse interrupt subroutine\n");
+ mouse_info.callmask = CX_reg(context);
+ mouse_info.callback = (FARPROC16)MAKESEGPTR(context->SegEs,
+ DX_reg(context));
+ break;
+
+ case 0x000F:
+ TRACE("Set mickey/pixel ratio\n");
+ mouse_info.HMPratio = CX_reg(context);
+ mouse_info.VMPratio = DX_reg(context);
+ break;
+
+ case 0x0010:
+ FIXME("Define screen region for update\n");
+ break;
+
+ case 0x0021:
+ TRACE("Software reset\n");
+ INT33_ResetMouse( context );
+ break;
+
+ default:
+ INT_BARF(context,0x33);
}
- SET_AX( context, mouse_info.but );
- break;
- case 0x07:
- FIXME("Define horizontal mouse cursor range %d..%d\n",
- CX_reg(context), DX_reg(context));
- break;
- case 0x08:
- FIXME("Define vertical mouse cursor range %d..%d\n",
- CX_reg(context), DX_reg(context));
- break;
- case 0x09:
- FIXME("Define graphics mouse cursor\n");
- break;
- case 0x0A:
- FIXME("Define text mouse cursor\n");
- break;
- case 0x0B:
- TRACE("Read Mouse motion counters\n");
- SET_CX( context, (mouse_info.x - mouse_info.oldx) * (mouse_info.HMPratio / 8) );
- SET_DX( context, (mouse_info.y - mouse_info.oldy) * (mouse_info.VMPratio / 8) );
- mouse_info.oldx = mouse_info.x;
- mouse_info.oldy = mouse_info.y;
- break;
- case 0x0C:
- TRACE("Define mouse interrupt subroutine\n");
- mouse_info.callmask = CX_reg(context);
- mouse_info.callback = (FARPROC16)MAKESEGPTR(context->SegEs, LOWORD(context->Edx));
- break;
- case 0x0F:
- TRACE("Set mickey/pixel ratio\n");
- mouse_info.HMPratio = CX_reg(context);
- mouse_info.VMPratio = DX_reg(context);
- break;
- case 0x10:
- FIXME("Define screen region for update\n");
- break;
- default:
- INT_BARF(context,0x33);
- }
}
typedef struct {
--
Jukka Heinonen <http://www.iki.fi/jhei/>
More information about the wine-patches
mailing list