bin/82762: [patch] adding a virtual horizontal scroll feature to moused

Eric Kjeldergaard kjelderg at gmail.com
Wed Jun 29 03:30:31 GMT 2005


>Number:         82762
>Category:       bin
>Synopsis:       [patch] adding a virtual horizontal scroll feature to moused
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jun 29 03:30:28 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Eric Kjeldergaard <kjelderg at gmail.com>
>Release:        FreeBSD 6.0-CURRENT i386
>Organization:
>Environment:
System: FreeBSD 6.0-CURRENT FreeBSD 6.0-CURRENT #3: Sat Jun 25 15:01:29 UTC 2005 t
oor@:/usr/obj/usr/src/sys/UNINFECTABLE i386

	
>Description:
	The attached patch adds a -H option to moused.  moused has a -V option.  The -V option allows a user to generate "vertical scroll events" by holding the middle button of the mouse and generating Y-Axis movement.  Similarly, the -H option allows users to generate "horizontal scroll events" by holding the middle button and generating X-Axis movement.  The -V and -H options may be used together or separately.  Both options respect the threshold which can be set with the -U option.
>How-To-Repeat:
	
>Fix:

	

--- moused.diff begins here ---
*** moused.c	Wed Apr 13 16:25:45 2005
--- moused.c.horizontal	Wed Jun 29 00:26:07 2005
***************
*** 97,106 ****
--- 97,107 ----
  #define Emulate3Button	0x0002
  #define ClearDTR	0x0004
  #define ClearRTS	0x0008
  #define NoPnP		0x0010
  #define VirtualScroll	0x0020
+ #define HVirtualScroll	0x0040
  
  #define ID_NONE		0
  #define ID_PORT		1
  #define ID_IF		2
  #define ID_TYPE		4
***************
*** 165,174 ****
--- 166,176 ----
  #define SCROLL_PREPARE		1
  #define SCROLL_SCROLLING	2
  
  static int	scroll_state;
  static int	scroll_movement;
+ static int	hscroll_movement;
  
  /* local variables */
  
  /* interface (the table must be ordered by MOUSE_IF_XXX in mouse.h) */
  static symtab_t rifs[] = {
***************
*** 521,531 ****
      int retry;
  
      for (i = 0; i < MOUSE_MAXBUTTON; ++i)
  	mstate[i] = &bstate[i];
  
!     while ((c = getopt(argc, argv, "3C:DE:F:I:PRS:VU:a:cdfhi:l:m:p:r:st:w:z:")) != -1)
  	switch(c) {
  
  	case '3':
  	    rodent.flags |= Emulate3Button;
  	    break;
--- 523,533 ----
      int retry;
  
      for (i = 0; i < MOUSE_MAXBUTTON; ++i)
  	mstate[i] = &bstate[i];
  
!     while ((c = getopt(argc, argv, "3C:DE:F:HI:PRS:VU:a:cdfhi:l:m:p:r:st:w:z:")) != -1)
  	switch(c) {
  
  	case '3':
  	    rodent.flags |= Emulate3Button;
  	    break;
***************
*** 686,695 ****
--- 688,701 ----
  		warnx("invalid argument `%s'", optarg);
  		usage();
  	    }
  	    break;
  
+ 	case 'H':
+ 	    rodent.flags |= HVirtualScroll;
+ 	    break;
+ 		 
  	case 'I':
  	    pidfile = optarg;
  	    break;
  
  	case 'P':
***************
*** 991,1001 ****
  		    return;
  	    }
  	    if ((flags = r_protocol(b, &action0)) == 0)
  		continue;
  
! 	    if (rodent.flags & VirtualScroll) {
  		/* Allow middle button drags to scroll up and down */
  		if (action0.button == MOUSE_BUTTON2DOWN) {
  		    if (scroll_state == SCROLL_NOTSCROLLING) {
  			scroll_state = SCROLL_PREPARE;
  			debug("PREPARING TO SCROLL");
--- 997,1007 ----
  		    return;
  	    }
  	    if ((flags = r_protocol(b, &action0)) == 0)
  		continue;
  
! 	    if ((rodent.flags & VirtualScroll) || (rodent.flags & HVirtualScroll)) {
  		/* Allow middle button drags to scroll up and down */
  		if (action0.button == MOUSE_BUTTON2DOWN) {
  		    if (scroll_state == SCROLL_NOTSCROLLING) {
  			scroll_state = SCROLL_PREPARE;
  			debug("PREPARING TO SCROLL");
***************
*** 1051,1061 ****
  	if (flags) {			/* handler detected action */
  	    r_map(&action, &action2);
  	    debug("activity : buttons 0x%08x  dx %d  dy %d  dz %d",
  		action2.button, action2.dx, action2.dy, action2.dz);
  
! 	    if (rodent.flags & VirtualScroll) {
  		/* 
  		 * If *only* the middle button is pressed AND we are moving
  		 * the stick/trackpoint/nipple, scroll!
  		 */
  		if (scroll_state == SCROLL_PREPARE) {
--- 1057,1067 ----
  	if (flags) {			/* handler detected action */
  	    r_map(&action, &action2);
  	    debug("activity : buttons 0x%08x  dx %d  dy %d  dz %d",
  		action2.button, action2.dx, action2.dy, action2.dz);
  
! 	    if ((rodent.flags & VirtualScroll) || (rodent.flags & HVirtualScroll)) {
  		/* 
  		 * If *only* the middle button is pressed AND we are moving
  		 * the stick/trackpoint/nipple, scroll!
  		 */
  		if (scroll_state == SCROLL_PREPARE) {
***************
*** 1063,1084 ****
  		    if (action2.dy || action2.dx)
  			scroll_state = SCROLL_SCROLLING;
  		}
  		if (scroll_state == SCROLL_SCROLLING) {
  		    scroll_movement += action2.dy;
! 		    debug("SCROLL: %d", scroll_movement);
  
! 		    if (scroll_movement < -rodent.scrollthreshold) { 
! 			/* Scroll down */
! 			action2.dz = -1;
! 			scroll_movement = 0;
! 		    }
! 		    else if (scroll_movement > rodent.scrollthreshold) { 
! 			/* Scroll up */
! 			action2.dz = 1;
! 			scroll_movement = 0;
! 		    }
  
  		    /* Don't move while scrolling */
  		    action2.dx = action2.dy = 0;
  		}
  	    }
--- 1069,1106 ----
  		    if (action2.dy || action2.dx)
  			scroll_state = SCROLL_SCROLLING;
  		}
  		if (scroll_state == SCROLL_SCROLLING) {
  		    scroll_movement += action2.dy;
! 			 hscroll_movement += action2.dx;
  
! 			 if (rodent.flags & VirtualScroll) {
! 				debug("Rodent Flags: %d", rodent.flags);
! 		    	debug("SCROLL: %d", scroll_movement);
! 			    if (scroll_movement < -rodent.scrollthreshold) { 
! 				/* Scroll down */
! 				action2.dz = -1;
! 				scroll_movement = 0;
! 			    }
! 			    else if (scroll_movement > rodent.scrollthreshold) { 
! 				/* Scroll up */
! 				action2.dz = 1;
! 				scroll_movement = 0;
! 			    }
! 			 }
! 			 if (rodent.flags & HVirtualScroll) {
! 				debug("Rodent Flags: %d", rodent.flags);
! 		    	debug("HORIZONTAL SCROLL: %d", hscroll_movement);
! 				 if (hscroll_movement < -rodent.scrollthreshold) {
! 					 action2.dz = -2;
! 					 hscroll_movement = 0;
! 				 }
! 				 else if (hscroll_movement > rodent.scrollthreshold) {
! 					 action2.dz = 2;
! 					 hscroll_movement = 0;
! 				 }
! 			 }
  
  		    /* Don't move while scrolling */
  		    action2.dx = action2.dy = 0;
  		}
  	    }
***************
*** 1156,1166 ****
  static void
  usage(void)
  {
      fprintf(stderr, "%s\n%s\n%s\n%s\n",
  	"usage: moused [-DRcdfs] [-I file] [-F rate] [-r resolution] [-S baudrate]",
! 	"              [-V [-U threshold]] [-a X [,Y]] [-C threshold] [-m N=M] [-w N]",
  	"              [-z N] [-t <mousetype>] [-l level] [-3 [-E timeout]] -p <port>",
  	"       moused [-d] -i <port|if|type|model|all> -p <port>");
      exit(1);
  }
  
--- 1178,1188 ----
  static void
  usage(void)
  {
      fprintf(stderr, "%s\n%s\n%s\n%s\n",
  	"usage: moused [-DRcdfs] [-I file] [-F rate] [-r resolution] [-S baudrate]",
! 	"              [-VH [-U threshold]] [-a X [,Y]] [-C threshold] [-m N=M] [-w N]",
  	"              [-z N] [-t <mousetype>] [-l level] [-3 [-E timeout]] -p <port>",
  	"       moused [-d] -i <port|if|type|model|all> -p <port>");
      exit(1);
  }
  
--- moused.diff ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list