cursor.c revision f66df612
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; 1523e747e6dSmrg 1533e747e6dSmrg spm = GetBitmap(source); 154f66df612Smrg if ((hotx = HotX) < 0) 155f66df612Smrg hotx = 0; 156f66df612Smrg if ((hoty = HotY) < 0) 157f66df612Smrg hoty = 0; 1583e747e6dSmrg mpm = GetBitmap(mask); 1593e747e6dSmrg 1603e747e6dSmrg /* make sure they are the same size */ 1613e747e6dSmrg 162f66df612Smrg XGetGeometry(dpy, spm, &JunkRoot, &sx, &sy, &sw, &sh, &JunkBW, &JunkDepth); 163f66df612Smrg XGetGeometry(dpy, mpm, &JunkRoot, &mx, &my, &mw, &mh, &JunkBW, &JunkDepth); 164f66df612Smrg if (sw != mw || sh != mh) { 165f66df612Smrg twmWarning("cursor bitmaps \"%s\" and \"%s\" not the same size\n", 166f66df612Smrg source, mask); 167f66df612Smrg return; 1683e747e6dSmrg } 1693e747e6dSmrg *cp = XCreatePixmapCursor(dpy, spm, mpm, &Scr->PointerForeground, 170f66df612Smrg &Scr->PointerBackground, 171f66df612Smrg (unsigned) hotx, (unsigned) hoty); 1723e747e6dSmrg} 173