ftp.nice.ch/pub/next/unix/editor/jed.N.bs.tar.gz#/jed.N.bs/src/pcmouse.c

This is pcmouse.c in view mode; [Download] [Up]

#include <config.h>

#include <stdio.h>
#include <dos.h>

#define MOUSE_RELEASE 'U'
#define MOUSE_DRAG 0
#define MOUSE_PRESS 'D'


static void generate_press (int x, int y, int type, int but)
{
   char buf[4];
   int b, s;
   
   JMouse.x = x;
   JMouse.y = y;
   
   buf[0] = 27; buf[1] = 0; buf[2] = type;
   b = but & 0xF;
   s = but >> 4;
   if (b == 1) 
     {
	JMouse.button = 1;
	buf[3] = 'l';
     }
   else if (b == 2) 
     {
	JMouse.button = 3;
	buf[3] = 'r';
     }
   else 
     {
	JMouse.button = 2;
	buf[3] = 'm';
     }
   
   if (s & 0x8) 		       /* alt key--- use as middle */
     {
	buf[3] = 'm';
     }
   
   if (s & 0x3)			       /* shift */
     {
	buf[3] -= 0x20;
     }
   else if (s & 0x4)		       /* ctrl */
     {
	buf[3] -= 0x60;
     }
				       
   ungetkey_string (buf, 4);
}




/* Mouse routines for the ibmpc */
static int Mouse_Hidden = 1;
static int Last_Mouse_Hidden = 1;

static void show_mouse (int show)
{
   union REGS r;
   
   if (show) 
     {
	if (Mouse_Hidden == 0) return;
	r.x.ax = 1;
     }
   else 
     {
	if (Mouse_Hidden) return;
	r.x.ax = 2;
     }
   int86 (0x33, &r, &r);
   Mouse_Hidden = !show;
}


static void pc_close_mouse ()
{
   show_mouse (0);
}

static int pc_get_mouse_event (void)
{
   union REGS r;
   static int last_press;
   short x, y;
   
   /* return 0; */
   if (last_press)
     {
	show_mouse (1);
	r.x.ax = 6;
	r.x.bx = (last_press & 0xF) - 1;
	int86 (0x33, &r, &r);
	if (r.x.bx)
	  {
	     r.x.cx = r.x.cx / 8 + 1;
	     r.x.dx = r.x.dx / 8 + 1;
	     generate_press (r.x.cx, r.x.dx, MOUSE_RELEASE, last_press);
	     last_press = 0;
	     return 1;
	  }
     }
	
   r.x.ax = 3;
   int86 (0x33, &r, &r);
   x = r.x.cx;
   y = r.x.dx;
   
#if 0
   /* Check motion counters */
   r.x.ax = 0xB;
   int86 (0x33, &r, &r);	
#endif
   if (last_press)
     {
#if 0
	y += (short) (int) (r.x.dx);
#endif
	
	x = x / 8 + 1;
	y = y / 8 + 1;
	
	if ((JMouse.x == x) && (JMouse.y == y)) return 0;
	generate_press (x, y, MOUSE_DRAG, last_press);
	return 1;
     }
   
   x = x / 8 + 1;
   y = y / 8 + 1;
   
   /* It looks like we are looking for a press. */
   if ((JMouse.x != x) || (JMouse.y != y))
     {
	/* mouse moved so show it. */
	show_mouse (1);
     }
   JMouse.x = x;
   JMouse.y = y;
   if (r.x.bx)
     {
	if (r.x.bx & 1) last_press = 1;   /* left */
	else if (r.x.bx & 2) last_press = 2;   /* right */
	else if (r.x.bx & 4) last_press = 3;	       /* middle */
	else return 0;
	
	/* Find shift key status */
#ifdef __GO32__
	r.h.ah = 0x12;
	int86 (0x16, &r, &r);
	last_press |= (r.x.ax & 0xF) << 4;
#else
	last_press |= (*(unsigned char far *) 0x417) << 4;
#endif
	generate_press (x, y, MOUSE_PRESS, last_press);
	return 1;
     }
   return 0;
}

