[comp.windows.x] cursorfont and xsetroot

mtr@mace.cc.purdue.edu (Miek Rowan) (11/27/88)

I couldn't find a way to set my root window cursor to one of the "standard" 
cursors defined in <X11/cursorfont.h> -  If I missed something obvious please
let me know.  I added a "-cursorfont <shape>" option to xsetroot so that I 
could do just that - change my root window cursor to anything defined in the 
server through cursor.snf.   It takes the symbolic name from the include
file.  ie:
xsetroot -cursorfont XC_dot

At first it would also take a number (eg "xsetroot -cursorfont 38"), but I 
decided that that was wrong.  I ifdef'ed it out as NONPORTABLE for anyone 
who really does want it.

Here are the diffs.  Even a man page entry!

mtr


---- cut here ----

*** /tmp/,RCSt1003334	Sat Nov 26 23:20:56 1988
--- xsetroot.c	Sat Nov 26 22:56:22 1988
***************
*** 4,9 ****
--- 4,11 ----
  #include <X11/Xutil.h>
  #include <X11/Xatom.h>
  #include <stdio.h>
+ #include <ctype.h>
+ #include <X11/cursorfont.h>
  #include "X11/bitmaps/gray"
  
  /*
***************
*** 42,47 ****
--- 44,50 ----
      fprintf(stderr, "  -def   or   -default\n");
      fprintf(stderr, "  -name <string>\n");
      fprintf(stderr, "  -cursor <cursor file> <mask file>\n");
+     fprintf(stderr, "  -cursorfont <cursor-font>\n");
      fprintf(stderr, "  -solid <color>\n");
      fprintf(stderr, "  -gray   or   -grey\n");
      fprintf(stderr, "  -bitmap <filename>\n");
***************
*** 61,66 ****
--- 64,70 ----
      int excl = 0;
      int nonexcl = 0;
      int restore_defaults = 0;
+     int iCursor = -1;
      char *display_name = NULL;
      char *name = NULL;
      char *cursor_file = NULL;
***************
*** 145,150 ****
--- 149,170 ----
  	    reverse = 1;
  	    continue;
  	}
+ 	if (!strcmp("-cursorfont",argv[i])) {
+ 		if( i++ >= argc) {
+ 			usage();
+ 		}
+ #ifdef NONPORTABLE
+ 		if(isdigit(*argv[i])) {
+ 			iCursor = atoi(argv[i]);
+ 		} else 
+ #endif /* NONPORTABLE */
+ 			if(-1 == (iCursor = SetStdCursor(argv[i]))) {
+ 				usage();
+ 			}
+ 		nonexcl++;
+ 		continue;
+ 	}
+ 
  	usage();
      } 
  
***************
*** 174,180 ****
  	XDefineCursor(dpy, root, cursor);
  	XFreeCursor(dpy, cursor);
      }
