Re: FVWM: lefty cursors

From: Xris Laas <chrisl_at_cybercom.net>
Date: Wed, 5 Mar 1997 18:47:43 -0500 (EST)

On 4 Mar, Mark Borges wrote:
> is there a simple way (in fvwm-2.0.45) to change the pointer cursor to
> have a SW-NE orientation instead of SE-NW?
>
> i was recently advised to switch the mouse to my left hand, and i find
> it a bit awkward to use the default cursor orientation.

OK, I started a lot of discussion here, but I figure the end issue is
changing the Fvwm cursors.

I just wrote a patch that adds simple cursor configurability to fvwm
with a CursorConfig command. The patch is against 2.0.43, so it
may be slightly outdated, but it should probably patch fine.

Side note to Chuck: could you add this, or something similar, to the
distribution? BTW, I wrote it before I got your message with the
previous patch, so it's not based on it. It also doesn't do a refresh
of all windows, but that might be a good thing, since you might want
windows to retain their old cursors, i.e.:

AddToFunc Foo
+ I CursorConfig title_cursor arrow
+ I Exec foo
+ I Wait foo
+ I CursorConfig title_cursor gumby

Though that might not be too useful. Really, the two patches look
almost the same, other than that, and the fact that mine used lookup
tables as opposed to if .. else's.

I neglected to write any docs (sorry) but the syntax is:

CursorConfig <which cursor> <X11 cursor name>

where <which cursor> is one of the names in screen.h (not case
sensitive): position, title_cursor, default, sys, move, wait, menu,
select, destroy, top, right, bottom, left, top_left, top_right,
bottom_left, or bottom_right. <X11 cursor name> is one of the names in
<X11/cursorfont.h>, minus the "XC_".

(Patch follows signature. Note: patch -p2 from the distribution root
is the way to go.)

--Chris

-- 
The history of the present King of Great Britain is a history of
repeated injuries and usurpations, all having in direct object the
establishment of an absolute tyranny over these states.
    -- Thomas Jefferson, Prologue, "Declaration of Independence"
{ Chris "Xris" Laas }-----{ chrisl_at_cybercom.net }-----{ xris_at_qfl.com }
<*>--------------{ http://www.cybercom.net/~chrisl/ }--------------<*>
File fvwm-cursor-config.patch:
------------------------------------------------------------------------
diff -ru /usr/src/fvwm-orig/fvwm/builtins.c ./fvwm-devel/fvwm/builtins.c
--- /usr/src/fvwm-orig/fvwm/builtins.c	Thu Jun 27 10:34:19 1996
+++ ./fvwm-devel/fvwm/builtins.c	Wed Mar  5 17:10:29 1997
_at_@ -1139,6 +1139,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 /usr/src/fvwm-orig/fvwm/functions.c ./fvwm-devel/fvwm/functions.c
--- /usr/src/fvwm-orig/fvwm/functions.c	Wed Jun 19 20:01:56 1996
+++ ./fvwm-devel/fvwm/functions.c	Wed Mar  5 16:29:09 1997
_at_@ -44,6 +44,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 /usr/src/fvwm-orig/fvwm/misc.h ./fvwm-devel/fvwm/misc.h
--- /usr/src/fvwm-orig/fvwm/misc.h	Wed Jun 19 21:31:15 1996
+++ ./fvwm-devel/fvwm/misc.h	Wed Mar  5 16:30:49 1997
_at_@ -453,6 +453,8 @@
 		   unsigned long context, char *action,int* Module);
 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 /usr/src/fvwm-orig/fvwm/parse.h ./fvwm-devel/fvwm/parse.h
--- /usr/src/fvwm-orig/fvwm/parse.h	Thu May 30 14:03:10 1996
+++ ./fvwm-devel/fvwm/parse.h	Wed Mar  5 16:24:01 1997
_at_@ -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
--
Visit the official FVWM web page at <URL:http://www.hpc.uh.edu/fvwm/>.
To unsubscribe from the list, send "unsubscribe fvwm" in the body of a
message to majordomo_at_hpc.uh.edu.
To report problems, send mail to fvwm-owner_at_hpc.uh.edu.
Received on Wed Mar 05 1997 - 17:47:37 GMT

This archive was generated by hypermail 2.3.0 : Mon Aug 29 2016 - 19:38:00 BST