Home | History | Annotate | Download | only in maccommon
      1 /*
      2     SDL - Simple DirectMedia Layer
      3     Copyright (C) 1997-2006 Sam Lantinga
      4 
      5     This library is free software; you can redistribute it and/or
      6     modify it under the terms of the GNU Lesser General Public
      7     License as published by the Free Software Foundation; either
      8     version 2.1 of the License, or (at your option) any later version.
      9 
     10     This library is distributed in the hope that it will be useful,
     11     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13     Lesser General Public License for more details.
     14 
     15     You should have received a copy of the GNU Lesser General Public
     16     License along with this library; if not, write to the Free Software
     17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     18 
     19     Sam Lantinga
     20     slouken (at) libsdl.org
     21 */
     22 #include "SDL_config.h"
     23 
     24 #if defined(__APPLE__) && defined(__MACH__)
     25 #include <Carbon/Carbon.h>
     26 #elif TARGET_API_MAC_CARBON && (UNIVERSAL_INTERFACES_VERSION > 0x0335)
     27 #include <Carbon.h>
     28 #else
     29 #include <Quickdraw.h>
     30 #endif
     31 
     32 /* Routines that are not supported by the Carbon API... */
     33 #if !TARGET_API_MAC_CARBON
     34 #include <CursorDevices.h>
     35 #endif
     36 
     37 #include "SDL_mouse.h"
     38 #include "SDL_macmouse_c.h"
     39 
     40 
     41 /* The implementation dependent data for the window manager cursor */
     42 struct WMcursor {
     43 	Cursor curs;
     44 };
     45 
     46 
     47 void Mac_FreeWMCursor(_THIS, WMcursor *cursor)
     48 {
     49 	SDL_free(cursor);
     50 }
     51 
     52 WMcursor *Mac_CreateWMCursor(_THIS,
     53 		Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
     54 {
     55 	WMcursor *cursor;
     56 	int row, bytes;
     57 
     58 	/* Allocate the cursor memory */
     59 	cursor = (WMcursor *)SDL_malloc(sizeof(WMcursor));
     60 	if ( cursor == NULL ) {
     61 		SDL_OutOfMemory();
     62 		return(NULL);
     63 	}
     64 	SDL_memset(cursor, 0, sizeof(*cursor));
     65 
     66     if (w > 16)
     67         w = 16;
     68 
     69     if (h > 16)
     70         h = 16;
     71 
     72 	bytes = (w+7)/8;
     73 
     74 	for ( row=0; row<h; ++row ) {
     75 		SDL_memcpy(&cursor->curs.data[row], data, bytes);
     76 		data += bytes;
     77 	}
     78 	for ( row=0; row<h; ++row ) {
     79 		SDL_memcpy(&cursor->curs.mask[row], mask, bytes);
     80 		mask += bytes;
     81 	}
     82 	cursor->curs.hotSpot.h = hot_x;
     83 	cursor->curs.hotSpot.v = hot_y;
     84 
     85 	/* That was easy. :) */
     86 	return(cursor);
     87 }
     88 
     89 int Mac_cursor_showing = 1;
     90 
     91 int Mac_ShowWMCursor(_THIS, WMcursor *cursor)
     92 {
     93 	if ( cursor == NULL ) {
     94 		if ( Mac_cursor_showing ) {
     95 			HideCursor();
     96 			Mac_cursor_showing = 0;
     97 		}
     98 	} else {
     99 		SetCursor(&cursor->curs);
    100 		if ( ! Mac_cursor_showing ) {
    101 			ShowCursor();
    102 			Mac_cursor_showing = 1;
    103 		}
    104 	}
    105 	return(1);
    106 }
    107 
    108 void Mac_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
    109 {
    110 #if !TARGET_API_MAC_CARBON
    111 	CursorDevice *cursordevice;
    112 
    113 	cursordevice = nil;
    114 	CursorDeviceNextDevice(&cursordevice);
    115 	if ( cursordevice != nil ) {
    116 		WindowPtr saveport;
    117 		Point where;
    118 
    119 		GetPort(&saveport);
    120 		SetPort(SDL_Window);
    121 		where.h = x;
    122 		where.v = y;
    123 		LocalToGlobal(&where);
    124 		SetPort(saveport);
    125 		CursorDeviceMoveTo(cursordevice, where.h, where.v);
    126 	}
    127 #endif /* !TARGET_API_MAC_CARBON */
    128 }
    129 
    130