!   
      /* Handle -gray and -grey options */
      if (gray) {
  	bitmap = XCreateBitmapFromData(dpy, root, gray_bits,
--- 194,210 ----
  	XDefineCursor(dpy, root, cursor);
  	XFreeCursor(dpy, cursor);
      }
! 
!     if(iCursor != -1) {
! 	Cursor cursorfromfont;
! 
! 	cursorfromfont = XCreateFontCursor(dpy, iCursor);
! 	if((Cursor) 0 != cursorfromfont)  {
! 		XDefineCursor(dpy, root, cursorfromfont);
! 		XFreeCursor(dpy, cursorfromfont);
! 	}		
!     }	
! 
      /* Handle -gray and -grey options */
      if (gray) {
  	bitmap = XCreateBitmapFromData(dpy, root, gray_bits,
***************
*** 208,214 ****
    
      /* Handle restore defaults */
      if (restore_defaults) {
! 	if (!cursor_file)
  	    XUndefineCursor(dpy, root);
  	if (!excl) {
  	    XSetWindowBackgroundPixmap(dpy, root, (Pixmap) None);
--- 238,244 ----
    
      /* Handle restore defaults */
      if (restore_defaults) {
! 	if (!cursor_file && iCursor != -1)
  	    XUndefineCursor(dpy, root);
  	if (!excl) {
  	    XSetWindowBackgroundPixmap(dpy, root, (Pixmap) None);
***************
*** 439,442 ****
--- 469,572 ----
  			program_name, filename);
      exit(1);
      /*NOTREACHED*/
+ }
+ 
+ typedef struct {
+ 	char	*pchcursor;
+ 	int	shape;
+ } CursorFontType;
+ 
+ CursorFontType CursorFonts[] = {
+ 	"XC_num_glyphs",		XC_num_glyphs,
+ 	"XC_X_cursor",			XC_X_cursor,
+ 	"XC_arrow",			XC_arrow,
+ 	"XC_based_arrow_down",		XC_based_arrow_down,
+ 	"XC_based_arrow_up",		XC_based_arrow_up,
+ 	"XC_boat",			XC_boat,
+ 	"XC_bogosity",			XC_bogosity,
+ 	"XC_bottom_left_corner",	XC_bottom_left_corner,
+ 	"XC_bottom_right_corner",	XC_bottom_right_corner,
+ 	"XC_bottom_side",		XC_bottom_side,
+ 	"XC_bottom_tee",		XC_bottom_tee,
+ 	"XC_box_spiral",		XC_box_spiral,
+ 	"XC_center_ptr",		XC_center_ptr,
+ 	"XC_circle",			XC_circle,
+ 	"XC_clock",			XC_clock,
+ 	"XC_coffee_mug",		XC_coffee_mug,
+ 	"XC_cross",			XC_cross,
+ 	"XC_cross_reverse",		XC_cross_reverse,
+ 	"XC_crosshair",			XC_crosshair,
+ 	"XC_diamond_cross",		XC_diamond_cross,
+ 	"XC_dot",			XC_dot,
+ 	"XC_dotbox",			XC_dotbox,
+ 	"XC_double_arrow",		XC_double_arrow,
+ 	"XC_draft_large",		XC_draft_large,
+ 	"XC_draft_small",		XC_draft_small,
+ 	"XC_draped_box",		XC_draped_box,
+ 	"XC_exchange",			XC_exchange,
+ 	"XC_fleur",			XC_fleur,
+ 	"XC_gobbler",			XC_gobbler,
+ 	"XC_gumby",			XC_gumby,
+ 	"XC_hand1",			XC_hand1,
+ 	"XC_hand2",			XC_hand2,
+ 	"XC_heart",			XC_heart,
+ 	"XC_icon",			XC_icon,
+ 	"XC_iron_cross",		XC_iron_cross,
+ 	"XC_left_ptr",			XC_left_ptr,
+ 	"XC_left_side",			XC_left_side,
+ 	"XC_left_tee",			XC_left_tee,
+ 	"XC_leftbutton",		XC_leftbutton,
+ 	"XC_ll_angle",			XC_ll_angle,
+ 	"XC_lr_angle",			XC_lr_angle,
+ 	"XC_man",			XC_man,
+ 	"XC_middlebutton",		XC_middlebutton,
+ 	"XC_mouse",			XC_mouse,
+ 	"XC_pencil",			XC_pencil,
+ 	"XC_pirate",			XC_pirate,
+ 	"XC_plus",			XC_plus,
+ 	"XC_question_arrow",		XC_question_arrow,
+ 	"XC_right_ptr",			XC_right_ptr,
+ 	"XC_right_side",		XC_right_side,
+ 	"XC_right_tee",			XC_right_tee,
+ 	"XC_rightbutton",		XC_rightbutton,
+ 	"XC_rtl_logo",			XC_rtl_logo,
+ 	"XC_sailboat",			XC_sailboat,
+ 	"XC_sb_down_arrow",		XC_sb_down_arrow,
+ 	"XC_sb_h_double_arrow",		XC_sb_h_double_arrow,
+ 	"XC_sb_left_arrow",		XC_sb_left_arrow,
+ 	"XC_sb_right_arrow",		XC_sb_right_arrow,
+ 	"XC_sb_up_arrow",		XC_sb_up_arrow,
+ 	"XC_sb_v_double_arrow",		XC_sb_v_double_arrow,
+ 	"XC_shuttle",			XC_shuttle,
+ 	"XC_sizing",			XC_sizing,
+ 	"XC_spider",			XC_spider,
+ 	"XC_spraycan",			XC_spraycan,
+ 	"XC_star",			XC_star,
+ 	"XC_target",			XC_target,
+ 	"XC_tcross",			XC_tcross,
+ 	"XC_top_left_arrow",		XC_top_left_arrow,
+ 	"XC_top_left_corner",		XC_top_left_corner,
+ 	"XC_top_right_corner",		XC_top_right_corner,
+ 	"XC_top_side",			XC_top_side,
+ 	"XC_top_tee",			XC_top_tee,
+ 	"XC_trek",			XC_trek,
+ 	"XC_ul_angle",			XC_ul_angle,
+ 	"XC_umbrella",			XC_umbrella,
+ 	"XC_ur_angle",			XC_ur_angle,
+ 	"XC_watch",			XC_watch,
+ 	"XC_xterm",			XC_xterm,
+ 	(char *) 0,			-1
+ };
+ 
+ SetStdCursor(pchCursorDef)
+ 	char	*pchCursorDef;
+ {
+ 	int	iCnt;
+ 
+ 	for(iCnt = 0; CursorFonts[iCnt].pchcursor != (char *) 0; iCnt++) {
+ 		if(!strcmp(pchCursorDef, CursorFonts[iCnt].pchcursor)) {
+ 			return CursorFonts[iCnt].shape;
+ 		}
+ 	}
+ 	return -1;
  }


*** /tmp/,RCSt1003454	Sat Nov 26 23:26:42 1988
--- xsetroot.man	Sat Nov 26 23:22:47 1988
***************
*** 41,46 ****
--- 41,52 ----
  .I bitmap(1)
  program.  You probably want the mask file to be all black until you
  get used to the way masks work.
+ .IP "\fB-cursorfont\fP \fIcursorfontsymbol\fP"
+ This lets you change the pointer cursor to one of
+ the cursors referenced in 
+ .I /usr/include/X11/cursorfont.h 
+ which are defined in the font file 
+ .I /usr/lib/X11/fonts/misc/cursor.snf.
  .IP "\fB-bitmap\fP \fIfilename\fP"
  Use the bitmap specified in the file to set the window pattern.  You can
  make your own bitmap files (little pictures) using the