SDL_ph_mouse.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_ph_mouse.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include "SDL_error.h"
  26. #include "SDL_mouse.h"
  27. #include "SDL_events_c.h"
  28. #include "SDL_cursor_c.h"
  29. #include "SDL_ph_mouse_c.h"
  30. struct  WMcursor {
  31.     PhCursorDef_t *ph_cursor ;
  32. };
  33. void ph_FreeWMCursor(_THIS, WMcursor *cursor)
  34. {
  35.     if (window != NULL)
  36.     {
  37.         SDL_Lock_EventThread();
  38.         if (PtSetResource( window, Pt_ARG_CURSOR_TYPE, Ph_CURSOR_INHERIT, 0 ) < 0)
  39.         {
  40.             /* TODO: output error msg */
  41.         }
  42.         SDL_Unlock_EventThread();
  43.     }
  44.     /* free(cursor->ph_cursor.images); */
  45.     free(cursor);
  46. }
  47. WMcursor *ph_CreateWMCursor(_THIS,
  48. Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
  49. {
  50. WMcursor* cursor;
  51. int clen, i;
  52. unsigned char bit, databit, maskbit;
  53. /* Allocate and initialize the cursor memory */
  54. if ((cursor = (WMcursor*)malloc(sizeof(WMcursor))) == NULL)
  55. {
  56.         SDL_OutOfMemory();
  57.         return(NULL);
  58. }
  59. memset(cursor,0,sizeof(WMcursor));
  60. cursor->ph_cursor = (PhCursorDef_t *) malloc(sizeof(PhCursorDef_t) + 32*4*2);
  61. if(cursor->ph_cursor == NULL)
  62.    printf("cursor malloc failedn");
  63. memset(cursor->ph_cursor,0,(sizeof(PhCursorDef_t) + 32*4*2));
  64. cursor->ph_cursor->hdr.type =Ph_RDATA_CURSOR;   
  65. cursor->ph_cursor->size1.x = (short)w;
  66. cursor->ph_cursor->size1.y = (short)h;
  67. cursor->ph_cursor->offset1.x = (short)hot_x;
  68. cursor->ph_cursor->offset1.y = (short)hot_y;
  69. cursor->ph_cursor->bytesperline1 = (char)w/8;
  70. cursor->ph_cursor->color1 = Pg_WHITE;
  71. cursor->ph_cursor->size2.x = (short)w;
  72.         cursor->ph_cursor->size2.y = (short)h;
  73.         cursor->ph_cursor->offset2.x = (short)hot_x;
  74.         cursor->ph_cursor->offset2.y = (short)hot_y;
  75.         cursor->ph_cursor->bytesperline2 = (char)w/8;
  76.         cursor->ph_cursor->color2 = Pg_BLACK;
  77. clen = (w/8)*h;
  78. /* Copy the mask and the data to different 
  79.    bitmap planes */
  80. for ( i=0; i<clen; ++i )
  81. {
  82. for ( bit = 0; bit < 8; bit++ )
  83. {
  84. databit = data[i] & (1 << bit);
  85. maskbit = mask[i] & (1 << bit);
  86. cursor->ph_cursor->images[i] |= 
  87. (databit == 0) ? maskbit : 0;
  88. /* If the databit != 0, treat it as a black pixel and
  89.  * ignore the maskbit (can't do an inverted color) */
  90. cursor->ph_cursor->images[i+clen] |= databit;
  91. }
  92. }
  93.         /* #bytes following the hdr struct */
  94. cursor->ph_cursor->hdr.len =sizeof(PhCursorDef_t) + clen*2 - sizeof(PhRegionDataHdr_t); 
  95. return (cursor);
  96. }
  97. PhCursorDef_t ph_GetWMPhCursor(WMcursor *cursor)
  98. {
  99.     return(*cursor->ph_cursor);
  100. }
  101. int ph_ShowWMCursor(_THIS, WMcursor *cursor)
  102. {
  103. PtArg_t args[3];
  104. int nargs = 0;
  105. short cursor_is_defined = 0;
  106. /* Don't do anything if the display is gone */
  107.   if ( window == NULL ) {
  108.       return(0);
  109.   }
  110. /* Set the photon cursor cursor, or blank if cursor is NULL */
  111. if ( window ) {
  112. if ( cursor != NULL ) {
  113. PtSetArg( &args[0], Pt_ARG_CURSOR_TYPE, Ph_CURSOR_BITMAP, 0 );
  114. /* Could set next to any PgColor_t value */
  115. PtSetArg( &args[1], Pt_ARG_CURSOR_COLOR,Ph_CURSOR_DEFAULT_COLOR , 0 );
  116. PtSetArg( &args[2], Pt_ARG_BITMAP_CURSOR, cursor->ph_cursor, (cursor->ph_cursor->hdr.len + sizeof(PhRegionDataHdr_t)) );
  117. nargs = 3;
  118. cursor_is_defined = 1;
  119. }
  120. else /* Ph_CURSOR_NONE */
  121. {
  122. PtSetArg( &args[0], Pt_ARG_CURSOR_TYPE,Ph_CURSOR_NONE, 0);
  123. nargs = 1;
  124. cursor_is_defined = 1;
  125. }
  126. if (cursor_is_defined)
  127. {
  128.                      SDL_Lock_EventThread();
  129. if (PtSetResources( window, nargs, args ) < 0 )
  130. {
  131.     return(0);
  132. }
  133. SDL_Unlock_EventThread();
  134. }
  135. else
  136. return(0);
  137. }
  138. return(1);
  139. }
  140. void ph_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
  141. {
  142.     short abs_x, abs_y;
  143.     SDL_Lock_EventThread();
  144.     PtGetAbsPosition( window, &abs_x, &abs_y );
  145.     PhMoveCursorAbs( PhInputGroup(NULL), x + abs_x, y + abs_y );
  146.     SDL_Unlock_EventThread();
  147. }
  148. void ph_CheckMouseMode(_THIS)
  149. {
  150.     /* If the mouse is hidden and input is grabbed, we use relative mode */
  151.     if ( !(SDL_cursorstate & CURSOR_VISIBLE) && (this->input_grab != SDL_GRAB_OFF))
  152.     {
  153.         mouse_relative = 1;
  154.     }
  155.     else
  156.     {
  157.         mouse_relative = 0;
  158.     }
  159. }