From: "Mr A Appleyard" Organization: Materials Science Centre To: DJGPP AT delorie DOT com Date: Thu, 21 May 1998 10:13:11 GMT Subject: BUG in Gnu C++ (djgpp v2) mouse access under Windows 95: PS Message-ID: <152388C785A@fs2.mt.umist.ac.uk> Precedence: bulk > From: Self > To: Gnu C email circular > Subject: BUG in Gnu C++ (djgpp v2) mouse access under Windows 95 > Date: Thu, 21 May 1998 09:56:57 GMT > > I posted about this fault before; but since then I have deleted all my mouse > software and bought a new mouse and installed its software, but I still have > the fault. > I wrote two Gnu C++ (djgpp v2) programs that use the mouse, not by polling > it but by supplying a mouse handler interrupt routine, by the function > settrap() appended below, which Eli Zaretski kindly wrote for me some time > ago. They worked OK for ages in DOS 6.22 and previous, both plain and when > called from within Windows 3.1.1. The two programs are:- > AAEMACS.EXE, runs with the screen in DOS mode 3 (ordinary 80*25 char text) > SPATRL.EXE, runs with the screen in various graphics modes. > > But under Windows 95 (which I changed to a few weeks ago) I get faults:- > In `shutdown and restart in DOS mode' (= plain DOS 7), both still OK. > When called from Win95, or from DOS 7 which was called in a Win95 window:- > SPATRL works OK. > AAEMACS.EXE often totally misunderstands where the mouse pointer is, and > sometimes crashes out when I touch or handle the mouse. That is a great > nuisance. > (Under DOS 6.22 and previous, AAEMACS.EXE gave similar mouse faults if I ran > it in enlarged text modes such as 132*43 character mode.) > /*-----*/ > void mouse::settrap(uns long mask,void (*func)(__dpmi_regs *)) { > /* This is tricky in protected-mode. We must allocate a real-mode wrapper > function which will be called by the mouse driver, and which in turn will > switch to protected-mode and call our protected-mode handler function. */ > if(!Jerry.nbuttons) return; > if(!func) {Jerry.handlerInstalled=0; /* remove handler */ > _go32_dpmi_free_real_mode_callback(&cb_info); R.dx=R.es=0;} > else { /* Allocate real-mode call-back. Find real-mode address of handler */ > cb_info.pm_offset=(uns long)func; Jerry.handlerInstalled=1; > if(_go32_dpmi_allocate_real_mode_callback_retf(&cb_info, > (__dpmi_regs*)&cb_regs)) return; > R.dx=cb_info.rm_offset; R.es=cb_info.rm_segment;} > R.ax=12; R.cx=mask; Int(0x33);}