X11-big-cursor MINIHOWTO<subtitle>How to use enlarged mouse cursors with the X window system <author><url name="J&oe;rg Schneider" url="mailto:joerg.schneider@ira.uka.de"> <date>v2, 11 August 1997 <abstract> This document describes how to use enlarged mouse cursors with the X window system. <!-- <itemize> <item><htmlurl url="#intro" name="Introduction"> <item><htmlurl url="#howto" name="How to do it"> <item><htmlurl url="#notes" name="Notes and limitations"> <item><htmlurl url="#tech" name="Technical discussion"> <item><htmlurl url="#ideas" name="Other ideas how to make the mouse cursor more visible"> <item><htmlurl url="#info" name="Related info"> <itemize> <item><htmlurl url="#fontserver" name="How to use a fontserver"> <itemize> <item><htmlurl url="#fsconfig" name="Setting up a font server"> </itemize> <item><htmlurl url="#getbdf" name="How to get the bdf source for some font"> </itemize> </itemize> --> </abstract> <toc> <sect>Introduction<label id=top> <p>There are several reasons why the standard X mouse cursors are hard to track for some people: <itemize> <item> when running X on a notebook with low contrast LCD <item> on normal screens when using high resolution, 1600x1280 e. g. <item> for visually impaired persons even on normal hardware </itemize> In all cases it might help to use enlarged mouse cursors. Ideally this job should be done by a single X program that automatically enlarges every mouse cursor. To my knowledge there is no simple way to write a utility like this, because the X protocol has no provision to query mouse cursors. For more details see section <ref id="tech" name="Technical discussion"> below. If we aim for a less general goal, though, something can be done: There is a set of standard mouse cursors that can be found in the cursor font (try <TT>xfd -fn cursor</TT> to look at it). Most programs use these mouse cursors and the key idea is to replace the standard cursor font with an enlarged version. <sect>About this document <p> The motivation for this MINIHOWTO was a visually impaired co-student who asked me how to enlarge the mouse cursor under X. After I found out how this can be done, I wrote an initial version of this document. The knowledge about the method described here does not seem to be common, so I decided to share it and submitted this document as a Linux MINIHOWTO, despite the fact that it is <em/not specific to Linux at all/. As all other MINIHOWTOs it can be found in the home of of the <url name="Linux Documentation Project (LDP)" url="http://sunsite.unc.edu/LDP/HOWTO/">. The <url name=master url="http://i11www.ira.uka.de/˜schneid/X11-big-cursor/master/"> of this document is maintained in the SGML/linuxdoc format. This makes it possible to automatically provide versions in the following formats (which can be found in the same place as the master): html, text, LaTeX, DVI, PostScript, GNU info. <url name="Shinobu Miyata" url="mailto:shinobu@emichan.rim.or.jp"> has done a Japanese translation of this MINIHOWTO. It can be found in <url url="http://i11www.ira.uka.de/˜schneid/jp/X11-big-cursor/">. <sect>How to do it<label id=howto> <p> Follow the steps detailed below. If you don't want to get and compile the bdfresize package yourself, you can skip to step 3 and download a magnified font instead of creating it. <enum> <item> get cursor.bdf, the source of the cursor font, from some X distribution, e. g. from <url url="ftp://ftp.x.org/pub/R6.3/xc/fonts/bdf/misc/cursor.bdf"> (if you don't find it there try an archie search or get it from <url name="my copy" url="http://i11www.ira.uka.de/˜schneid/X11-big-cursor/cursor.bdf">). <item> get, compile and install the bdfresize package from <url url="ftp://ftp.cs.titech.ac.jp/X11/contrib/Local/bdfresize-1.4.tar.Z"> (or from <url name="my copy" url="http://i11www.ira.uka.de/˜schneid/X11-big-cursor/bdfresize-1.4.tar.gz">): <verb> zcat bdfresize-1.4.tar.Z | tar xf - cd bdfresize-1.4 xmkmf make </verb> On Linux you probably have to use: <verb> make CCOPTIONS='-include /usr/include/bsd/bsd.h' clean all </verb> <item> create a directory and install a magnified cursor font in it (magnification factor 2 in this example): <verb> mkdir $HOME/fonts bdfresize -f 2 cursor.bdf | bdftopcf >$HOME/fonts/cursor2.pcf mkfontdir $HOME/fonts </verb> I have prepared some <url name="cursor fonts" url="http://i11www.ira.uka.de/˜schneid/X11-big-cursor/fonts/"> with the following magnification factors: 1.5, 2, 2.5, 3, 4, 5, 6, 7, 8 and 16. You can download one of them an copy it to <tt>$HOME/fonts</tt> if you don't want to use bdfresize. <item> modify your <TT>.xinitrc</TT> or <TT>.xsession</TT> file: before any X client (that uses cursors) is started the following commands must be executed: <verb> xset +fp $HOME/fonts xsetroot -cursor_name X_cursor </verb> <item> leave your X session and restart. </enum> That's it—now all mouse cursors should have doubled in size. <sect>Notes and limitations<label id=notes> <p> <itemize> <item> X servers may have a limit for the maximum cursor size, especially if they use a hardware implementation for the mouse cursor. Others do not have such a limit. E. g. XF86_S3 3.3 works even with a 512x512 mouse cursor (rather slowly). <item> The magnified cursor font must have the same name as the original font (the <em/font name/ must be <TT>cursor</TT>, <em/file name/ does not matter)—that is no problem as <TT>bdfresize</TT> does not change the font name. <item> The directory with the new cursor font must be placed before the directory with the standard cursor font in the the font path—this is accomplished with <TT>xset +fp</TT> (as opposed to <TT>xset fp+</TT>). <item> Changes in <tt>$HOME/fonts/</tt> will be visible only after the command <TT>mkfontdir $HOME/fonts; xset fp rehash</TT> and only in newly started X clients (more exactly: for newly created cursors). <item> <TT>xset +fp path</TT> may not work on a X-Terminal. In this case a font server (see the section <ref id=fontserver name="How to use a fontserver">) can be used if supported by the X-Terminal or some other method to install the font on the X-Terminal (this can generally only be done by your system administrator). <item> The same approach can be used for <TT>olcursor</TT> and <tt>decw$cursor</tt> fonts and any other cursor font you may encounter. <item> Cursor fonts produced by bdfresize don't look smooth, especially at larger magnification factors. It would be nice if someone could create better looking handcrafted version at some common sizes. </itemize> <sect>Technical discussion<label id=tech> <p>Is it possible to write a X program that enlarges cursors automatically? <descrip> <tag/(Partial) solution 1/ Use the XTestCompareCursor from the XTEST extension. For all windows that the mouse pointer enters compare the cursor of this window with a set of `known' cursors (e. g. from the cursor font). If the cursor is found, replace it with an enlarged version, otherwise either leave it alone or substitute a standard cursor. This will only work where the XTest extension is available. <tag/Solution 2/ Write a proxy X server that relays all client requests unchanged to the real X server, except that it intercepts all requests corresponing to the <TT>XCreate*Cursor</TT> Xlib functions. <TT>XCreate*Cursor</TT> requests should be modified to use an enlarged cursor. This proxy server simulates a new display, e. g. <tt/:1/. All clients that connect to this display (e. g. <tt/xterm -display :1/) are displayed on the real server (normally <tt/:0/) and their mouse cursors are enlarged automatically. The mouse cursors of clients that connect to <tt/:0/ will remain <em/unchanged/. </descrip> <sect>Other ideas how to make the mouse cursor more visible<label id=ideas> <p>Here are some ideas for rather simple X programs that might make mouse cursors easier to track. <itemize> <item> When a hot key is pressed display something (big cursor, small window, shaped window) at pointer position for 0.5s. <item> use XRecolorCursor to change the mouse cursor color every 0.1s </itemize> A more demanding project would be <bf/mouse trails/ à la windoze, i. e. when the mouse is moved and the mouse cursor needs to be drawn in a different position, then the old mouse cursor does not disappear at once, but after a short delay. Mouse trails would be probably best implemented in a X server, but it might be feasible to do it as a X client, or better as a proxy server (see section <ref id="tech" name="Technical discussion"> for details). <sect>Related info<label id=info> <sect1>How to use a font server<label id=fontserver> <p>A font server is a net service that provides a set of X11 fonts with a simple protocol. It can be queried which fonts it provides and will supply the font bitmap data on request. You might want to use a font server to provide the X server with a modified cursor font, instead of telling it where to find the font on the file system. This method is especially handy if you use several machines that don't share a common file system or if you use X terminals that support the font server protocol. A font server program and associated tools comes with the X11R5+ distribution (AFAIK). <sect2>Setting up a font server<label id=fsconfig> <p>Read the manual pages <em>fs(1)</em>, <em>fslsfonts(1)</em> (or <em>xfs(1)</em>, <em>xfslsfonts(1)</em> under X11R6) and try it—it isn't hard. Say, you are running the server on host <TT>some.host.edu</TT> on port 7100. You can test the setup with the command <TT>fslsfonts -server some.host.edu:7100</TT> To actually use the server issue the command <TT>xset +fp tcp/some.host.edu:7100</TT> which should return without an error message. <sect1>How to get the bdf source for some font<label id=getbdf> <p>If you have set up a font server simply use <TT>fstobdf</TT> which comes with the font server. Alternatively you may try <TT>getbdf</TT> which can dump any installed X11 font to a bdf file. </article> <!-- LocalWords: MINIHOWTO rg url mailto joerg schneider ira uka de LCD xfd --> <!-- LocalWords: fn co SGML linuxdoc html DVI PostScript bdf bdfresize mkdir --> <!-- LocalWords: bdftopcf pcf mkfontdir xset fp xsetroot olcursor decw XTest --> <!-- LocalWords: XCreate Xlib XRecolorCursor windoze AFAIK fs xfs edu archie --> <!-- LocalWords: fslsfonts xfslsfonts tcp fstobdf getbdf zcat xf cd xmkmf usr --> <!-- LocalWords: CCOPTIONS bsd -->