7 static struct mouse_event evbuf[EVQ_SIZE];
10 struct mouse_state mouse;
14 if(!_dos_getvect(0x33)) {
23 union REGS regs = {0};
25 int386(0x33, ®s, ®s);
26 if(regs.w.ax != 0xffff) {
31 /* read initial mouse state */
34 mouse.bn = mouse_state(&mouse.x, &mouse.y);
35 mouse.dx = mouse.dy = 0;
37 evwr = evrd = 0; /* reset event queue pointers */
41 void set_mouse_bounds(int x, int y, int w, int h)
43 union REGS regs = {0};
47 regs.w.dx = x + w - 1;
48 int386(0x33, ®s, ®s);
52 regs.w.dx = y + h - 1;
53 int386(0x33, ®s, ®s);
56 void show_mouse(int en)
58 union REGS regs = {0};
61 if(mouse.visible) return;
64 int386(0x33, ®s, ®s);
66 if(!mouse.visible) return;
69 int386(0x33, ®s, ®s);
73 void move_mouse(int x, int y)
75 union REGS regs = {0};
79 int386(0x33, ®s, ®s);
82 int mouse_state(int *xp, int *yp)
84 union REGS regs = {0};
86 int386(0x33, ®s, ®s);
88 if(xp) *xp = regs.w.cx;
89 if(yp) *yp = regs.w.dx;
93 void mouse_delta(int *dx, int *dy)
95 union REGS regs = {0};
97 int386(0x33, ®s, ®s);
105 int x, y, bn, bndelta, bidx, next;
107 struct mouse_event *ev;
109 bn = mouse_state(&x, &y);
110 mouse.dx = x - mouse.x;
111 mouse.dy = y - mouse.y;
115 if(mouse.dx | mouse.dy) {
116 next = (evwr + 1) & (EVQ_SIZE - 1);
120 ev->type = MOUSE_MOTION;
129 bndelta = bn ^ mouse.bn;
135 next = (evwr + 1) & (EVQ_SIZE - 1);
139 ev->type = MOUSE_BUTTON;
155 int next_mouse_event(struct mouse_event *ev)
157 if(evrd == evwr) return 0;
160 evrd = (evrd + 1) & (EVQ_SIZE - 1);