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

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

#include <config.h>

#include <gpm.h>

/* This is the interface to the GPM mouse under Linux */

#define MOD_SHIFT 1
#define MOD_CTRL 4

static int Mouse_Showing;
static int MouseX, MouseY;

static void draw_mouse (void)
{
   Gpm_Event event;
   int ok = 1;
   
   if (MouseX <= 0)
     {
	ok = 0; MouseX = 0; 
     }
   else if (MouseX > *tt_Screen_Cols)
     {
	ok = 0; MouseX = *tt_Screen_Cols + 1;
     }
   
   if (MouseY <= 0)
     {
	ok = 0; MouseY = 0;
     }
   else if (MouseY > *tt_Screen_Rows)
     {
	ok = 0; MouseY = *tt_Screen_Rows + 1;
     }
   
   if (ok)
     {
	event.x = MouseX;
	event.y = MouseY;
	
	GPM_DRAWPOINTER(&event);
	Mouse_Showing = 1;
     }
   /* else turn off the pointer.  However, there seems to be no mechanism 
    * for this!!!
    */
}


static int mouse_handler_2 (void)
{
   int b = 0, nbuttons;
   Gpm_Event event;
   unsigned char buf[6];
   
   if (Gpm_GetEvent (&event) <= 0) return -1;
   if (Suspend_Mouse_Events) 
     {
	if (Suspend_Mouse_Events == -1) 
	  Suspend_Mouse_Events = 0;
	return -1;
     }
   
   MouseX += event.dx;
   MouseY += event.dy;
   
   draw_mouse ();
   
   if (event.type & GPM_MOVE) return 0;
   
   nbuttons = 0;
   if (event.buttons & GPM_B_LEFT)
     {
	b = 'l';
	JMouse.button = 1;
	nbuttons++;
     }
   if (event.buttons & GPM_B_MIDDLE)
     {
	b = 'm';
	JMouse.button = 2;
	nbuttons++;
     }
   if (event.buttons & GPM_B_RIGHT)
     {
	JMouse.button = 3;
	b = 'r';
	nbuttons++;
     }
   
   if (nbuttons != 1) return 0;
   
   buf[0] = 27; buf[1] = 0;
   
   if (event.type & GPM_DRAG) buf[2] = 0;
   else if (event.type & GPM_DOWN) buf[2] = 'D';
   else if (event.type & GPM_UP) buf[2] = 'U';
   else return 0;
   
   if (event.modifiers & MOD_SHIFT)
     {
	b = b - 'a' + 'A';
     }
   else if (event.modifiers & MOD_CTRL)
     {
	b = b - 'a' + 1;
     }
   
   buf[3] = b;
   ungetkey_string (buf, 4);
   JMouse.x = MouseX;
   JMouse.y = MouseY;
   return 1;
}


static int Warp_Pending;
static void close_update (void)
{
   if (Warp_Pending || Mouse_Showing)
     {
	if (Warp_Pending)
	  {
	     JMouse.x = MouseX = Screen_Col;
	     JMouse.y = MouseY = Screen_Row;
	  }
	else
	  {
	     MouseX = JMouse.x;
	     MouseY = JMouse.y;
	  }
	draw_mouse ();
	Warp_Pending = 0;
     }
   else Mouse_Showing = 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
};

static void hide_mouse (int show)
{
   Mouse_Showing = show;
}

static int open_mouse (void)
{
   static int not_first_time;
   Gpm_Connect conn;
   char *term;
   
   /* Unbelievable.  If we are running in an Xterm, gpm will turn on mouse
    * reporting.  Nice huh? NOT!!!
    */
   term = getenv ("TERM");
   if ((term != NULL)
       && !strncmp (term, "xterm", 5))
     return -1;
   
   conn.eventMask = ~0;
   conn.defaultMask = 0;
   conn.maxMod = MOD_CTRL | MOD_SHIFT;
   conn.minMod = 0;

   Mouse_Showing = 0;
   Suspend_Mouse_Events = -1;
   MouseX = *tt_Screen_Cols / 2;
   MouseY = *tt_Screen_Rows / 2;
   if (-1 == Gpm_Open (&conn, 0)) return -1;
   
   if (not_first_time == 0)
     {
	if (!SLang_add_table(gpm_mouse_table, "Mouse")
	    || !SLdefine_for_ifdef("MOUSE")) return -1;
	
	not_first_time = 1;
     }
   
   JMouse_Event_Hook = mouse_handler_2;
   X_Update_Close_Hook = close_update;
   JMouse_Hide_Mouse_Hook = hide_mouse;
   return gpm_fd;
}

static void close_mouse (void)
{
   X_Update_Close_Hook = NULL;
   if (JMouse_Event_Hook == NULL) return;
   JMouse_Event_Hook = NULL;
   Gpm_Close ();
}


   
int (*X_Open_Mouse_Hook)(void) = open_mouse;
void (*X_Close_Mouse_Hook)(void) = close_mouse;

   

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