Re: mouse - svgalib (fwd)

Search this archive.

From: Dr. Michael Weller (eowmob@exp-math.uni-essen.de)
Date: Thu 13 Jul 2000 - 19:37:22 IDT


On Thu, 13 Jul 2000, Sergio Masci wrote:

> Could someone please answer Pradeep's query. I have no experience of
> vga_waitevent, keyboard_update or keyboard_getstate (I use mouse_update

Probably this is my turn, I wrote vga_waitevent().

> > From: Pradeep Tumati <ptumati@vt.edu>
> > Subject: mouse - svgalib
> > Message-id: <4.3.2.7.0.20000712231019.00b056a0@mail.vt.edu>

> > Hello sir,
> > here is a sample program. It combines all the raw text, vga mode and the 
> > mouse. Can you please tell me where should I put the vga_waitevent to make 
> > this work...
> > int main( )
> > {
> > 	int a,b ;
> > 	char *ret;
> > 	a=vga_init( );
> > 	if (a==0)
> > 	{
> > 		vga_setmode(4);
> > 		vga_setmousesupport(1);

# You should enable the mouse before the setmode.. It needs to know the
# screen rez for wrapping (should not be a problem though).

> > 		b=keyboard_init( );

# I'd also feel more comfortable to set the keyboard before the screen,
# but it is ok this way around

> > 		if (b==0)
> > 		{


Here you need to add the vga_waitevent(). However, it also means the
structure of your program is completely changed to an even driven scheme.
(at least it should be). W/o trying to compile/run this, my suggestion:

			int event;

			/* this buffer is static, BTW, you only
                           need to call ret=keyboard_getstate()
                           once: */
			ret=keyboard_getstate( );

			for (;;) {
			    event = vga_waitevent(VGA_MOUSEEVENT |
				VGA_KEYEVENT, NULL, NULL, NULL, NULL);
			    if (event & VGA_KEYEVENT) {
				if (ret[SCANCODE_ESCAPE]) {
					/* do something. Probably you
                                           want this: */
					break;
				}
				if ... check for other keys.
			    }
			    if (event & VGA_MOUSEEVENT) {
				x = mouse_getx( );
				y = mouse_gety( );
				/* do some mouse pointer updating etc.. */
			    }
			}
			
> > 			keyboard_update( );
> > 			ret=keyboard_getstate( );
> > 			while(!ret[SCANCODE_ESCAPE])
> > 			{
> > 				ret=keyboard_getstate( );
> > 				x=mouse_getx( );
> > 				y= mouse_gety( );
> > 	/* I guess it is here, if it is so, what about the keyboard update event 
> > in the next line?

You don't need to call the _update funcs.. waitevent does that already
for you. However, calling them is no problem (except a waste of CPU
time), as long as you choose the non-blocking variants.

You COULD indeed add vga_waitevent(VGA_MOUSEEVENT | VGA_KEYEVENT, NULL...)
here. It would work.. but in your philosophy a mouse_update would then be
missing (but vga_waitevent does that anyway) and you would not use that
vga_waitevent returns already what kind of even actually occured (so you'd
waste a little bit of CPU time).

Theoretically it would make more sense to add it in front of x=mouse_getx(
);, BTW: Because you read the mouse coords only after they've changed.
Not a problem though as this is only in the first loop. In that light,
do { ....} while(!ret[SCANCODE_ESCAPE]) would be more sensible too.
You only check for Escape key when a key was actually pressed (not
before).

The only benefit the vga_waitevent would have is your program would not
use 100% cpu time.

Note that vga_waitevent() may return 0 even in this simple setup
if a signal was sent to your process.

> > 				keyboard_update( );
> > 			}
> > 		}
> > 	}
> > }

I also invite you to study the eventtest.c demo program which is packed
with svgalib.

Hope this helps,
Michael.

--

Michael Weller: eowmob@exp-math.uni-essen.de, eowmob@ms.exp-math.uni-essen.de,
or even mat42b@spi.power.uni-essen.de. If you encounter an eowmob account on
any machine in the net, it's very likely it's me.


This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST