13e747e6dSmrg/*
2ffd25bcaSmrg *
33e747e6dSmrgCopyright 1989, 1998  The Open Group
43e747e6dSmrg
53e747e6dSmrgPermission to use, copy, modify, distribute, and sell this software and its
63e747e6dSmrgdocumentation for any purpose is hereby granted without fee, provided that
73e747e6dSmrgthe above copyright notice appear in all copies and that both that
83e747e6dSmrgcopyright notice and this permission notice appear in supporting
93e747e6dSmrgdocumentation.
103e747e6dSmrg
113e747e6dSmrgThe above copyright notice and this permission notice shall be included in
123e747e6dSmrgall copies or substantial portions of the Software.
133e747e6dSmrg
143e747e6dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
153e747e6dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
163e747e6dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
173e747e6dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
183e747e6dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
193e747e6dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
203e747e6dSmrg
213e747e6dSmrgExcept as contained in this notice, the name of The Open Group shall not be
223e747e6dSmrgused in advertising or otherwise to promote the sale, use or other dealings
233e747e6dSmrgin this Software without prior written authorization from The Open Group.
243e747e6dSmrg * */
253e747e6dSmrg
263e747e6dSmrg/***********************************************************************
273e747e6dSmrg *
283e747e6dSmrg * cursor creation code
293e747e6dSmrg *
303e747e6dSmrg * 05-Apr-89 Thomas E. LaStrange	File created
313e747e6dSmrg *
323e747e6dSmrg ***********************************************************************/
333e747e6dSmrg
343e747e6dSmrg#include <stdio.h>
353e747e6dSmrg#include "twm.h"
363e747e6dSmrg#include <X11/Xos.h>
373e747e6dSmrg#include "screen.h"
383e747e6dSmrg#include "util.h"
393e747e6dSmrg
40f66df612Smrg/* *INDENT-OFF* */
413e747e6dSmrgstatic struct _CursorName {
42c2535118Smrg    const char		*name;
433e747e6dSmrg    unsigned int	shape;
443e747e6dSmrg    Cursor		cursor;
453e747e6dSmrg} cursor_names[] = {
463e747e6dSmrg
473e747e6dSmrg{"X_cursor",		XC_X_cursor,		None},
483e747e6dSmrg{"arrow",		XC_arrow,		None},
493e747e6dSmrg{"based_arrow_down",	XC_based_arrow_down,    None},
503e747e6dSmrg{"based_arrow_up",	XC_based_arrow_up,      None},
513e747e6dSmrg{"boat",		XC_boat,		None},
523e747e6dSmrg{"bogosity",		XC_bogosity,		None},
533e747e6dSmrg{"bottom_left_corner",	XC_bottom_left_corner,  None},
543e747e6dSmrg{"bottom_right_corner",	XC_bottom_right_corner, None},
553e747e6dSmrg{"bottom_side",		XC_bottom_side,		None},
563e747e6dSmrg{"bottom_tee",		XC_bottom_tee,		None},
573e747e6dSmrg{"box_spiral",		XC_box_spiral,		None},
583e747e6dSmrg{"center_ptr",		XC_center_ptr,		None},
593e747e6dSmrg{"circle",		XC_circle,		None},
603e747e6dSmrg{"clock",		XC_clock,		None},
613e747e6dSmrg{"coffee_mug",		XC_coffee_mug,		None},
623e747e6dSmrg{"cross",		XC_cross,		None},
633e747e6dSmrg{"cross_reverse",	XC_cross_reverse,       None},
643e747e6dSmrg{"crosshair",		XC_crosshair,		None},
653e747e6dSmrg{"diamond_cross",	XC_diamond_cross,       None},
663e747e6dSmrg{"dot",			XC_dot,			None},
673e747e6dSmrg{"dotbox",		XC_dotbox,		None},
683e747e6dSmrg{"double_arrow",	XC_double_arrow,	None},
693e747e6dSmrg{"draft_large",		XC_draft_large,		None},
703e747e6dSmrg{"draft_small",		XC_draft_small,		None},
713e747e6dSmrg{"draped_box",		XC_draped_box,		None},
723e747e6dSmrg{"exchange",		XC_exchange,		None},
733e747e6dSmrg{"fleur",		XC_fleur,		None},
743e747e6dSmrg{"gobbler",		XC_gobbler,		None},
753e747e6dSmrg{"gumby",		XC_gumby,		None},
763e747e6dSmrg{"hand1",		XC_hand1,		None},
773e747e6dSmrg{"hand2",		XC_hand2,		None},
783e747e6dSmrg{"heart",		XC_heart,		None},
793e747e6dSmrg{"icon",		XC_icon,		None},
803e747e6dSmrg{"iron_cross",		XC_iron_cross,		None},
813e747e6dSmrg{"left_ptr",		XC_left_ptr,		None},
823e747e6dSmrg{"left_side",		XC_left_side,		None},
833e747e6dSmrg{"left_tee",		XC_left_tee,		None},
843e747e6dSmrg{"leftbutton",		XC_leftbutton,		None},
853e747e6dSmrg{"ll_angle",		XC_ll_angle,		None},
863e747e6dSmrg{"lr_angle",		XC_lr_angle,		None},
873e747e6dSmrg{"man",			XC_man,			None},
883e747e6dSmrg{"middlebutton",	XC_middlebutton,	None},
893e747e6dSmrg{"mouse",		XC_mouse,		None},
903e747e6dSmrg{"pencil",		XC_pencil,		None},
913e747e6dSmrg{"pirate",		XC_pirate,		None},
923e747e6dSmrg{"plus",		XC_plus,		None},
933e747e6dSmrg{"question_arrow",	XC_question_arrow,	None},
943e747e6dSmrg{"right_ptr",		XC_right_ptr,		None},
953e747e6dSmrg{"right_side",		XC_right_side,		None},
963e747e6dSmrg{"right_tee",		XC_right_tee,		None},
973e747e6dSmrg{"rightbutton",		XC_rightbutton,		None},
983e747e6dSmrg{"rtl_logo",		XC_rtl_logo,		None},
993e747e6dSmrg{"sailboat",		XC_sailboat,		None},
1003e747e6dSmrg{"sb_down_arrow",	XC_sb_down_arrow,       None},
1013e747e6dSmrg{"sb_h_double_arrow",	XC_sb_h_double_arrow,   None},
1023e747e6dSmrg{"sb_left_arrow",	XC_sb_left_arrow,       None},
1033e747e6dSmrg{"sb_right_arrow",	XC_sb_right_arrow,      None},
1043e747e6dSmrg{"sb_up_arrow",		XC_sb_up_arrow,		None},
1053e747e6dSmrg{"sb_v_double_arrow",	XC_sb_v_double_arrow,   None},
1063e747e6dSmrg{"shuttle",		XC_shuttle,		None},
1073e747e6dSmrg{"sizing",		XC_sizing,		None},
1083e747e6dSmrg{"spider",		XC_spider,		None},
1093e747e6dSmrg{"spraycan",		XC_spraycan,		None},
1103e747e6dSmrg{"star",		XC_star,		None},
1113e747e6dSmrg{"target",		XC_target,		None},
1123e747e6dSmrg{"tcross",		XC_tcross,		None},
1133e747e6dSmrg{"top_left_arrow",	XC_top_left_arrow,      None},
1143e747e6dSmrg{"top_left_corner",	XC_top_left_corner,	None},
1153e747e6dSmrg{"top_right_corner",	XC_top_right_corner,    None},
1163e747e6dSmrg{"top_side",		XC_top_side,		None},
1173e747e6dSmrg{"top_tee",		XC_top_tee,		None},
1183e747e6dSmrg{"trek",		XC_trek,		None},
1193e747e6dSmrg{"ul_angle",		XC_ul_angle,		None},
1203e747e6dSmrg{"umbrella",		XC_umbrella,		None},
1213e747e6dSmrg{"ur_angle",		XC_ur_angle,		None},
1223e747e6dSmrg{"watch",		XC_watch,		None},
1233e747e6dSmrg{"xterm",		XC_xterm,		None},
1243e747e6dSmrg};
125f66df612Smrg/* *INDENT-ON* */
1263e747e6dSmrg
127ffd25bcaSmrgvoid
128f66df612SmrgNewFontCursor(Cursor *cp, const char *str)
1293e747e6dSmrg{
1303e747e6dSmrg    int i;
1313e747e6dSmrg
132f66df612Smrg    for (i = 0; (size_t) i < sizeof(cursor_names) / sizeof(struct _CursorName);
133f66df612Smrg         i++) {
134f66df612Smrg        if (strcmp(str, cursor_names[i].name) == 0) {
135f66df612Smrg            if (cursor_names[i].cursor == None)
136f66df612Smrg                cursor_names[i].cursor =
137f66df612Smrg                    XCreateFontCursor(dpy, cursor_names[i].shape);
138f66df612Smrg            *cp = cursor_names[i].cursor;
139f66df612Smrg            return;
140f66df612Smrg        }
1413e747e6dSmrg    }
142f66df612Smrg    twmWarning("unable to find font cursor \"%s\"", str);
1433e747e6dSmrg}
1443e747e6dSmrg
1453e747e6dSmrgvoid
1463e747e6dSmrgNewBitmapCursor(Cursor *cp, char *source, char *mask)
1473e747e6dSmrg{
1483e747e6dSmrg    int hotx, hoty;
1493e747e6dSmrg    int sx, sy, mx, my;
1503e747e6dSmrg    unsigned int sw, sh, mw, mh;
1513e747e6dSmrg    Pixmap spm, mpm;
1526d8e82c3Smrg    unsigned udummy = 0;
1536d8e82c3Smrg    Window wdummy = None;
1543e747e6dSmrg
1553e747e6dSmrg    spm = GetBitmap(source);
156f66df612Smrg    if ((hotx = HotX) < 0)
157f66df612Smrg        hotx = 0;
158f66df612Smrg    if ((hoty = HotY) < 0)
159f66df612Smrg        hoty = 0;
1603e747e6dSmrg    mpm = GetBitmap(mask);
1613e747e6dSmrg
1623e747e6dSmrg    /* make sure they are the same size */
1633e747e6dSmrg
1646d8e82c3Smrg    XGetGeometry(dpy, spm, &wdummy, &sx, &sy, &sw, &sh, &udummy, &udummy);
1656d8e82c3Smrg    XGetGeometry(dpy, mpm, &wdummy, &mx, &my, &mw, &mh, &udummy, &udummy);
166f66df612Smrg    if (sw != mw || sh != mh) {
167f66df612Smrg        twmWarning("cursor bitmaps \"%s\" and \"%s\" not the same size\n",
168f66df612Smrg                   source, mask);
169f66df612Smrg        return;
1703e747e6dSmrg    }
1713e747e6dSmrg    *cp = XCreatePixmapCursor(dpy, spm, mpm, &Scr->PointerForeground,
172f66df612Smrg                              &Scr->PointerBackground,
173f66df612Smrg                              (unsigned) hotx, (unsigned) hoty);
1743e747e6dSmrg}
175