src/video/bwindow/SDL_sysmouse.cc

/* [<][>][^][v][top]
[bottom][index][help] */

FUNCTIONS

This source file includes following functions.

   1 /*
   2     SDL - Simple DirectMedia Layer
   3     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
   4 
   5     This library is free software; you can redistribute it and/or
   6     modify it under the terms of the GNU Library General Public
   7     License as published by the Free Software Foundation; either
   8     version 2 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     Library General Public License for more details.
  14 
  15     You should have received a copy of the GNU Library General Public
  16     License along with this library; if not, write to the Free
  17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18 
  19     Sam Lantinga
  20     slouken@devolution.com
  21 */
  22 
  23 #ifdef SAVE_RCSID
  24 static char rcsid =
  25  "@(#) $Id: SDL_sysmouse.cc,v 1.3.2.4 2001/02/10 07:20:05 hercules Exp $";
  26 #endif
  27 
  28 #include <stdlib.h>
  29 #include <string.h>
  30 
  31 #include <AppKit.h>
  32 #include <GameKit.h>
  33 
  34 #include "SDL_error.h"
  35 #include "SDL_BWin.h"
  36 
  37 extern "C" {
  38 
  39 #include "SDL_sysmouse_c.h"
  40 
  41 /* Convert bits to padded bytes */
  42 #define PADDED_BITS(bits)  ((bits+7)/8)
  43 
  44 /* The implementation dependent data for the window manager cursor */
  45 struct WMcursor {
  46         char *bits;
  47 };
  48 
  49 /* Can this be done in the BeOS? */
  50 WMcursor *BE_CreateWMCursor(_THIS,
  51                 Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
  52 {
  53         WMcursor *cursor;
  54         int allowed_x;
  55         int allowed_y;
  56         int run, pad, i;
  57         char *cptr;
  58 
  59         allowed_x = 16; /* BeOS limitation */
  60         allowed_y = 16; /* BeOS limitation */
  61         if ( (w > allowed_x) || (h > allowed_y) ) {
  62                 SDL_SetError("Only cursors of dimension (%dx%d) are allowed",
  63                                                         allowed_x, allowed_y);
  64                 return(NULL);
  65         }
  66 
  67         /* Allocate the cursor */
  68         cursor = (WMcursor *)malloc(sizeof(WMcursor));
  69         if ( cursor == NULL ) {
  70                 SDL_OutOfMemory();
  71                 return(NULL);
  72         }
  73         cursor->bits = (char *)malloc(4+2*((allowed_x/8)*allowed_y));
  74         if ( cursor->bits == NULL ) {
  75                 free(cursor);
  76                 SDL_OutOfMemory();
  77                 return(NULL);
  78         }
  79         cursor->bits[0] = allowed_y;            /* Size of the cursor */
  80         cursor->bits[1] = 1;                    /* Bit depth of cursor */
  81         cursor->bits[2] = hot_y;
  82         cursor->bits[3] = hot_x;
  83         cptr = &cursor->bits[4];
  84 
  85         /* Pad out to the normal cursor size */
  86         run = PADDED_BITS(w);
  87         pad = PADDED_BITS(allowed_x)-run;
  88         for ( i=0; i<h; ++i ) {
  89                 memcpy(cptr, data, run);
  90                 memset(cptr+run, 0, pad);
  91                 data += run;
  92                 cptr += (run+pad);
  93         }
  94         for ( ; i<allowed_y; ++i ) {
  95                 memset(cptr, 0, run+pad);
  96                 cptr += (run+pad);
  97         }
  98         for ( i=0; i<h; ++i ) {
  99                 /* FIXME: The mask should be OR'd with the data to turn 
 100                    inverted color pixels black, since inverted color pixels
 101                    aren't supported under BeOS.
 102                  */
 103                 memcpy(cptr, mask, run);
 104                 memset(cptr+run, 0, pad);
 105                 mask += run;
 106                 cptr += (run+pad);
 107         }
 108         for ( ; i<allowed_y; ++i ) {
 109                 memset(cptr, 0, run+pad);
 110                 cptr += (run+pad);
 111         }
 112         return(cursor);
 113 }
 114 
 115 int BE_ShowWMCursor(_THIS, WMcursor *cursor)
 116 {
 117         if ( be_app->Lock() ) {
 118                 if ( cursor == NULL ) {
 119                         if ( SDL_BlankCursor != NULL ) {
 120                                 be_app->SetCursor(SDL_BlankCursor->bits);
 121                         }
 122                 } else {
 123                         be_app->SetCursor(cursor->bits);
 124                 }
 125                 be_app->Unlock();
 126         }
 127         return(1);
 128 }
 129 
 130 void BE_FreeWMCursor(_THIS, WMcursor *cursor)
 131 {
 132         free(cursor->bits);
 133         free(cursor);
 134 }
 135 
 136 /* Implementation by Christian Bauer <cbauer@student.physik.uni-mainz.de> */
 137 void BE_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
 138 {
 139         BPoint pt(x, y);
 140         SDL_Win->Lock();
 141         SDL_Win->ConvertToScreen(&pt);
 142         SDL_Win->Unlock();
 143         set_mouse_position((int32)pt.x, (int32)pt.y);
 144 }
 145 
 146 }; /* Extern C */

/* [<][>][^][v][top][bottom][index][help] */