diff -ru fvwm-2.0.45/fvwm/builtins.c fvwm-2.0.45.1/fvwm/builtins.c
--- fvwm-2.0.45/fvwm/builtins.c	Wed Jan 22 06:37:28 1997
+++ fvwm-2.0.45.1/fvwm/builtins.c	Wed Mar  5 17:15:58 1997
@@ -1335,6 +1335,150 @@
   checkPanFrames();
 }
 
+
+#define CTYPE(type) { #type , type }
+static struct {
+  char *name;
+  int id;
+} cursor_type_names[] = {
+  CTYPE(POSITION),
+  CTYPE(TITLE_CURSOR),
+  CTYPE(DEFAULT),
+  CTYPE(SYS),
+  CTYPE(MOVE),
+  CTYPE(WAIT),
+  CTYPE(MENU),
+  CTYPE(SELECT),
+  CTYPE(DESTROY),
+  CTYPE(TOP),
+  CTYPE(RIGHT),
+  CTYPE(BOTTOM),
+  CTYPE(LEFT),
+  CTYPE(TOP_LEFT),
+  CTYPE(TOP_RIGHT),
+  CTYPE(BOTTOM_LEFT),
+  CTYPE(BOTTOM_RIGHT)
+};
+static struct {
+  char *name;
+  int id;
+} cursor_names[] = {
+  {"X_cursor",                XC_X_cursor},
+  {"arrow",                   XC_arrow},
+  {"based_arrow_down",        XC_based_arrow_down},
+  {"based_arrow_up",          XC_based_arrow_up},
+  {"boat",                    XC_boat},
+  {"bogosity",                XC_bogosity},
+  {"bottom_left_corner",      XC_bottom_left_corner},
+  {"bottom_right_corner",     XC_bottom_right_corner},
+  {"bottom_side",             XC_bottom_side},
+  {"bottom_tee",              XC_bottom_tee},
+  {"box_spiral",              XC_box_spiral},
+  {"center_ptr",              XC_center_ptr},
+  {"circle",                  XC_circle},
+  {"clock",                   XC_clock},
+  {"coffee_mug",              XC_coffee_mug},
+  {"cross",                   XC_cross},
+  {"cross_reverse",           XC_cross_reverse},
+  {"crosshair",               XC_crosshair},
+  {"diamond_cross",           XC_diamond_cross},
+  {"dot",                     XC_dot},
+  {"dotbox",                  XC_dotbox},
+  {"double_arrow",            XC_double_arrow},
+  {"draft_large",             XC_draft_large},
+  {"draft_small",             XC_draft_small},
+  {"draped_box",              XC_draped_box},
+  {"exchange",                XC_exchange},
+  {"fleur",                   XC_fleur},
+  {"gobbler",                 XC_gobbler},
+  {"gumby",                   XC_gumby},
+  {"hand1",                   XC_hand1},
+  {"hand2",                   XC_hand2},
+  {"heart",                   XC_heart},
+  {"icon",                    XC_icon},
+  {"iron_cross",              XC_iron_cross},
+  {"left_ptr",                XC_left_ptr},
+  {"left_side",               XC_left_side},
+  {"left_tee",                XC_left_tee},
+  {"leftbutton",              XC_leftbutton},
+  {"ll_angle",                XC_ll_angle},
+  {"lr_angle",                XC_lr_angle},
+  {"man",                     XC_man},
+  {"middlebutton",            XC_middlebutton},
+  {"mouse",                   XC_mouse},
+  {"pencil",                  XC_pencil},
+  {"pirate",                  XC_pirate},
+  {"plus",                    XC_plus},
+  {"question_arrow",          XC_question_arrow},
+  {"right_ptr",               XC_right_ptr},
+  {"right_side",              XC_right_side},
+  {"right_tee",               XC_right_tee},
+  {"rightbutton",             XC_rightbutton},
+  {"rtl_logo",                XC_rtl_logo},
+  {"sailboat",                XC_sailboat},
+  {"sb_down_arrow",           XC_sb_down_arrow},
+  {"sb_h_double_arrow",       XC_sb_h_double_arrow},
+  {"sb_left_arrow",           XC_sb_left_arrow},
+  {"sb_right_arrow",          XC_sb_right_arrow},
+  {"sb_up_arrow",             XC_sb_up_arrow},
+  {"sb_v_double_arrow",       XC_sb_v_double_arrow},
+  {"shuttle",                 XC_shuttle},
+  {"sizing",                  XC_sizing},
+  {"spider",                  XC_spider},
+  {"spraycan",                XC_spraycan},
+  {"star",                    XC_star},
+  {"target",                  XC_target},
+  {"tcross",                  XC_tcross},
+  {"top_left_arrow",          XC_top_left_arrow},
+  {"top_left_corner",         XC_top_left_corner},
+  {"top_right_corner",        XC_top_right_corner},
+  {"top_side",                XC_top_side},
+  {"top_tee",                 XC_top_tee},
+  {"trek",                    XC_trek},
+  {"ul_angle",                XC_ul_angle},
+  {"umbrella",                XC_umbrella},
+  {"ur_angle",                XC_ur_angle},
+  {"watch",                   XC_watch},
+  {"xterm",                   XC_xterm}
+};
+#define dim(x) (sizeof(x) / sizeof(x[0]))
+
+void SetCursorConfig(XEvent *eventp,Window w,FvwmWindow *tmp_win,
+					 unsigned long context, char *action,int* Module)
+{
+  char *ctype=NULL, *fontid=NULL;
+  int i, ctypenum, fontnum;
+
+  action = GetNextToken(action, &ctype);
+  GetNextToken(action, &fontid);
+  for (i = 0; i < dim(cursor_type_names); i++) {
+	/* Is using "mystrcasecmp" really necessary?  What's wrong with
+	 * strcasecmp? */
+	if (mystrcasecmp(ctype, cursor_type_names[i].name) == 0) {
+	  ctypenum = cursor_type_names[i].id;
+	  break;
+	}
+  }
+  if (i == dim(cursor_type_names)) {
+    fvwm_msg(ERR,"SetCursorConfig","Bad cursor type");
+    return;
+  }
+  for (i = 0; i < dim(cursor_names); i++) {
+	if (mystrcasecmp(fontid, cursor_names[i].name) == 0) {
+	  fontnum = cursor_names[i].id;
+	  break;
+	}
+  }
+  if (i == dim(cursor_names)) {
+    fvwm_msg(ERR,"SetCursorConfig","Bad cursor name");
+    return;
+  }
+
+  XFreeCursor(dpy, Scr.FvwmCursors[ctypenum]);
+  Scr.FvwmCursors[ctypenum] = XCreateFontCursor(dpy, fontnum);
+}
+
+
 #ifdef XPM
 char *PixmapPath = FVWM_ICONDIR;
 void setPixmapPath(XEvent *eventp,Window w,FvwmWindow *tmp_win,
diff -ru fvwm-2.0.45/fvwm/functions.c fvwm-2.0.45.1/fvwm/functions.c
--- fvwm-2.0.45/fvwm/functions.c	Tue Jan 14 07:06:33 1997
+++ fvwm-2.0.45.1/fvwm/functions.c	Wed Mar  5 17:18:42 1997
@@ -59,6 +59,7 @@
   {"Close",        close_function,   F_CLOSE,               FUNC_NEEDS_WINDOW},
   {"ColormapFocus",SetColormapFocus, F_COLORMAP_FOCUS,      FUNC_NO_WINDOW},
   {"CursorMove",   movecursor,       F_MOVECURSOR,          FUNC_NO_WINDOW},
+  {"CursorConfig", SetCursorConfig,  F_CURSORCONFIG,        FUNC_NO_WINDOW},
   {"Delete",       delete_function,  F_DELETE,              FUNC_NEEDS_WINDOW},
   {"DesktopSize",  SetDeskSize,       F_SETDESK,            FUNC_NO_WINDOW},
   {"Desk",         changeDesks_func, F_DESK,                FUNC_NO_WINDOW},
diff -ru fvwm-2.0.45/fvwm/misc.h fvwm-2.0.45.1/fvwm/misc.h
--- fvwm-2.0.45/fvwm/misc.h	Mon Dec 23 15:07:47 1996
+++ fvwm-2.0.45.1/fvwm/misc.h	Wed Mar  5 17:21:02 1997
@@ -510,6 +510,8 @@
 #endif
 void SetDeskSize(XEvent *eventp,Window w,FvwmWindow *tmp_win,
 		     unsigned long context, char *action,int* Module);
+void SetCursorConfig(XEvent *eventp,Window w,FvwmWindow *tmp_win,
+ 		     unsigned long context, char *action,int* Module);
 void SetOpaque(XEvent *eventp,Window w,FvwmWindow *tmp_win,
 	       unsigned long context, char *action,int* Module);
 void SetXOR(XEvent *eventp,Window w,FvwmWindow *tmp_win,
diff -ru fvwm-2.0.45/fvwm/parse.h fvwm-2.0.45.1/fvwm/parse.h
--- fvwm-2.0.45/fvwm/parse.h	Mon Dec 23 15:07:47 1996
+++ fvwm-2.0.45.1/fvwm/parse.h	Wed Mar  5 17:22:01 1997
@@ -73,6 +73,7 @@
 #define F_COLORMAP_FOCUS        55
 #define F_TITLESTYLE            56
 #define F_EXEC_SETUP            57
+#define F_CURSORCONFIG          58
 /* Functions which require a target window */
 #define F_RESIZE		100
 #define F_RAISE			101
Only in fvwm-2.0.45.1: fvwm-2.0.45p1

