Home | History | Annotate | Download | only in bwindow
      1 /*
      2     SDL - Simple DirectMedia Layer
      3     Copyright (C) 1997-2012 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 #include <AppKit.h>
     25 #include <GameKit.h>
     26 
     27 #include "SDL_BWin.h"
     28 
     29 extern "C" {
     30 #include "../SDL_cursor_c.h"
     31 #include "SDL_sysmouse_c.h"
     32 
     33 /* Convert bits to padded bytes */
     34 #define PADDED_BITS(bits)  ((bits+7)/8)
     35 
     36 /* The implementation dependent data for the window manager cursor */
     37 struct WMcursor {
     38 	char *bits;
     39 };
     40 
     41 /* Can this be done in the BeOS? */
     42 WMcursor *BE_CreateWMCursor(_THIS,
     43 		Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
     44 {
     45 	WMcursor *cursor;
     46 	int allowed_x;
     47 	int allowed_y;
     48 	int run, pad, i;
     49 	char *cptr;
     50 
     51 	allowed_x = 16;	/* BeOS limitation */
     52 	allowed_y = 16;	/* BeOS limitation */
     53 	if ( (w > allowed_x) || (h > allowed_y) ) {
     54 		SDL_SetError("Only cursors of dimension (%dx%d) are allowed",
     55 							allowed_x, allowed_y);
     56 		return(NULL);
     57 	}
     58 
     59 	/* Allocate the cursor */
     60 	cursor = (WMcursor *)SDL_malloc(sizeof(WMcursor));
     61 	if ( cursor == NULL ) {
     62 		SDL_OutOfMemory();
     63 		return(NULL);
     64 	}
     65 	cursor->bits = (char *)SDL_malloc(4+2*((allowed_x/8)*allowed_y));
     66 	if ( cursor->bits == NULL ) {
     67 		SDL_free(cursor);
     68 		SDL_OutOfMemory();
     69 		return(NULL);
     70 	}
     71 	cursor->bits[0] = allowed_y;		/* Size of the cursor */
     72 	cursor->bits[1] = 1;			/* Bit depth of cursor */
     73 	cursor->bits[2] = hot_y;
     74 	cursor->bits[3] = hot_x;
     75 	cptr = &cursor->bits[4];
     76 
     77 	/* Pad out to the normal cursor size */
     78 	run = PADDED_BITS(w);
     79 	pad = PADDED_BITS(allowed_x)-run;
     80 	for ( i=0; i<h; ++i ) {
     81 		SDL_memcpy(cptr, data, run);
     82 		SDL_memset(cptr+run, 0, pad);
     83 		data += run;
     84 		cptr += (run+pad);
     85 	}
     86 	for ( ; i<allowed_y; ++i ) {
     87 		SDL_memset(cptr, 0, run+pad);
     88 		cptr += (run+pad);
     89 	}
     90 	for ( i=0; i<h; ++i ) {
     91 		/* FIXME: The mask should be OR'd with the data to turn
     92 		   inverted color pixels black, since inverted color pixels
     93 		   aren't supported under BeOS.
     94 		 */
     95 		SDL_memcpy(cptr, mask, run);
     96 		SDL_memset(cptr+run, 0, pad);
     97 		mask += run;
     98 		cptr += (run+pad);
     99 	}
    100 	for ( ; i<allowed_y; ++i ) {
    101 		SDL_memset(cptr, 0, run+pad);
    102 		cptr += (run+pad);
    103 	}
    104 	return(cursor);
    105 }
    106 
    107 int BE_ShowWMCursor(_THIS, WMcursor *cursor)
    108 {
    109 	if ( be_app->Lock() ) {
    110 		if ( cursor == NULL ) {
    111 			if ( SDL_BlankCursor != NULL ) {
    112 				be_app->SetCursor(SDL_BlankCursor->bits);
    113 			}
    114 		} else {
    115 			be_app->SetCursor(cursor->bits);
    116 		}
    117 		be_app->Unlock();
    118 	}
    119 	return(1);
    120 }
    121 
    122 void BE_FreeWMCursor(_THIS, WMcursor *cursor)
    123 {
    124 	SDL_free(cursor->bits);
    125 	SDL_free(cursor);
    126 }
    127 
    128 /* Implementation by Christian Bauer <cbauer (at) student.physik.uni-mainz.de> */
    129 void BE_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
    130 {
    131 	BPoint pt;
    132 	SDL_Win->GetXYOffset(pt.x, pt.y);
    133 	pt.x += x;
    134 	pt.y += y;
    135 	SDL_Win->Lock();
    136 	SDL_Win->ConvertToScreen(&pt);
    137 	SDL_Win->Unlock();
    138 	set_mouse_position((int32)pt.x, (int32)pt.y);
    139 }
    140 
    141 /* Check to see if we need to enter or leave mouse relative mode */
    142 void BE_CheckMouseMode(_THIS)
    143 {
    144         /* If the mouse is hidden and input is grabbed, we use relative mode */
    145         if ( !(SDL_cursorstate & CURSOR_VISIBLE) &&
    146              (_this->input_grab != SDL_GRAB_OFF) ) {
    147                 mouse_relative = 1;
    148         } else {
    149                 mouse_relative = 0;
    150         }
    151 }
    152 
    153 }; /* Extern C */
    154