static void move_mouse (int x, int y)
{
   union REGS r;
   r.x.ax = 4;
   r.x.cx = 8 * (x - 1);
   r.x.dx = 8 * (y - 1);
   int86 (0x33, &r, &r);
}

static void pc_update_open_hook (void)
{
   Last_Mouse_Hidden = Mouse_Hidden;
   if (Mouse_Hidden == 0) show_mouse (0);
}

static int Warp_Pending;
static void pc_update_close_hook (void)
{
   if (Last_Mouse_Hidden == 0) show_mouse (1);
   if (Warp_Pending) move_mouse (Screen_Col, Screen_Row);
   Warp_Pending = 0;
}

static void warp_pointer (void)
{
   Warp_Pending = 1;
}



static char *CutBuffer;
static int CutBuffer_Len;

static int insert_cutbuffer (void)
{
   CHECK_READ_ONLY
   if (CutBuffer == NULL) return 0;
   if (CutBuffer_Len) ins_chars ((unsigned char *) CutBuffer, CutBuffer_Len);
   return CutBuffer_Len;
}

static void region_to_cutbuffer (void)
{
   int nbytes;
   
   if (CutBuffer != NULL)
     {
	SLFREE (CutBuffer);
     }
   
   CutBuffer = make_buffer_substring(&nbytes);
   CutBuffer_Len = nbytes;
}

static SLang_Name_Type gpm_mouse_table[] =
{
   MAKE_INTRINSIC(".x_warp_pointer", warp_pointer, VOID_TYPE, 0),
   MAKE_INTRINSIC(".x_insert_cutbuffer", insert_cutbuffer, INT_TYPE, 0),
   /* Prototype: Integer x_insert_cut_buffer ();
    * Inserts cutbuffer into the current buffer and returns the number
    * of characters inserted.
    */
   MAKE_INTRINSIC(".x_copy_region_to_cutbuffer", region_to_cutbuffer, VOID_TYPE, 0),
   /* Prototype: Void x_copy_region_to_cutbuffer();
    */
   SLANG_END_TABLE
};

void (*X_Close_Mouse_Hook)(void);
static int pc_open_mouse ()
{
   union REGS r;
   int rows, cols, scanlines;
   static int not_first_time;

   X_Close_Mouse_Hook = NULL;
   JMouse_Event_Hook = NULL;
   JMouse_Hide_Mouse_Hook = NULL;
   X_Update_Open_Hook = NULL;
   X_Update_Close_Hook = NULL;
#ifndef __GO32__
   if (getvect (0x33) == NULL) return -1;
#endif
   /* Now see if the mouse is present */
   r.x.ax = 0x21;
   int86 (0x33, &r, &r);
   if (r.x.ax == 0x21) return -1;
   
   if ((scanlines = get_term_dimensions (&cols, &rows)) <= 0)
     scanlines = 8;
   
   r.x.ax = 7;
   r.x.cx = 0;
   r.x.dx = 8 * cols - 1;
   int86 (0x33, &r, &r);
   
   r.x.ax = 8;
   r.x.cx = 0;
   r.x.dx = scanlines * rows - 1;
   int86 (0x33, &r, &r);
   
   JMouse.x = cols / 2 + 1;
   JMouse.y = rows / 2 + 1;
   move_mouse (JMouse.x, JMouse.y);
   
   if (not_first_time == 0)
     {
	if (!SLang_add_table(gpm_mouse_table, "Mouse")
	    || !SLdefine_for_ifdef("MOUSE")) return -1;
	
	not_first_time = 1;
     }
   
   JMouse_Hide_Mouse_Hook = show_mouse;
   X_Close_Mouse_Hook = pc_close_mouse;
   JMouse_Event_Hook = pc_get_mouse_event;
   X_Update_Open_Hook = pc_update_open_hook;
   X_Update_Close_Hook = pc_update_close_hook;
   return 1;
}
int (*X_Open_Mouse_Hook)(void) = pc_open_mouse;

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.